Unity相机在碰撞中发抖

问题描述 投票:-1回答:1

该脚本可以完全正常地正常工作,除非缩放过多并且SphereCast与网格碰撞。当它碰到网格物体时,我希望相机停下来,而不要尝试通过网格物体。See demonstration here

     if(Input.touchCount == 2){
         Touch first = Input.GetTouch(0);
         Touch second = Input.GetTouch(1);

         origin = mainCamera.transform.position;
         direction = mainCamera.transform.forward;
         RaycastHit hit;
         if(Physics.SphereCast(origin, sphereRadius, direction, out hit, maxDistance)){
             inCollision = true;
         }
         else{
             inCollision = false;
         }

         if(first.phase == TouchPhase.Began || second.phase == TouchPhase.Began){
             initialDistance = Vector3.Distance(first.position, second.position);
         }
         if(first.phase == TouchPhase.Moved || second.phase == TouchPhase.Moved){
             movedDistance = Vector3.Distance(first.position, second.position) - initialDistance;
             if(inCollision){
                 movedDistance = -Mathf.Abs(movedDistance);
             }
             mainCamera.transform.localPosition = new Vector3(0, 0, mainCamera.transform.localPosition.z + movedDistance * zoomSensitivity * Time.deltaTime);
             initialDistance = Vector3.Distance(first.position, second.position);
         }
     }

我试图:当SphereCast击中网格时,将moveDistance设置为0;否则,将其设置为0。将mainCamera.transform.localPosition.z夹在mainCamera.transform.localPosition.z上,但仅在SphereCast命中网格时才可,因此z的缩放不会超过其当前值。

unity3d touch
1个回答
0
投票

正如您一直以来所说的前进,碰撞,后退,不再碰撞,前进等。>


您可能宁愿不向后移动,但如果您would

移动并且在这种情况下完全不移动,请检查您是否[是否碰撞:if(first.phase == TouchPhase.Began || second.phase == TouchPhase.Began) { initialDistance = Vector3.Distance(first.position, second.position); } else if(first.phase == TouchPhase.Moved || second.phase == TouchPhase.Moved) { movedDistance = Vector3.Distance(first.position, second.position) - initialDistance; // Only check until here if you WOULD collide origin = mainCamera.transform.position; var targetPosition = origin + mainCamera.transform.forward * movedDistance * Time.deltaTime * zoomSensitivity; direction = mainCamera.transform.forward; // only move if there is no collision if(!Physics.SphereCast(origin, sphereRadius, direction, out var hit, maxDistance)) { mainCamera.position = targetPosition; } initialDistance = Vector3.Distance(first.position, second.position); }
© www.soinside.com 2019 - 2024. All rights reserved.