今天实现的内容:
问题产生的原因
在我们的代码中,摄像机位移使用了SmoothDamp,但是旋转却是直接欧拉角赋值,这导致了摄影机位置还没有调整完,旋转就已经到位了。想象一下这个过程,摄像机的视线中心在旋转时会偏移角色颈椎位置,这就产生了抖动。
// 摄像机游戏对象的移动和旋转
cameraGO.transform.eulerAngles = this.transform.eulerAngles;
通过完全固定摄像机每帧的指向解决问题
通过使用LookAt,在每一帧将摄像机指向到cameraHandle的transform,我们就能解决问题,这是最简单的办法。
// 摄像机游戏对象的移动和旋转
cameraGO.transform.LookAt(cameraHandle.transform);
可能出现的运用RootMotion动画晃动问题
当我们运用上述解决方案以后,可能会出现运用了RootMotion的动画播放时出现晃动的问题,这个问题可能来自两处。
1.Animator的动画更新速率问题,我们的动画机是可以选择何种更新模式的,normal意味着和Update一起更新,根据情况我们选择Animator Physics。
2.该游戏动画Root Motion的信号问题,Root Motion可能会有杂波,我们可以用一些手段平滑掉。以下方案将上一帧的信号与当前帧的信号相加再除以2。
// 更新m_deltaPos为动画机的Root Motion 之所以用累加是因为物理帧和动画帧不一样 在物理帧的最后会将m_deltaPos清零
// 加上上一帧的再除以2.0是为了平滑
m_deltaPos += (m_deltaPos + (Vector3)_deltaPos) / 2.0f;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。