[Unity 3D] 常用物體移動的方法
阿新 • • 發佈:2019-01-27
一、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);
}