1.使用两个Handle控制MainCamera的水平和垂直的旋转,PlayerHandle控制水平旋转,cameraHandle控制垂直旋转,这样我们可以很方便的控制相机。
MainCamera.PNG
2.在代码中我们用玩家输入作为控制的角度
代码语言:javascript复制 public PlayerInput pi;
public float horizontalSpeed = 20.0f;
public float verticalSpeed = 100.0f;
private GameObject playerHandle;
private GameObject cameraHandle;
// Use this for initialization
void Awake () {
cameraHandle = transform.parent.gameObject;
playerHandle = transform.parent.parent.gameObject;
}
// Update is called once per frame
void Update () {
playerHandle.transform.Rotate(Vector3.up, pi.Jright * horizontalSpeed * Time.deltaTime);
cameraHandle.transform.Rotate(Vector3.right, pi.Jup * verticalSpeed * Time.deltaTime);
}
3.限制在X轴旋转的角度 将原来的直接用Rotate旋转改为,用一个变量作为间接值(不能直接限制cameraHandle的euler的x,因为我们在设置其值的时候,会自动将负的值转换为正的),所以我们用一个不受限制的中间量,量的改变用增量的方式来实现。
代码语言:javascript复制 tempEulerX = pi.Jup * -verticalSpeed * Time.deltaTime;
tempEulerX = Mathf.Clamp(tempEulerX, -40.0f, 30.0f);
//这里要用localEulerAngles,否则y不会使用父类的y,而是0,导致playerHandle的旋转控制不了cameraHandle的左右
cameraHandle.transform.localEulerAngles = new Vector3(tempEulerX, 0,0);
4.相机延迟移动 我们使用Vector3中的Static Methods中的SmoothDamp方法,此方法常用于摄像机的移动,在一定时间(deltaTime)后将current的value转换到target的value。
代码语言:javascript复制camera.transform.position = Vector3.SmoothDamp
(camera.transform.position,transform.position, ref cameraDampVelocity, 0.2f);