1. 程式人生 > >[Unity 3D] 常用物體移動的方法

[Unity 3D] 常用物體移動的方法

一、Transform

1.transform.Translate

將物體從當前位置向指定方向移動,並且可以選擇參照的座標系。

float speed = 5f;    // 速度

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

2.transform.position

 直接更改物體的座標簡單粗暴。

Vector3 targetPosition;

void Update()
{
    targetPosition = transform.position + transform.forward;
    transform.position = targetPosition;
}

二、Vector3

1.Vector3.Lerp

Lerp為線性插值,按照數字t在當前位置到目標位置之間插值。

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

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

2.Vector3.Slerp

Slerp為弧形插值,按照數字t在當前位置到目標位置之間插值。

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

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

3.Vector3.MoveTowards

這個函式基本上和Vector3.Lerp相同,而是該函式將確保我們的速度不會超過maxDistanceDelta。

Vector3 targetPosition = new Vector3(0,0,10);
float maxDistanceDelta = 1f;
// maxDistanceDelta的負值從目標推開向量,就是說maxDistanceDelta是正值,當前地點移向目標,如果是負值當前地點將遠離目標。

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

4.Vector3.SmoothDamp

將物體平滑地從A逐漸移動到B點,並且可以控制速度,最常見的用法是相機跟隨目標。

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);
}

三、Rigidbody

1.rigidbody.velocity

設定剛體速度可以讓物體運動並且忽略靜摩擦力,這會讓物體快速從靜止狀態進入運動狀態。

private Rigidbody rigidbody;
float speed = 5f;

void Awake()
{
    rigidbody = GetComponent<Rigidbody>();
    rigidbody.velocity = Vector3.forward * speed;
}

2.rigidbody.MovePosition

剛體受到物理約束的情況下,移動到指定點。

private Rigidbody rigidbody;

void Awake()
{
    rigidbody = GetComponent<Rigidbody>();
}

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

3.rigidbody.AddForce

給剛體新增一個方向的力,這種方式適合模擬物體在外力的作用下的運動狀態。

private Rigidbody rigidbody;

void Awake()
{
    rigidbody = GetComponent<Rigidbody>();
}

void Update()
{
    rigidbody.AddForce(transform.forward);
}

四、CharacterController

1.characterController.Move

模擬更復雜的運動,重力需要通過程式碼實現,返回值表示角色與周圍的碰撞資訊。

private CharacterController characterController;

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

void Update () {
    characterController.Move(transform.forward * Time.deltaTime);
}

2.CharacterController.SimpleMove

用於模擬簡單運動,並且自動應用重力,返回值表示角色當前是否著地。

private CharacterController characterController;
private float speed = 5f;

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

void Update () 
{
    characterController.SimpleMove(transform.forward * speed);
}