目錄
- Unity中移動腳本
- 1. 通過Transform組件移動物體
- 1.1 Transform.Position
- 1.2 Transform.Translate
- 1.3 Vector3.Lerp , Vector3.Slerp , Vector3.MoveTowardsVector3(插值)
- 1.4 Vector3.SmoothDamp
- 2. 通過Rigidbody組件移動物體
- 2.1 Rididbody.velocity
- 2.2 Rigidbody.AddForce
- Rigidbody.MovePosition
- 1. 通過Transform組件移動物體
Unity中移動腳本
1. 通過Transform組件移動物體
1.1 Transform.Position
這種是直接更改物體的坐標
transform.position += Vector3.forward * Time.deltaTime;
1.2 Transform.Translate
這種方法是將物體從當前位置,移動到指定位置,并且可以選擇參照的坐標系,
//移動的物體以世界坐標系為移動參考方向
transform.Translate(new Vector3(0,0,1) * Time.deltaTime, Space.World);
//移動的時候物體以自身坐標系為移動參考方向
transform.Translate(new Vector3(0,0,1) * Time.deltaTime);
1.3 Vector3.Lerp , Vector3.Slerp , Vector3.MoveTowardsVector3(插值)
這三個方法均為插值方法,Lerp為線性插值,Slerp為球形插值
MoveTowards在Lerp的基礎上增加了限制最大速度功能,
當需要指定從一點移動到另一點時,可以考慮使用這些方法,
使用Vector3.Lerp讓物體從一點移動到另一點,時間為4秒
public class MoveController : MonoBehaviour
{
//獲取目標物件
public Transform targetObject;
//目標位置坐標
public Vector3 targetPosition;
//初始位置坐標
public Vector3 startPosition;
//持續時間
public float lerpDuration = 4;
//記錄運行時間
private float _timeElapsed = 0;
// Start is called before the first frame update
void Start()
{
targetPosition = targetObject.position;
startPosition = transform.position;
}
// Update is called once per frame
void Update()
{
Vector3 valueToLerp;
_timeElapsed += Time.deltaTime;
if(_timeElapsed < lerpDuration)
{
valueToLerp = Vector3.Lerp(startPosition, targetPosition, _timeElapsed / lerpDuration);
}
else
{
valueToLerp = targetPosition;
}
transform.position = valueToLerp;
}
}
使用Vector3.MoveTowards讓物體以恒定速度移動到目標點
public class MoveController : MonoBehaviour
{
//獲取目標物件
public Transform targetObject;
//目標位置坐標
public Vector3 targetPosition;
public float speed = 10;
void Start()
{
targetPosition = targetObject.position;
}
// Update is called once per frame
void Update()
{
transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
}
}
1.4 Vector3.SmoothDamp
Vector3.SmoothDamp該方法是可以平滑的從A逐漸移動到B點,并且可以控制速度,最常見的用法是相機跟隨目標,
public class MoveController : MonoBehaviour
{
public Transform targetObject;
public Vector3 targetPosition;
private float smoothTime = 0.5f;
public float speed = 10;
Vector3 velocity = Vector3.zero;
void Start()
{
targetPosition = targetObject.position;
}
// Update is called once per frame
void Update()
{
//需要傳入當前位置、目標位置、當前速度、平滑時間、最大速度
transform.position = Vector3.SmoothDamp(transform.position, targetPosition,ref velocity, smoothTime, speed);
}
}
2. 通過Rigidbody組件移動物體
關于Rigidbody的呼叫要放在FixedUpdate方法中,該方法會在每一次執行物理模擬前被呼叫
2.1 Rididbody.velocity
設定剛體的速度,該方法直接改變剛體速度,忽略摩擦力
private void FixedUpdate()
{
transform.GetComponent<Rigidbody>().velocity = new Vector3(10, 0, 0);
}
2.2 Rigidbody.AddForce
給剛體添加一個方向的力
private void FixedUpdate()
{
transform.GetComponent<Rigidbody>().AddForce(Vector3.right * 10);
}
Rigidbody.MovePosition
剛體在受到物理約束的情況下,移動到指定點
public class MoveController : MonoBehaviour
{
private Vector3 speed = new Vector3(5, 0, 0);
private void FixedUpdate()
{
transform.GetComponent<Rigidbody>().MovePosition(transform.position + speed * Time.deltaTime);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515101.html
標籤:其他
上一篇:Chrome 解析度測驗
下一篇:初識C語言
