前言
在很多第三人称游戏中,摄像机的方向往往就是人物移动的方向,但是有这样一个操作,就是按住某个按键之后,再移动鼠标,人物不旋转,但摄像机旋转,松开按键之后,摄像机自动回正。
踩坑
昨天在写的时候用到的是Mathf.Lerp方法,由于我只需要Y轴向上的旋转回正,所以代码是这样的:
yRotation = Mathf.Lerp(yRotation,target.eulerAngles.y,lerpSpeed * t);
其中yRotation是这一帧摄像机要旋转的角度,target.eulerAngle.y是当前人物的角度,lerpSpeed是插值速度。
这里就出现了第一个坑,由于yRotation并没有限制在0-360之间,而target.eulerAngle.y是在0-360之间的,所以摄像机在回正的过程中可能会旋转很多圈。
这里还出现了第二个坑,就是在回正过程中,摄像机不会按照摄像机与人物角度之差最小的方向去回正。
上述两个坑都是由于我使用Mathf.Lerp对角度进行插值引起的。
解决方法
这个问题昨天一直没解决,直到今天查看unity官方文档时,我看到了Mathf.LerpAngle这个方法,官方的描述是这样的:
也就是说这个方法会主动将插值方法中的参数限制在0-360之间,于是我把代码改成了这样:
yRotation = Mathf.LerpAngle(yRotation, target.eulerAngles.y, lerpSpeed * t);
首先,摄像机回正过程中,不会再出现旋转很多圈的现象。
其次,回正过程中,摄像机会自动选择摄像机与人物角度之差最小的方向去回正。
感谢
以上内容仅代表当前的个人看法与经验,如有纰漏敬请指出,感谢。
另外如果有想学游戏的小伙伴,可以评论区一起聊聊心得,本人菜鸟一个。