情况如题,在使用unity提供的这个第一人称时,我使用DOMOve和DORote来改变位置和旋转,人物可以顺利移动过去,但是我又开始移动鼠标旋转摄像头时,镜头会忽然跳动一下;发现是摄像机的Rotation又变回了移动前的旋转角度,要解决这个问题需要在移动完人物之后将摄像机的旋转值重新初始化一次,这样就不会出现这种问题了,而初始化的方法,在FirstPersonController这个脚本中就已经给我们写好了,只需要在调用一次就好了。
this.transform.DORotate(p1.Rot, 0.1f).OnComplete(() => { this.transform.GetComponent<UnityStandardAssets.Characters.FirstPerson.FirstPersonController>().InitRotation(); });
这样操作之后发现一个问题,就是发现偶尔会出现移动完之后视角并不是跟预先选好的一样的。但是在inspector面板下看物体的pos和rot的值确实没错,这是因为unity提供的第一人称包括两部分,FPSController和FirstPersonCharacter,我理解为身体和眼睛(也就是摄像机),刚刚我们只是移动了身体而已,我们要实现最准确的视角还需要修改一下FirstPersonCharacter这个物
体的Rot值,所以在刚刚的初始化命令之前再加上一句
this.transform.Find("FirstPersonCharacter").transform.rotation = Quaternion.Euler( Vector3.Lerp(this.transform.Find("FirstPersonCharacter").transform.rotation.eulerAngles,new Vector3( p1ChildX, this.transform.Find("FirstPersonCharacter").transform.rotation.eulerAngles.y, this.transform.Find("FirstPersonCharacter").transform.rotation.eulerAngles.z), 1f) );
这里为了使移动过程看上去更加连贯加上Vector.Lerp.最终代码就是这样了
this.transform.DOMove(Vector3.Zero, 0.1f); this.transform.Find("FirstPersonCharacter").transform.rotation = Quaternion.Euler( Vector3.Lerp(this.transform.Find("FirstPersonCharacter").transform.rotation.eulerAngles,new Vector3( p1ChildX, this.transform.Find("FirstPersonCharacter").transform.rotation.eulerAngles.y, this.transform.Find("FirstPersonCharacter").transform.rotation.eulerAngles.z), 1f) ); this.transform.DORotate(p1.Rot, 0.1f).OnComplete(() => { this.transform.GetComponent<UnityStandardAssets.Characters.FirstPerson.FirstPersonController>().InitRotation(); });