在 Unity 3D 中移动游戏对象的最佳方式
Best way to move a game object in Unity 3D
我正在浏览几个不同的 Unity 教程,每个教程中游戏对象的移动方式都略有不同。
这些方法中的每一种 pros/cons 是什么?哪种方法更适合第一人称角色扮演游戏?
// 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;
谢谢!!
编辑;
我注意到的一点是,当位置发生变化时,施加的力似乎是在模因轮式车辆上 walking/running。
Rigidbody.MovePosition(m_Rigidbody.position + movement);
来自文档:
If Rigidbody interpolation is enabled on the Rigidbody, calling Rigidbody.MovePosition results in a smooth transition between the two positions in any intermediate frames rendered. This should be used if you want to continuously move a rigidbody in each FixedUpdate.
https://docs.unity3d.com/ScriptReference/Rigidbody.MovePosition.html
Rigidbody.AddForce(15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
这会使物体加速,所以它不会匀速运动(这是因为牛顿第二定律,力=质量*加速度)。另外,如果你有另一个力朝相反的方向移动,这个力可能会被抵消,物体根本不会移动。
Transform.transform.position = playerTransform.position + cameraOffset;
这将传送对象。没有平滑的过渡,没有与游戏中已有的任何力量互动,只是位置的瞬间变化。
刚体和 Velocities/Physics
我个人唯一一次使用刚体系统是在实现我自己的 boids(集群行为)时,因为您需要计算一些单独的向量并将它们全部应用于单元。
Rigidbody.MovePosition(m_Rigidbody.position + movement);
这会使用物理系统为您计算朝向目标的运动矢量,因此 object 的速度和运动仍然会受到阻力、angular 阻力等的影响。
我相信这个特定函数是 Rigidbody.AddForce
的包装器。
优点:
- 如果您想要逼真的身体反应,那就太好了
缺点:
如果您想要实现的只是将 object 从 A 点移动到 B 点,那么使用起来有点笨拙。
- 有时某个地方的错误设置设置得太高(例如:Mass > 10000000)会导致行为中非常棘手的错误,很难确定和缓解。
注意:刚体与另一个刚体碰撞时会相互反弹,具体取决于物理设置。
它们也受重力影响。基本上,他们试图模仿现实生活中的 objects,但有时很难驯服 objects 并让他们完全按照你的意愿行事。
而Rigidbody.AddForce
和上面基本一样,只是你自己计算向量。
因此,例如,要获得指向目标的向量,您可以这样做
Vector3 target = target.position - myPosition;
Rigidbody.AddForce(target * 15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
如果您不打算在游戏中加入任何主要的物理机制,我建议您通过插入 objects 位置来移动。
因为让事情按照你想要的方式运行要容易得多,当然除非你追求物理现实主义!
内插单位位置
优点:
- 一开始理解起来可能有点奇怪,但让 object 随心所欲地移动要简单得多
缺点:
- 如果你想对 object 的影响做出现实的反应,你必须自己做很多工作。但有时这比使用物理系统然后尝试更可取,正如我之前所说的要驯服它。
你会在 Pokemon 游戏中使用该技术,你不会在 Pokemon 中停下来等待 ash 停止打滑或撞到墙上并不受控制地向后弹跳。
这个特殊的功能是设置 object 的位置,就像传送一样,但您也可以使用它来将角色平滑地移动到某个位置。我建议查找 'tweens' 以便在变量之间进行平滑插值。
//change the characters x by + 1 every tick,
Transform.transform.position.x += 1f;
我正在浏览几个不同的 Unity 教程,每个教程中游戏对象的移动方式都略有不同。
这些方法中的每一种 pros/cons 是什么?哪种方法更适合第一人称角色扮演游戏?
// 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;
谢谢!!
编辑;
我注意到的一点是,当位置发生变化时,施加的力似乎是在模因轮式车辆上 walking/running。
Rigidbody.MovePosition(m_Rigidbody.position + movement);
来自文档:
If Rigidbody interpolation is enabled on the Rigidbody, calling Rigidbody.MovePosition results in a smooth transition between the two positions in any intermediate frames rendered. This should be used if you want to continuously move a rigidbody in each FixedUpdate. https://docs.unity3d.com/ScriptReference/Rigidbody.MovePosition.html
Rigidbody.AddForce(15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
这会使物体加速,所以它不会匀速运动(这是因为牛顿第二定律,力=质量*加速度)。另外,如果你有另一个力朝相反的方向移动,这个力可能会被抵消,物体根本不会移动。
Transform.transform.position = playerTransform.position + cameraOffset;
这将传送对象。没有平滑的过渡,没有与游戏中已有的任何力量互动,只是位置的瞬间变化。
刚体和 Velocities/Physics
我个人唯一一次使用刚体系统是在实现我自己的 boids(集群行为)时,因为您需要计算一些单独的向量并将它们全部应用于单元。
Rigidbody.MovePosition(m_Rigidbody.position + movement);
这会使用物理系统为您计算朝向目标的运动矢量,因此 object 的速度和运动仍然会受到阻力、angular 阻力等的影响。
我相信这个特定函数是 Rigidbody.AddForce
的包装器。
优点:
- 如果您想要逼真的身体反应,那就太好了
缺点:
如果您想要实现的只是将 object 从 A 点移动到 B 点,那么使用起来有点笨拙。
- 有时某个地方的错误设置设置得太高(例如:Mass > 10000000)会导致行为中非常棘手的错误,很难确定和缓解。
注意:刚体与另一个刚体碰撞时会相互反弹,具体取决于物理设置。
它们也受重力影响。基本上,他们试图模仿现实生活中的 objects,但有时很难驯服 objects 并让他们完全按照你的意愿行事。
而Rigidbody.AddForce
和上面基本一样,只是你自己计算向量。
因此,例如,要获得指向目标的向量,您可以这样做
Vector3 target = target.position - myPosition;
Rigidbody.AddForce(target * 15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
如果您不打算在游戏中加入任何主要的物理机制,我建议您通过插入 objects 位置来移动。
因为让事情按照你想要的方式运行要容易得多,当然除非你追求物理现实主义!
内插单位位置
优点:
- 一开始理解起来可能有点奇怪,但让 object 随心所欲地移动要简单得多
缺点:
- 如果你想对 object 的影响做出现实的反应,你必须自己做很多工作。但有时这比使用物理系统然后尝试更可取,正如我之前所说的要驯服它。
你会在 Pokemon 游戏中使用该技术,你不会在 Pokemon 中停下来等待 ash 停止打滑或撞到墙上并不受控制地向后弹跳。
这个特殊的功能是设置 object 的位置,就像传送一样,但您也可以使用它来将角色平滑地移动到某个位置。我建议查找 'tweens' 以便在变量之间进行平滑插值。
//change the characters x by + 1 every tick,
Transform.transform.position.x += 1f;