围绕物体相机的缩放旋转和第一人称视角的旋转(平滑)

做过很多相机的旋转和缩放 感觉这个挺平滑的

public class CameraMove : MonoBehaviour
{
    public float ratio = 2;//放大缩小速率
    public float min_distance = 5; //相机距物体最小距离
    public float max_distance = 60;//相机距物体最大距离
    private float view_distance; //相机的Field of View 大小
    Transform CenObj;//围绕的物体
    //滑动结束时的瞬时速度
    Vector3 Speed = Vector3.zero;
    //每帧偏差
    Vector3 offSet = Vector3.zero;

    //速率衰减值
    public float decelerationRate = 0.2f;

    private Vector3 Rotion_Transform;

    private Camera cameraObj;
    private float lastTime;
    private void Awake()
    {
        cameraObj = GetComponent<Camera>();
    }
    //设置围绕的物体
    public void SetCenObj(Transform center)
    {
        CenObj = center;
        Rotion_Transform = CenObj.position;
    }

    void Update()
    {
        if (!MouseControl.Instance.isEnter)
        {
            Ctrl_Cam_Move();
            Cam_Ctrl_Rotation();
        }
    }

    //镜头的远离和接近
    public void Ctrl_Cam_Move()
    {   
    //根据fieldOfView设置远近
        if (Input.GetAxis("Mouse ScrollWheel") != 0)
        {
            view_distance = cameraObj.fieldOfView;
            view_distance += Input.GetAxis("Mouse ScrollWheel") * ratio;
            view_distance = Mathf.Clamp(view_distance, min_distance,max_distance);
            cameraObj.fieldOfView = view_distance;
        }
        var mouse_y = Input.GetAxis("Mouse Y");//获取鼠标Y轴移动
        if (Input.GetMouseButton(0) && mouse_y!=0)
        {
            if (mouse_y != 0)
            {
                view_distance = cameraObj.fieldOfView;
                view_distance += mouse_y * ratio;
                view_distance = Mathf.Clamp(view_distance, min_distance, max_distance);
                cameraObj.fieldOfView = view_distance;
            }
        }
    }

    //摄像机的旋转
    public void Cam_Ctrl_Rotation()
    {
        var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
        if (Input.GetMouseButton(0) && mouse_x != 0)
        {
            offSet.x = mouse_x;
            //瞬时速度
            Speed = offSet / (Time.deltaTime * 10);
        }
        else
        {
            Speed *= Mathf.Pow(decelerationRate, Time.deltaTime);
            if (Mathf.Abs(Vector3.Magnitude(Speed)) < 1)
            {
                Speed = Vector3.zero;
            }

        }
        if (Vector3.Magnitude(Speed) == 0)
        {
            return;
        }
        transform.RotateAround(Rotion_Transform, Vector3.up, Speed.x * Time.deltaTime * 2.0f);
    }
}


//第一人称视角旋转
    public void Cam_Ctrl_Rotation()
    {
        //var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
        //var mouse_y = Input.GetAxis("Mouse Y");//获取鼠标X轴移动
        if (Input.GetMouseButton(0))
        {
            mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
            mouse_y = Input.GetAxis("Mouse Y");//获取鼠标X轴移动
            offSet.x = mouse_x;
            offSet.y = mouse_y;
            //瞬时速度
            Speed = offSet / (Time.deltaTime * speed);
        }
        else
        {
            Speed *= Mathf.Pow(decelerationRate, Time.deltaTime);
            if (Mathf.Abs(Vector3.Magnitude(Speed)) < 1)
            {
                Speed = Vector3.zero;
            }
        }
        Move(Speed);
    }
    
    public void Move(Vector3 speed)
    {
        if (Vector3.Magnitude(speed) == 0)
        {
            return;
        }
        speed.z = 0;
        float rotatedAngle = transform.eulerAngles.x + speed.y * Time.deltaTime * 2.0f;
        rotatedAngle = CheckAngle(rotatedAngle);
        //限制上下看到的角度
        if(rotatedAngle < -30)
        {
            transform.localEulerAngles = new Vector3(-30, transform.localEulerAngles.y, 0);
        }
        else if (CheckAngle(rotatedAngle) > 45)
        {
            transform.localEulerAngles = new Vector3(45, transform.localEulerAngles.y, 0);
        }
        else
        {
            transform.RotateAround(transform.position, transform.right, speed.y * Time.deltaTime * 2.0f);
        }
        transform.RotateAround(transform.localPosition, Vector3.up, speed.x * Time.deltaTime * 2.0f);
    }

    public float CheckAngle(float value)
    {
        float angle = value - 180;

        if (angle > 0)
            return angle - 180;

        return angle + 180;
    }

猜你喜欢

转载自blog.csdn.net/weixin_44431724/article/details/106338069