首页 文章

限制团结正交相机平移运动

提问于
浏览
2

我有一个脚本,通过使用鼠标中键控制Unity中的正交相机平移运动 . 世界中心(0,0,0)的空GameObject(例如名称为MainCamPivot(请参见图片))充当摄像机的父级 . 相机本身具有Vector3的局部欧拉角(45f,225f,0f) . 我可以使用此脚本(连接到相机)在X和Y轴上很好地平移/移动相机:

public float panSpeed = 0.05f;

private Vector3 lastMousePos;

void Start ()
{
    lastCamPos = transform.position;
}

void Update()
{
   if(Input.GetMouseButtonDown(2))
   {
      lastMousePos = Input.mousePosition;
   }
   if(Input.GetMouseButton(2))
   {
      Vector3 touchDeltaPosition = Input.mousePosition - lastMousePos;
      transform.Translate(-touchDeltaPosition.x * panSpeed, -touchDeltaPosition.y * panSpeed, 0);
      lastMousePos = Input.mousePosition;
   }

   // To limit the orthographic camera panning movement:
   if(transform.localPosition.x < 10f) transform.localPosition = new Vector3(10f, transform.localPosition.y, 16.3f);
   if(transform.localPosition.x > 23f) transform.localPosition = new Vector3(23f, transform.localPosition.y, 16.3f);
   if(transform.localPosition.y < 15f) transform.localPosition = new Vector3(transform.localPosition.x, 15f, 16.3f);
   if(transform.localPosition.y > 28f) transform.localPosition = new Vector3(transform.localPosition.x, 28f, 16.3f);
}

为了限制摄像机的平移运动,我为摄像机的X和Y位置设置了一些限制 . 问题是摄像机的Z位置值总是在变化,因此为摄像机的Z位置设置固定位置将使摄像机对角平移/对角移动,如下图所示:

Wrong camera movement

使用脚本编写正确限制正交摄像机平移运动的最佳方法是什么? (如下图)

Camera panning movement should follow mouse movement

1 回答

  • 0

    如何而不是使用枢轴,在玩家按住按钮时根据鼠标位置的差异设置摄像机的位置 . 您在上面尝试做的是相对于块状物体移动相机 . 相反,您应该相对于自身移动相机 .

    当用户点击按钮并在LateUpdate()中获取鼠标位置,当玩家仍然按住按钮时,调用:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CameraMovement : MonoBehaviour {
    
        private Vector3 InitialClickPosition;
        private bool Pan = false;
        private const int MOUSE_BUTTON = 0;
    
        private void LateUpdate()
        {
            if (Input.GetMouseButtonDown(MOUSE_BUTTON))
            {
                InitialClickPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            }
            else if (Input.GetMouseButton(MOUSE_BUTTON))
            {
                var difference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - Camera.main.transform.position;
                Camera.main.transform.position = InitialClickPosition - difference;
            }
        }
    }
    

    这样可行 .

相关问题