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

5

我正在学习几个不同的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;

谢谢!

编辑:

我注意到的一件事情是,施加的力似乎模仿了轮式车辆,而位置变化则模仿了步行/奔跑。

2个回答

3

刚体和速度/物理

个人而言,我只在实现自己的Boids(群集行为)时使用了刚体系统,因为您需要计算一些单独的向量并将它们全部应用于单位。

注:RigidBodies指刚体系统,Velocities指速度。

   Rigidbody.MovePosition(m_Rigidbody.position + movement);

这将使用物理系统为您计算一个朝向目标的移动向量,因此对象的速度和移动仍然会受到阻力、角阻力等影响。
这个特定的函数是我认为的Rigidbody.AddForce的包装器。
优点:
- 如果你追求真实的物理反应,那么它很好用。
缺点:
- 如果你只是想从A点移动一个物体到B点,那么使用起来有点不方便。 - 有时候某个错误的设置过高(例如:Mass > 10000000)可能会导致行为上出现非常麻烦的bug,难以解决和缓解。
注:当刚体与另一个刚体碰撞时,根据物理设置,它们会互相弹开。
它们也受重力影响。基本上它们试图模仿现实生活中的物体,但有时候很难驾驭这些物体并使它们完全按照您的意愿行动。
而Rigidbody.AddForce与上述基本相同,只是您自己计算向量。
例如,要获得指向目标的向量,您可以执行以下操作:
Vector3 target = target.position - myPosition;

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

如果你的游戏中没有任何重要的物理机制,我建议通过插值对象的位置来移动。
因为这样更容易使物体按照你想要的方式移动,除非你追求物理真实性!
插值单位的位置
优点:
- 一开始可能有点奇怪,但是让物体移动变得简单。 缺点:
- 如果你想要对象撞击时产生逼真的反应,你必须自己做很多工作。但有时这比使用物理系统然后试图驯服它更可取。
在类似宠物小精灵的游戏中,你会使用这种技术,你不会在宠物小精灵中停下来等待Ash停止打滑或者撞到墙壁并向后无法控制地弹回。
这个特定的功能就像传送一样设置对象的位置,但你也可以使用它来平滑地移动角色到一个位置。我建议查找“tweens”以平滑地插值变量之间的值。
    //change the characters x by + 1 every tick, 
Transform.transform.position.x += 1f;

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

从文档中了解到:

如果启用了刚体插值,调用Rigidbody.MovePosition将导致在任何中间帧中呈现的两个位置之间进行平稳的过渡。如果您想在每个FixedUpdate中连续移动刚体,则应使用此功能。 https://docs.unity3d.com/ScriptReference/Rigidbody.MovePosition.html

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

这会使物体加速,因此它不会以恒定速度行进(这是由于牛顿第二定律 F = ma)。另外,如果您有另一个向相反方向的力,则这个力可能会被取消掉,物体根本不会移动。

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

这将瞬间传送对象。没有平滑过渡,也没有与游戏中已有的任何力互动,只是位置上的瞬间更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接