欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity3D中移动物体位置的几种方法

程序员文章站 2022-04-03 12:29:57
...
  1. 简介

    在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。

  2. 通过Transform组件移动物体
    Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale)。 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position)。

2.1 Transform.Translate
该方法可以将物体从当前位置,移动到指定位置,并且可以选择参照的坐标系。 当需要进行坐标系转换时,可以考虑使用该方法以省去转换坐标系的步骤。

   public function Translate(translation: Vector3, relativeTo: Space = Space.Self): void;

2.2 Vector3.Lerp, Vector3.Slerp, Vector3.MoveTowards
Vector3 既可以表示三维空间中的一个点,也可以表示一个向量。这三个方法均为插值方法, Lerp为线性插值,Slerp为球形插值, MoveTowards在Lerp的基础上增加了限制最大速度功能。 当需要从指定A点移动到B点时,可以考虑时候这些方法。

2.3 Vector3.SmoothDamp
该方法是可以平滑的从A逐渐移动到B点,并且可以控制速度,最常见的用法是相机跟随目标。

2.4 Transform.position
有时重新赋值position能更快实现我们的目标。

  1. 通过Rigidbody组件移动物体
    Rigidbody组件用于模拟物体的物理状态,比如物体受重力影响,物体被碰撞后的击飞等等。

    注意:关于Rigidbody的调用均应放在FixedUpdate方法中,该方法会在每一次执行物理模拟前被调用。

3.1 Rigidbody.velocity
设置刚体速度可以让物体运动并且忽略静摩擦力,这会让物体快速从静止状态进入运动状态。

3.2 Rigidbody.AddForce
给刚体添加一个方向的力,这种方式适合模拟物体在外力的作用下的运动状态。

3.3 Rigidbody.MovePosition
刚体受到物理约束的情况下,移动到指定点。

  1. 通过CharacterController组件移动物体
    CharacterController用于控制第一人称或第三人称角色的运动,使用这种方式可以模拟人的一些行为,比如限制角色爬坡的最大斜度,步伐的高度等。

4.1 CharacterController.SimpleMove
用于模拟简单运动,并且自动应用重力,返回值表示角色当前是否着地。

4.2 CharacterController.Move
模拟更复杂的运动,重力需要通过代码实现,返回值表示角色与周围的碰撞信息。

摘自圣典的一段翻译:

Force
Add a continuous force to the rigidbody, using its mass.
添加一个可持续力到刚体,使用它的质量。
Acceleration
Add a continuous acceleration to the rigidbody, ignoring its mass.
添加一个可持续加速度到刚体,忽略它的质量。
Impulse
Add an instant force impulse to the rigidbody, using its mass.
添加一个瞬间冲击力到刚体,使用它的质量。
VelocityChange
Add an instant velocity change to the rigidbody, ignoring its mass.
添加一个瞬间速率变化给刚体,忽略它的质量。

VelocityChange 速率改变,无视质量,所以给的值要小一些。是累加,并非直接赋值。用过感觉好像还有个内部值,建议直接改速率好点,稳定。

Acceleration 测试似乎是和Force没什么区别

Impulse 是普通力值的100倍左右

AddForce 是相对世界坐标的力

AddRelativeForce 是相对自身坐标的力

这里单独把速率Velocity提出来说一下

一般在游戏中,主角移动会推动敌人也跟着移动,否则就穿透了,而敌人被推动的快慢可以设置质量来影响。

这时候会有一个问题,当你要将敌人浮空时,直接用AddForce会被质量影响,你得把数值设置到几万,而改变速率不受质量影响。

你可以直接改变速率或者使用AddForce的VelocityChange参数改变速率。