【问题标题】:Rotation third person in direction to camera?向相机方向旋转第三人称?
【发布时间】:2020-08-29 19:57:10
【问题描述】:

我希望我的对象在我旋转相机的同时也朝着相机旋转,这样玩家在行走时总是朝向相机的方向,就像在典型的第三人称游戏中一样。 不幸的是,到目前为止使用的任何方法都会使我旋转物体,稍微落后于相机的旋转。 我一直在寻找一个星期的解决方案,我很绝望。 我发布了我与一个对象的旋转视频。

video of the late rotation

private Rigidbody rb;
public float speed = 1.0f;

void Start()
    {
      rb = GetComponent<Rigidbody>(); 
    }

direction = Camera.main.transform.forward;
direction.y = 0.00f;

private void FixedUpdate ()
{

 Quaternion targetRotation = Quaternion.LookRotation(direction);
Quaternion newRotation = Quaternion.Lerp(rb.transform.rotation, targetRotation, speed * Time.fixedDeltaTime);
rb.MoveRotation(newRotation);
 }  

}

【问题讨论】:

  • 增加speed 变量应该可以解决您的问题,因为延迟是由 Quaternion.Lerp 调用引起的,它可以平滑两个旋转之间的过渡。此外,如果您需要对 Camera 和 Rigidbody 进行相同的旋转,只需将 Rigidbody 放置为 Camera 的子项。
  • 我可以不成比例地增加速度,物体在旋转过程中旋转得更快,但总是迟到。如果我将对象定位为相机中的孩子,需要什么脚本来解决问题?
  • 无脚本,旋转直接继承自父级(本例中为相机)。
  • 但是这样它会一直在前面而不旋转,就像取景器一样。相反,效果将是对象与相机旋转同时旋转。例如在这些游戏中(youtube.com/watch?v=shZ6uPSA7UA

标签: c# unity3d rotation transform quaternions


【解决方案1】:

这是 Quaternion.Lerp 的不恰当用法,因为您没有按比例计算移动距离。目前,您基本上是在告诉它只旋转一小部分到目标旋转的方式。

您应该使用Quaternion.RotateTowards,因为您可以根据deltaTime(或您使用时的fixedDeltaTime)轻松计算角度旋转:

public float speed = 30f; // max rotation speed of 30 degrees per second

// ...

Quaternion newRotation = Quaternion.RotateTowards(rb.transform.rotation, targetRotation, 
        speed * Time.deltaTime);
rb.MoveRotation(newRotation);

重新阅读您的问题后,现在您似乎不想要平稳过渡/lerp。在这种情况下,只需将旋转设置为目标旋转:

rb.MoveRotation(targetRotation);

如果插值过多/不够及时,您可以在Update 中设置刚体的旋转:

private void Update ()
{
    rb.rotation = Quaternion.LookRotation(direction);
}

【讨论】:

  • 现在它以不同的方式转动,我认为更好,但是相机的旋转总是在物体的旋转之前结束(即使我将角度旋转增加了很多)。也许只是在那些游戏中,物体的“前方”总是以另一种方式面向相机的方向
  • @DanielePappalardo 重新观看您的视频后,我看不出它有什么问题,除非您根本不想插值...在这种情况下,为什么不直接使用 rb.MoveRotation(targetRotation); ?我相应地编辑了我的答案
  • 问题在于 Ethan 不与相机同步,尤其是当我快速旋转相机时,相机已经旋转而 Ethan 仍然刚刚开始旋转,而在游戏中它们通常同时旋转同时(就像在同一时间移动的摄影机上的光线投射或孩子)。使用 rb.MoveRotation (targetRotation) 会更快,但如果我快速旋转相机,也会出现同样的问题。我想在物体前面放一个不可见的立方体,相机的儿子,然后在他身上使用 LookAt,但我不知道这是否是一个好的解决方案
  • @DanielePappalardo 那么您甚至不希望刚体在物理更新之间进行插值...只需使用 rb.rotation = Quaternion.LookRotation(direction); 并在 Update 中调用它。
  • 非常感谢。我不想使用更新,因为我读到必须完成的物理更新是固定更新,但实际上它更有效。你认为我会遇到这样的物理问题吗?我发现的另一个解决方案是使用 Quaternion.LerpUnclamped 并为 t 设置一个高数字,你认为它会好吗? ...我唯一不明白的是,如果我在 fixedupdate 中旋转,即使我以 1/3 的速度行走,刚体的速度也会保持在 0.5 左右。在更新中,刚体根据我的速度从 0.0 变为 3。
【解决方案2】:

我认为您不需要任何这些代码。您可以将相机作为角色的子变换放置在层次结构中,并将其对齐,使其位于角色的上方和后方。当他移动时,相机应该会自动跟随。

【讨论】:

  • 但是如果我只依靠子-camera对象的旋转,当我旋转camera的时候会有对象在前面,但是报它不会旋转,就像取景器一样。相反,效果将是对象在相机旋转的同时旋转
猜你喜欢
  • 2021-05-25
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多