需要实现的功能
摄像机缓动跟随角色的效果
相机设置:
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
在向量 a
和 b
之间进行插值。参数 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);
}
}