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

时间:2019-01-20 00:06:26

标签: unity3d game-physics

我正在阅读一些不同的Unity教程,并且每个游戏对象在其中移动的方式略有不同。

每种方法的优缺点是什么?对于第一人称角色扮演游戏而言,哪种方法更受欢迎?

// 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;

谢谢!

编辑;

我注意到的一件事情是,当位置改变了模仿行走/跑步时,施加的力似乎是模仿轮式车辆。

2 个答案:

答案 0 :(得分:1)

  1. Rigidbody.MovePosition(m_Rigidbody.position + movement);

从文档中

  

如果在Rigidbody上启用了Rigidbody插值,则调用Rigidbody.MovePosition会在渲染的任何中间帧中的两个位置之间平滑过渡。如果要在每个FixedUpdate中连续移动刚体,则应使用此方法。   https://docs.unity3d.com/ScriptReference/Rigidbody.MovePosition.html

  1. Rigidbody.AddForce(15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);

这将使对象加速,因此它不会以恒定的速度行进(这是由于牛顿第二定律,即力=质量*加速度)。另外,如果您有另一个力朝相反的方向移动,则该力可能会被抵消,并且对象完全不会​​移动。

  1. Transform.transform.position = playerTransform.position + cameraOffset;

这将传送对象。没有平稳的过渡,没有与游戏中已有的任何力量互动,只是位置的即时变化。

答案 1 :(得分:1)

刚体和速度/物理

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

   Rigidbody.MovePosition(m_Rigidbody.position + movement);

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

我相信这个特定功能是Rigidbody.AddForce的包装。

优点:

  • 如果您要实现逼真的身体反应,那就很好

缺点:

  • 如果您要实现的只是将对象从A点移动到B点,则使用起来有点笨拙。

    • 有时某个地方的错误设置设置太高(例如:Mass> 10000000)可能会导致行为上的严重错误,很难确定和缓解。

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

它们也受到重力的影响。基本上,他们尝试模仿现实生活中的对象,但是有时很难驯服这些对象并使它们完全按照您的意愿进行操作。

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

例如,要使向量朝向目标,您就可以这样做

Vector3 target = target.position - myPosition;

Rigidbody.AddForce(target * 15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);

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

因为让事情表现出想要的样子要容易得多,除非您当然是为了物理现实主义!

插值单位位置

优点:

  • 乍一看可能有点奇怪,但使对象移动所需的方式要简单得多

缺点:

  • 如果您想对影响物体的物体做出现实的反应,则您必须自己做很多工作。但是有时候这比使用物理系统然后尝试更可取,正如我之前所说的要驯服它。

您可以在口袋妖怪游戏中使用该技术,您不必停在口袋妖怪中,而不必等待灰烬停止打滑或撞到墙壁并不受控制地向后弹跳。

此特殊功能像传送一样设置对象的位置,但是您也可以使用此功能将角色平滑移动到某个位置。我建议查找“补间”以在变量之间平滑地插值。

    //change the characters x by + 1 every tick, 
Transform.transform.position.x += 1f;