好久没写博客了
事情的起因是我想要实现一种摄像机,要求摄像机能跟随锁定角色移动的同时还能绕角色旋转旋转。类似神界原罪2锁定角色后的摄像机。
先放上最后的实现代码
// 要跟随的目标
public Transform target;
// 摄像机与目标的偏移
public Vector3 offset = new Vector3(0, 5, 10);
// 上一帧的目标位置
public Vector3 targetPrePos = new Vector3();
// 当前帧的目标位置
public Vector3 targetCurrentPos = new Vector3();
void Start()
{
// 摄像机的初始位置
this.transform.position = target.position + offset;
// 将上一帧目标位置设为初始值
targetPrePos = target.position;
}
void Update()
{
// 设置当前目标位置
targetCurrentPos = target.position;
// translate根据物体上一帧到当前帧的位移移动摄像机,而且基于世界坐标系
this.transform.Translate(target.position - targetPrePos, Space.World);
// 将当前帧的位置赋值给上一帧位置的变量,供下一帧使用
targetPrePos = target.position;
}
当初实现的时候,我想的跟随是这样的
void Update()
{
this.transform.position = target.position + offset;
}
然后遇到了什么问题呢,由于我还要能旋转摄像机,而直接在每一帧将位置粗暴的改为target.position + offset会导致摄像机被固定在target.position + offset这一个位置,无法旋转。所以不能直接修改transform.position,而是需要在transform.position的基础上加减Vector3。
我想到了translate函数,貌似就是干这个的。
但是很快我又遇到了问题,摄像机并不和我想得一样跟着目标走,而是乱跑。但是看似乱跑似乎又有点规律。
一开始我以为是target.position - targetPrePos顺序错了要反过来。但是反过来摄像机的运动也不对。
然后我才想到会不会是因为摄像机的运动是基于本地的,而他又要一直盯着目标看,所以本地坐标不行。世界坐标就是我们想要的。网上查了查translate是基于那种坐标运作的,发现translate可以用参数进行坐标轴设置。