跳转到主要内容

[Unity 3D] 常用物体移动的方法

demi 提交于

<a href="https://blog.csdn.net/iFasWind/article/details/81383029"><font color="#9a9a9a">文弱书生陈皮皮</font></a>

<font size="3" style="line-height: 45px;" color="#c200ff"><strong>一、Transform</strong></font>

<strong>1. transform.Translate</strong>

将物体从当前位置向指定方向移动,并且可以选择参照的坐标系。

<pre>float speed = 5f; // 速度

void Update()
{
transform.Translate(Vector3.forward * speed * Time.deltaTime, Space.World);
}</pre>

<strong>2. transform.position</strong>

直接更改物体的坐标简单粗暴。

<pre>Vector3 targetPosition;

void Update()
{
targetPosition = transform.position + transform.forward;
transform.position = targetPosition;
}</pre>

<font size="3" style="line-height: 45px;" color="#c200ff"><strong>二、Vector3</strong></font>

<strong>1. Vector3.Lerp</strong>

Lerp为线性插值,按照数字t在当前位置到目标位置之间插值。

<pre>Vector3 targetPosition = new Vector3(0,0,10);
float t = 0.5f; // t的值在[0...1]

void Update()
{
transform.position = Vector3.Lerp(transform.position, targetPosition, t);
}</pre>

<strong>2. Vector3.Slerp</strong>

Slerp为弧形插值,按照数字t在当前位置到目标位置之间插值。

<pre>Vector3 targetPosition = new Vector3(0,0,10);
float t = 0.5f; // t的值在[0...1]

void Update()
{
transform.position = Vector3.Slerp(transform.position, targetPosition, t);
}</pre>

<strong>3. Vector3.MoveTowards</strong>

这个函数基本上和Vector3.Lerp相同,而是该函数将确保我们的速度不会超过maxDistanceDelta。

<pre>Vector3 targetPosition = new Vector3(0,0,10);
float maxDistanceDelta = 1f;
// maxDistanceDelta的负值从目标推开向量,就是说maxDistanceDelta是正值,当前地点移向目标,如果是负值当前地点将远离目标。

void Update()
{
transform.position = Vector3.MoveTowards(transform.position, targetPosition, maxDistanceDelta);
}</pre>

<strong>4. Vector3.SmoothDamp</strong>

将物体平滑地从A逐渐移动到B点,并且可以控制速度,最常见的用法是相机跟随目标。

<pre>Vector3 targetPosition = new Vector3(0,0,10); // 目标位置
Vector3 currentVelocity = Vector3.zero; // 当前速度,这个值由你每次调用这个函数时被修改
float maxSpeed = 5f; // 选择允许你限制的最大速度
float smoothTime = 5f; // 达到目标大约花费的时间。 一个较小的值将更快达到目标。

void Update()
{
transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref currentVelocity, smoothTime, maxSpeed);
}</pre>

<font size="3" style="line-height: 45px;" color="#c200ff"><strong>三、Rigidbody</strong></font>

<strong>1. rigidbody.velocity</strong>

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

<pre>private Rigidbody rigidbody;
float speed = 5f;

void Awake()
{
rigidbody = GetComponent&lt;Rigidbody&gt;();
rigidbody.velocity = Vector3.forward * speed;
}</pre>

<strong>2. rigidbody.MovePosition</strong>

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

<pre>private Rigidbody rigidbody;

void Awake()
{
rigidbody = GetComponent&lt;Rigidbody&gt;();
}

void Update()
{
rigidbody.MovePosition(transform.position + transform.forward * Time.deltaTime);
}</pre>

<strong>3. rigidbody.AddForce</strong>

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

<pre>private Rigidbody rigidbody;

void Awake()
{
rigidbody = GetComponent&lt;Rigidbody&gt;();
}

void Update()
{
rigidbody.AddForce(transform.forward);
}</pre>

<font size="3" style="line-height: 45px;" color="#c200ff"><strong>四、CharacterController</strong></font>

<strong>1. characterController.Move</strong>

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

<pre>private CharacterController characterController;

void Awake()
{
characterController = GetComponent&lt;CharacterController&gt;();
}

void Update () {
characterController.Move(transform.forward * Time.deltaTime);
}</pre>

<strong>2. CharacterController.SimpleMove</strong>

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

<pre>private CharacterController characterController;
private float speed = 5f;

void Awake()
{
characterController = GetComponent&lt;CharacterController>();
}

void Update ()
{
characterController.SimpleMove(transform.forward * speed);
}</pre>

<hr>
版权声明:本文为CSDN博主「文弱书生陈皮皮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/iFasWind/article/details/81383029
<br>