Intro
主要想探讨的是如何令摄像机随鼠标操作进行旋转和移动,摄像机跟随的脚本官方就有Example。
方案:独立的角度变量
主要的特点是使用独立的角度变量,每次处理鼠标移动操作都会创建一个新的Quaternion用于计算。
先看Demo。
1public class PlayerControls : MonoBehaviour 2{ 3 public GameObject Player; 4 public float Distance; 5 //public float CameraRepositionSpeed; 6 public float MouseMotionScaleLevel; 7 public bool ReverseAxisY; 8 public float PitchMaximum; 9 public float PitchMinimum; 10 private float _CurrentCameraAngleAroundX; 11 private float _CurrentCameraAngleAroundY; 12 private Vector3 _PositionTarget; 13 14 // Use this for initialization 15 void Start() 16 { 17 } 18 19 // Update is called once per frame 20 void Update() 21 { 22 _CurrentCameraAngleAroundX += Input.GetAxis("Mouse Y") * MouseMotionScaleLevel * Time.deltaTime * (ReverseAxisY ? -1 : 1); 23 _CurrentCameraAngleAroundY += Input.GetAxis("Mouse X") * MouseMotionScaleLevel * Time.deltaTime; 24 _CurrentCameraAngleAroundX = Mathf.Clamp(_CurrentCameraAngleAroundX, PitchMinimum, PitchMaximum); 25 _PositionTarget = Player.transform.position + Quaternion.Euler(_CurrentCameraAngleAroundX, _CurrentCameraAngleAroundY, 0) * (-Player.transform.forward * Distance); 26 27 //transform.position = Vector3.Lerp(transform.position, _PositionTarget, Time.deltaTime * CameraRepositionSpeed); 28 transform.position = _PositionTarget; 29 transform.LookAt(Player.transform); 30 } 31}
核心在于_CurrentCameraAngleAroundX和_CurrentCameraAngleAroundY以及Distance,这三个变量共同决定了以玩家Player为原点的极坐标系下摄像机所处的空间位置。
计算坐标时只需要通过Quaternion.Euler来取得旋转四元数,以玩家为原点衍生一条(0,0,-1)的向量并乘上四元数以旋转至Player指向摄像机的方向,最后乘上Distance,即可得到摄像机相对玩家的偏移。
1_PositionTarget = Player.transform.position + 2 Quaternion.Euler(_CurrentCameraAngleAroundX, _CurrentCameraAngleAroundY, 0) * 3 (-Player.transform.forward * Distance);
最后只要将摄像机放置在那个位置,然后LookAt旋转到z轴正方向指向玩家就完事儿了。