Unity——第三人称跟随摄像机的实现

实现一个第三人称跟随的摄像机,如下

那就开始吧!!

1.思路

摄像机具有上下和左右的旋转,也就是沿X轴和Y轴的旋转,不存在Z轴的旋转。
我们设置如下结构:
在这里插入图片描述
FollowCamera控制Y轴旋转,pivot控制X轴旋转,MainCamera不进行旋转。

然后是摄像机跟随,我们在LateUpdate中进行平滑跟随即可。

2.写代码

这里我贴部分关键代码,文章最后附上全部代码。

控制摄像机旋转部分

我们想象一下,左右可以旋转360°,但是上下旋转角度需要进行限制。

		float x = Input.GetAxis("Mouse X");
        float y = Input.GetAxis("Mouse Y");

        m_LookAngle += x * m_TurnSpeed;
        m_TransformRotation = Quaternion.Euler(0f, m_LookAngle, 0f);

        m_TiltAngle -= y * m_TurnSpeed;   
        //沿X旋转角度进行Clamp限制
        m_TiltAngle = Mathf.Clamp(m_TiltAngle, m_XRotateMin, m_XRotateMax);
        m_PivotRotation = Quaternion.Euler(m_TiltAngle, m_PivotEulers.y, m_PivotEulers.z);

        m_PivotTrans.localRotation = m_PivotRotation;
        transform.localRotation = m_TransformRotation;
摄像机跟随部分
		if (Target == null)
        {
            return;
        }
        transform.position = Vector3.Lerp(transform.position, Target.position, Time.deltaTime * m_CamMoveSpeed);
3.代码挂在最顶层FollowCamera上

Unity——第三人称跟随摄像机的实现_第1张图片

4.差不多完成了!

根据自己实际情况调整X轴旋转限制已经其他参数。

这个Camera实际效果其实不算太好,因为没有考虑穿墙等情况,需要拉近摄像机,这个之后再做~

完整代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyFollowCamera : MonoBehaviour
{
    public Transform Target;    //目标

    [SerializeField]private float m_CamMoveSpeed = 1f;
    [Range(0f, 10f)][SerializeField]private float m_TurnSpeed = 1.5f;

    private Transform m_CamTrans;
    private Transform m_PivotTrans;

    private float m_LookAngle;  //左右角  沿Y轴
    private float m_TiltAngle;  //上下角  沿X轴

    private Vector3 m_PivotEulers;
    private Quaternion m_PivotRotation;
    private Quaternion m_TransformRotation;

    [SerializeField]private float m_XRotateMax = 30f;   //沿X轴最大角度
    [SerializeField]private float m_XRotateMin = -60f;   //沿X周最小角度
    [SerializeField]private bool m_LockCursor = false;   //锁定鼠标

    private void Awake()
    {
        RefreshCursor();

        m_CamTrans = GetComponentInChildren().transform;
        m_PivotTrans = m_CamTrans.parent;

        m_PivotEulers = m_PivotTrans.rotation.eulerAngles;
        m_PivotRotation = m_PivotTrans.transform.localRotation;
        m_TransformRotation = transform.localRotation;
    }

    private void Update()
    {
        HandleRotationMovement();

        RefreshCursor();
    }

    private void LateUpdate()
    {
        FollowTarget();
    }

    void FollowTarget()
    {
        if (Target == null)
        {
            return;
        }
        transform.position = Vector3.Lerp(transform.position, Target.position, Time.deltaTime * m_CamMoveSpeed);
    }

    void HandleRotationMovement()
    {
        float x = Input.GetAxis("Mouse X");
        float y = Input.GetAxis("Mouse Y");

        m_LookAngle += x * m_TurnSpeed;
        m_TransformRotation = Quaternion.Euler(0f, m_LookAngle, 0f);

        m_TiltAngle -= y * m_TurnSpeed;   
        //沿X旋转角度进行Clamp限制
        m_TiltAngle = Mathf.Clamp(m_TiltAngle, m_XRotateMin, m_XRotateMax);
        m_PivotRotation = Quaternion.Euler(m_TiltAngle, m_PivotEulers.y, m_PivotEulers.z);

        m_PivotTrans.localRotation = m_PivotRotation;
        transform.localRotation = m_TransformRotation;
    }

    void RefreshCursor()
    {
        Cursor.lockState = m_LockCursor ? CursorLockMode.Locked : CursorLockMode.None;
        Cursor.visible = !m_LockCursor;
    }
}

你可能感兴趣的:(Untiy)