该脚本可以完全正常地正常工作,除非缩放过多并且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的缩放不会超过其当前值。
正如您一直以来所说的前进,碰撞,后退,不再碰撞,前进等。>
您可能宁愿不向后移动,但如果您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);
}