黑魂复刻游戏的摄像机抖动问题——Unity随手记
作者:互联网
前言
之前制作摄像机时,我们曾经想使用SmoothDamp来实现摄像机延迟移动(摄像机博客的链接),但是造成了摄像机旋转时的抖动问题,今天的博客就是为了解决这个问题。
今天实现的内容:
问题产生的原因
在我们的代码中,摄像机位移使用了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;
标签:动画,deltaPos,transform,旋转,摄像机,Unity,黑魂,Motion,复刻 来源: https://blog.51cto.com/u_15154775/2896727