今天,又是充满希望的一天!

UnitySir - 00002_制作一个简陋的第三人称摄像机

Posted on By Zj

需要实现的功能

摄像机缓动跟随角色的效果

相机设置:

Field of View 设置为 30

相机设置角色的子级

Pos = 0 , 5 , -8

Rot = 45 , 0 , 0

最后在将相机设为和角色同级


知识点

public Vector3 TransformDirection (Vector3 direction);

direction 从本地空间变换到世界空间。

该操作不受变换的缩放或位置的影响。 返回的矢量与 direction 的长度相同。

public static Vector3 Lerp (Vector3 a, Vector3 b, float t);

在两个向量之间进行线性插值。

使用插值 t 在向量 ab 之间进行插值。参数 t 限制在 [0, 1] 范围内。

Time.deltaTime

从最后一帧开始的完成时间(以秒为单位)(只读)

此属性提供当前帧和上一帧之间的时间。

public void LookAt (Transform target);

旋转当前对象的变换,使向前矢量(当前对象的Z轴)指向 target 的当前位置。

矢量:既有大小也有方向


完整代码

using UnityEngine;

public class SimpleCamera : MonoBehaviour
{
    [SerializeField] private float camY = -2.5f;
    [SerializeField] private float camZ = -6f;

    private Transform _player; //主角位置
    private float _smoothing = 3; //平滑度
    private Vector3 _offset; //偏移位置

    void Start()
    {
        //获取主角的位置
        _player = GameObject.FindGameObjectWithTag("Player").transform;
        //位置偏移=相机位置-主角位置
        _offset = transform.position - _player.position;
    }

    void LateUpdate()
    {
        //targetPos(相机要移动的目标位置)=主角的位置+偏移
        //(使用TransformDirection方法使相机一直在主角背面)
        Vector3 targetPos = _player.position + _player.TransformDirection(_offset + new Vector3(0, camY, camZ));
        //利用差值运算移动相机到目标位置
        transform.position = Vector3.Lerp(transform.position, targetPos, Time.deltaTime * _smoothing);
        transform.LookAt(_player);
    }
}

参考链接

Unity游戏开发之控制相机跟随主角

Unity官方手册


如果内容对你有所帮助:

UnitySir (bilibili)

B站ID:UnitySir