在Unity3D中,有多種方式可以改變物體的坐標,實現移動的目的,其本質是每幀修改物體的position。
一、通過Transform組件移動物體
Transform組件用于描述物體在空間中的狀態,它包括位置(position),旋轉(rotation)和縮放(scale)。其實所有的移動都會導致position的改變,這里說的通過Transform組件來移動物體,指的是直接操作Transform來控制物體的位置(position)。
1.Transform.Translate
該方法可以將物體從當前位置移動到指定位置,并且可以選擇參照的坐標系(使得GameObject對象在參數relativeTo的坐標系空間中移動參數translation指定的向量)。當需要進行坐標系轉換時,可以考慮使用該方法以省去轉換坐標系的步驟(適合非物理的移動,但需要注意的是,這個方法會直接改變物體的位置,可能會忽略碰撞,造成"穿墻")。
(1) public void Translate(Vector3 translation);
(2) public void Translate(Vector3 translation , Space relativeTo);
(3) public void Translate(float x, float y, float x);
(4) public void Translate(float x, float y, float x,?Space?relativeTo);
參數?relativeTo 有兩種:
①Space.self:自身坐標系
②Space.world:世界坐標系
//沿自身坐標系的X軸移動10個距離
transform.Translate(new Vector3(10.0f, 0.0f, 0.0f), Space.self);
//沿世界坐標系的X軸移動10個距離
transform.Translate(new Vector3(10.0f, 0.0f, 0.0f), Space.world);
//沿默認坐標系的X軸移動10個距離
transform.Translate(new Vector3(10.0f, 0.0f, 0.0f));
(5)?public void Translate(Vector3 translation , Transform relativeTo);
(5)?public void Translate(float x, float y, float z , Transform?relativeTo);
2.Vector3.Lerp,Vector3.Slerp,Vector3.MoveTowards
Vector3既可以表示三維空間中的一個點,也可以表示一個向量。這三個方法均為插值方法。Lerp(線性插值),Slerp(球形插值),MoveTowards在Lerp的基礎上增加了限制最大速度的功能。當需要從指定點A移動到點B時,可以考慮使用這些方法。
3.Vector3.SmoothDamp(平滑阻尼)
該方法是可以平滑地從A逐漸移動到B,并且可以控制速度,最常見的用法是相機跟隨目標。
public static Vector3 SmoothDamp(
Vector3 current, ?//當前position
Vector3 target, ? ?//目標position
ref Vector3 currentVelocity, //當前速度,這個值每次調用這個函數時會被修改
float smoothTime, //到達目標的大約時間(越小越快)
float maxSpeed = Mathf.Infinity, ?//限制最大速度(默認無窮大)
float deltaTime = Time.deltaTime)
4.Transform.position
直接對物體的position賦值,有時候重新賦值position能更快地實現移動(適合非物理碰撞的移動)。
二、通過Rigidbody組件移動物體
Rigidbody組件用于模擬物體的物理狀態,比如物體受重力影響,物體被碰撞后的擊飛等。
關于Rigidbody的調用均應放在FixedUpdate方法中
1. Rigidbody.velocity
設置剛體速度可以讓物體運動并且忽略摩檫力,這會讓物體快速從靜止狀態進入運動狀態
在腳本中無論是給剛體賦予一個Vector3類型的速度向量v、還是獲取當前剛體的速度v,v的方向都是相對世界坐標系而言的。
velocity的單位是米每秒,而不是幀每秒,其中米是Unity中默認的長度單位。
2. Rigidbody.AddForce
給剛體添加一個方向的力,這種方式適合模擬物體在外力作用下的運動狀態(適合物理類運動)。
3. Rigidbody.MovePosition
剛體在受到物理約束的情況下,移動到指定點(較少用)。
三、通過CharacterController組件移動物體
CharacterController用于控制第一人稱或第三人稱角色的運動,使用這種方式可以模擬人的一些行為,比如限制角色爬坡的最大斜度,步伐高度等。
1. CharacterController.SimpleMove
用于模擬簡單運動,并且自動應用重力,返回值表示角色當前是否著地。
2. CharacterController.Move
模擬更復雜的運動,重力需要通過代碼實現,返回值表示角色與周圍的碰撞信息。