第三人称相机跟随

学习自罗培羽的《Unity3D 网络游戏实战》

[RequireComponent(typeof(Camera))]
public class ThirdPersonCamera : MonoBehaviour {
    public float distance = 5;
    public Vector2 distaceRange=new Vector2(0,8);
    public float angleXY = 60;
    public Vector2 angleXYRange = new Vector2(0, 90);
    public float angleXZ = 90;
    public float zoomSpeed = 1;
    public float rotSpeed = 10;
    public float rollSpeed = 10;
    private Transform target;

    private void LateUpdate() {
        if (target == null)
            return;

        // 算出相机的位置,并看向目标
        float y = Mathf.Sin(angleXY *Mathf.Deg2Rad) * distance;
        float mapLine = Mathf.Cos(angleXY * Mathf.Deg2Rad) * distance;
        float x = Mathf.Cos(angleXZ * Mathf.Deg2Rad) * mapLine;
        float z = Mathf.Sin(angleXZ * Mathf.Deg2Rad) * mapLine;
        transform.position = target.position+ new Vector3(x, y, z);
        transform.LookAt(target);

        //缩放、旋转
        Zoom();
        if (Input.GetMouseButton(2)) {
            Rot();
            Roll();
        }
    }

    public void SetTarget(Transform target) {
        Transform cameraPos = target.Find("CameraPoint");
        this.target = cameraPos == null ? target : cameraPos;
    }

    private void Zoom() {
        float mouseWheel = Input.GetAxis("Mouse ScrollWheel");
        if (mouseWheel == 0)
            return;
        distance = Mathf.Clamp(distance-zoomSpeed*mouseWheel, distaceRange.x, distaceRange.y);
    }

    private void Rot() {
        float mouseX = Input.GetAxis("Mouse X");
        if (mouseX == 0)
            return;
        angleXZ -= rotSpeed * mouseX;
    }

    private void Roll() {
        float mouseY = Input.GetAxis("Mouse Y");
        if (mouseY == 0)
            return;
        angleXY = Mathf.Clamp(angleXY - rollSpeed * mouseY, angleXYRange.x, angleXYRange.y);
    }
}



猜你喜欢

转载自blog.csdn.net/a673544319/article/details/73385506