团结 – 口吃人物轮换

我正在为我的角色devise控制和相机移动。 我想要做的是让角色头部左右旋转,然后当头部旋转一定量时,整个角色就会旋转。 我已经做了一些,头可以顺利移动,但是当它开始旋转时,它会结结巴巴的。

希望它在这个GIF中可见。

GIF

您可能会看到头部旋转平稳,但是当身体开始旋转时,会出现口吃。

这是LateUpdate中处理所有旋转的代码。

this.current_rotation = Quaternion.Lerp(this.current_rotation, Quaternion.Euler(new Vector3(this.pitch, this.yaw, 0)), this.mouse_sensitivity * Time.deltaTime); this.cam.transform.rotation = this.current_rotation; this.head.transform.rotation = this.current_rotation; if(this.head.transform.localRotation.y > 0.3 || this.head.transform.localRotation.y < -0.3){ Quaternion from = Quaternion.Euler(0, this.player.transform.eulerAngles.y, 0); Quaternion to = Quaternion.Euler(0, this.current_rotation.eulerAngles.y, 0); Quaternion q = Quaternion.Lerp(from, to, this.mouse_sensitivity * Time.deltaTime); this.player.transform.rotation = q; } 

好的,我无法得到在Unity中工作的示例项目,但我使用脚本重新创建了一些假设,如下所示:

  • 您的Camera_Control.cs脚本位于正文立方体上。
  • 头部立方体是身体立方体的孩子。
  • 相机是头部立方体的孩子

我能够用两种方法解决这个问题:

  1. 将头部立方体移离身体,以便旋转身体也不会自动旋转头部。
  2. 或者,当你旋转身体时,反转头部,以抵消效果。

我认为后者是你想要的解决scheme。 所以,我添加了两个新的Quaternions (本质上是颠倒的),它们之间的Lerp ,并将其分配给凸轮/头部变换。

 this.current_rotation = Quaternion.Lerp(this.current_rotation, Quaternion.Euler(new Vector3(this.pitch, this.yaw, 0)), this.mouse_sensitivity * Time.deltaTime); this.cam.transform.rotation = this.current_rotation; this.head.transform.rotation = this.current_rotation; if(this.head.transform.localRotation.y > 0.3 || this.head.transform.localRotation.y < -0.3){ Quaternion from = Quaternion.Euler(0, this.player.transform.eulerAngles.y, 0); Quaternion to = Quaternion.Euler(0, this.current_rotation.eulerAngles.y, 0); // Reverse 'y' rotation, maintain x/z rotation Quaternion headFrom = this.current_rotation; Quaternion headTo = Quaternion.Euler(headFrom.eulerAngles.x, this.player.transform.eulerAngles.y, headFrom.eulerAngles.z); Quaternion q = Quaternion.Lerp(from, to, this.mouse_sensitivity * Time.deltaTime); Quaternion r = Quaternion.Lerp(headFrom, headTo, this.mouse_sensitivity * Time.deltaTime); this.player.transform.rotation = q; this.cam.transform.rotation = r; this.head.transform.rotation = r; } 

这应该解决抖动。 之后你还会做其他轮换工作,但至less会顺利。 🙂

从你的截图看来,这个问题可能来自头部和身体对象的碰撞体。 你直接操纵你的代码中的变换,但是在发生这种情况时,物理引擎也在试图处理两个对撞机之间的碰撞,这将导致不稳定的移动。

如果这是个问题,有很多方法可以避免这个问题,比如改变什么对象有碰撞体,碰撞体是否使用分层来忽略对方。