1.簡介
在unity3d中禁漓,有多種方式可以改變物體的坐標跟衅,實現(xiàn)移動的目的,其本質是每幀修改物體的position璃饱。
2. 通過Transform組件移動物體
Transform 組件用于描述物體在空間中的狀態(tài)与斤,它包括 位置(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
這一類方法辩蛋,都要在Update或者FixUpdate里執(zhí)行。
Vector3 既可以表示三維空間中的一個點移盆,也可以表示一個向量悼院。這三個方法均為插值方法, Lerp為線性插值咒循,Slerp為球形插值据途, MoveTowards在Lerp的基礎上增加了限制最大速度功能。 當需要從指定A點移動到B點時,可以考慮時候這些方法叙甸。
Lerp
//像彈簧一樣跟隨目標物體.
public class testlerp : MonoBehaviour {
private Vector3 des = new Vector3(-16, 1, 1);
Vector3 start = new Vector3(1, 1, 1), end = new Vector3(2, 2, 2);
Vector3 result;
Vector3 start1;
// Use this for initialization
void Start () {
start1 = this.transform.position;
}
// Update is called once per frame
void Update () {
result = Vector3.Lerp(start,end,0.5f);
Debug.Log($"{result}");
//transform.position = Vector3.Lerp(start1,des,0.5f);
transform.position = Vector3.Lerp(transform.position, des, Time.fixedDeltaTime*5);
}
}
//勻速接近目標
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public Transform startMarker;
public Transform endMarker;
public float speed = 1.0F;
private float startTime;
private float journeyLength;
public Transform target;
public float smooth = 5.0F;
void Start() {
startTime = Time.time;
journeyLength = Vector3.Distance(startMarker.position, endMarker.position);
}
void Update() {
float distCovered = (Time.time - startTime) * speed;
float fracJourney = distCovered / journeyLength;
transform.position = Vector3.Lerp(startMarker.position, endMarker.position, fracJourney);
}
}
2.3 Vector3.SmoothDamp
該方法是可以平滑的從A逐漸移動到B點颖医,并且可以控制速度,最常見的用法是相機跟隨目標裆蒸。
2.4 Transform.position
有時重新賦值position能更快實現(xiàn)我們的目標熔萧。
3. 通過Rigidbody組件移動物體
Rigidbody組件用于模擬物體的物理狀態(tài),比如物體受重力影響,物體被碰撞后的擊飛等等佛致。
注意:關于Rigidbody的調用均應放在FixedUpdate方法中遂赠,該方法會在每一次執(zhí)行物理模擬前被調用。
3.1 Rigidbody.velocity
設置剛體速度可以讓物體運動并且忽略靜摩擦力晌杰,這會讓物體快速從靜止狀態(tài)進入運動狀態(tài)跷睦。
3.2 Rigidbody.AddForce
給剛體添加一個方向的力,這種方式適合模擬物體在外力的作用下的運動狀態(tài)肋演。
3.3 Rigidbody.MovePosition
剛體受到物理約束的情況下抑诸,移動到指定點。
4. 通過CharacterController組件移動物體
CharacterController用于控制第一人稱或第三人稱角色的運動爹殊,使用這種方式可以模擬人的一些行為蜕乡,比如限制角色爬坡的最大斜度,步伐的高度等。
4.1 CharacterController.SimpleMove
用于模擬簡單運動梗夸,并且自動應用重力层玲,返回值表示角色當前是否著地。
4.2 CharacterController.Move
模擬更復雜的運動,重力需要通過代碼實現(xiàn)反症,返回值表示角色與周圍的碰撞信息辛块。
總結:
移動方式主要有三類方式:控制Transform組件;直接改變坐標點铅碍;使用其他組件润绵。
其他:DOTween插件;unity動畫等胞谈;