在 Unity 3D 中移动游戏对象的最佳方式

Hal*_*lex 5 unity-game-engine game-physics

我正在学习几个不同的 Unity 教程,每个教程中游戏对象的移动方式都略有不同。

这些方法各自的优缺点是什么,对于第一人称 RPG 来说哪种方法更受青睐?

// Here I use MovePosition function on the rigid body of this component
Rigidbody.MovePosition(m_Rigidbody.position + movement);

//Here I apply force to the rigid body and am able to choose force mode
Rigidbody.AddForce(15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);

// Here I directly change a transforms position value, in this case the cam
Transform.transform.position = playerTransform.position + cameraOffset;
Run Code Online (Sandbox Code Playgroud)

谢谢!!

编辑;

我注意到的一点是,施加的力似乎适用于 memic 轮式车辆,而位置会改变 memic 步行/跑步。

Phe*_*105 3

刚体和速度/物理

我个人唯一使用过刚体系统是在实现我自己的boids(聚集行为)时,因为您需要计算一些单独的向量并将它们全部应用于单元。

   Rigidbody.MovePosition(m_Rigidbody.position + movement);
Run Code Online (Sandbox Code Playgroud)

这会使用物理系统为您计算朝向目标的运动矢量,因此对象的速度和运动仍然会受到阻力、角度阻力等的影响。

我相信这个特定的函数是一个包装器Rigidbody.AddForce

优点:

  • 如果您想要真实的身体反应,那就太好了

缺点:

  • 如果您只想将物体从 A 点移动到 B 点,那么使用起来有点笨拙。

    • 有时,某个地方的错误设置设置得太高(例如:质量 > 10000000)可能会导致行为中出现非常棘手的错误,而要确定和缓解这些错误可能会非常痛苦。

注意:刚体与另一个刚体碰撞时会相互反弹,具体取决于物理设置。

它们也受到重力的影响。基本上,他们试图模仿现实生活中的物体,但有时很难驯服这些物体并让它们完全按照你想要的方式做。

Rigidbody.AddForce上面基本相同,只是你自己计算向量。

例如,要获得指向目标的矢量,您可以这样做

Vector3 target = target.position - myPosition;

Rigidbody.AddForce(target * 15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
Run Code Online (Sandbox Code Playgroud)

如果您不打算在游戏中使用任何主要的物理机制,我建议通过插值对象位置来移动。

因为让事情按照你想要的方式运行要容易得多,当然除非你追求物理现实主义!

插值单位位置

优点:

  • 也许一开始理解起来有点奇怪,但让物体按照你想要的方式移动要简单得多

缺点:

  • 如果您想要对撞击的物体做出真实的反应,您必须自己做很多工作。但有时这比使用物理系统然后尝试更好,正如我之前所说的那样来驯服它。

你可以在《口袋妖怪》游戏中使用该技术,你不会在《口袋妖怪》中停下来等待灰烬停止打滑或撞到墙上并无法控制地向后弹跳。

这个特殊的功能就像传送一样设置物体的位置,但你也可以使用它来将角色平滑地移动到某个位置。我建议查找“补间”以在变量之间平滑插值。

    //change the characters x by + 1 every tick, 
Transform.transform.position.x += 1f;
Run Code Online (Sandbox Code Playgroud)