Unity3D中,鼠标控制相机视角并且跟随玩家的几种方法(第三人称)的学习整理

本文介绍了三种适用于第三人称游戏的相机控制方法:第一种通过鼠标右键和滚轮实现视角移动与缩放;第二种实现自由视角移动但无法调整视角大小;第三种则实现了视角大小的滚轮控制及平滑跟随效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种,  按住鼠标的右键进行移动视角,同时滚轮调正视角大小。

public Transform target;    //相机追随目标
    public float xSpeed = 200;  //X轴方向拖动速度
    public float ySpeed = 200;  //Y轴方向拖动速度
    public float mSpeed = 10;   //放大缩小速度
    public float yMinLimit = -50; //在Y轴最小移动范围
    public float yMaxLimit = 50; //在Y轴最大移动范围
    public float distance = 10;  //相机视角距离
    public float minDinstance = 2; //相机视角最小距离
    public float maxDinstance = 30; //相机视角最大距离
    public float x = 0.0f;
    public float y = 0.0f;
    public float damping = 5.0f;
    public bool needDamping = true;


    
    void Start()
    {
        Vector3 angle = transform.eulerAngles;
        x = angle.y;
        y = angle.x;
    }

    
    void LateUpdate() //处理相机部分
    {
        if (target)
        {
            if (Input.GetMouseButton(1))
            {
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
                y = ClamAngle(y, yMinLimit, yMaxLimit);

            }
            distance -= Input.GetAxis("Mouse ScrollWheel") * mSpeed;
            distance = Mathf.Clamp(distance, minDinstance, maxDinstance);
            Quaternion rotation = Quaternion.Euler(y, x, 0.0f);
            Vector3 disVector = new Vector3(0.0f, 0.0f, -distance);
            Vector3 position = rotation * disVector + target.position;

            if (needDamping)
            {
                transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping);
                transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping);
            }
            else
            {
                transform.rotation = rotation;
                transform.position = position;
            }
        }
    }
    
    static float ClamAngle(float angle, float min, float max)
    {
        if (angle < -360)
        {
            angle += 360;
        }
        if (angle > 360)
        {
            angle -= 360;
        }
        return Mathf.Clamp(angle, min, max);
    }

效果:

 

 


 第二种,  不用按住鼠标即可移动相机视角,但不能用滚轮调整视角大小(代码一般,不建议用)

public GameObject cube;//获取角色,不推荐这个做法,建议测试使用
    Quaternion camaeraXAngle;//获取鼠标X轴偏移量当摄像机旋转角度
    Quaternion camaeraYAngle;//获取鼠标Y轴偏移量当摄像机旋转角度


    void LateUpdate()
    {
        if (Input.GetAxis("Mouse X") > 0.2)//当鼠标X轴偏移量大于0.3时执行,鼠标偏移量过小不执行(玩家也许只是想上下旋转摄像机但是难免会造成X轴偏移,所以当X轴偏移过小时不执行)
        {
            camaeraXAngle = Quaternion.Slerp(camaeraXAngle, Quaternion.Euler(0, Input.GetAxis("Mouse X"), 0), 0.1f);      //平滑设置旋转角度
            transform.rotation *= camaeraXAngle;//旋转
        }
        else if (Input.GetAxis("Mouse X") < -0.2)
        {
            camaeraXAngle = Quaternion.Slerp(camaeraXAngle, Quaternion.Euler(0, Input.GetAxis("Mouse X"), 0), 0.1f);
            transform.rotation *= camaeraXAngle;
        }
        if (Input.GetAxis("Mouse Y") < -0.2 && this.transform.rotation.x > 0.15)
        {
            camaeraYAngle = Quaternion.Slerp(camaeraYAngle, Quaternion.Euler(Input.GetAxis("Mouse Y"), 0, 0), 0.1f);
            transform.rotation *= camaeraYAngle;
        }
        else if (Input.GetAxis("Mouse Y") > 0.2 && this.transform.rotation.x < 0.5)
        {
            camaeraYAngle = Quaternion.Slerp(camaeraYAngle, Quaternion.Euler(Input.GetAxis("Mouse Y"), 0, 0), 0.1f);
            transform.rotation *= camaeraYAngle;
        }
        this.transform.position = (this.transform.rotation * new Vector3(0, 0, -5) + cube.transform.position);//摄像机的位置设置
        this.transform.LookAt(cube.transform);//摄像机看向角色
    }

效果:

 

 


 第三种,  不用鼠标控制移动视角,但可以用滚轮控制视角大小,同时当人物移动时相机会丝滑的移动到角色背后(推荐)

public Transform target;
    public float distanceUp = 10f;//相机与目标的竖直高度参数
    public float distanceAway = 10f;//相机与目标的水平距离参数
    public float smooth = 2f;//位置平滑移动插值参数值
    public float camDepthSmooth = 20f;

    void Update()
    {
        // 鼠标轴控制相机的远近
        if ((Input.mouseScrollDelta.y < 0 && Camera.main.fieldOfView >= 3) || Input.mouseScrollDelta.y > 0 && Camera.main.fieldOfView <= 80)
        {
            Camera.main.fieldOfView += Input.mouseScrollDelta.y * camDepthSmooth * Time.deltaTime;
        }
    }

    void LateUpdate()
    {
        //计算出相机的位置
        Vector3 disPos = target.position + Vector3.up * distanceUp - target.forward * distanceAway;

        transform.position = Vector3.Lerp(transform.position, disPos, Time.deltaTime * smooth);
        //相机的角度
        transform.LookAt(target.position);
    }

效果:

 


这就是我目前整理的三种可用于第三人称游戏的相机控制,希望能帮助到你!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值