四種移動到目標位置的方式(物體與UI介面皆可)
阿新 • • 發佈:2019-01-29
第一種:使用Vector3.MoveTowards
transform.localPosition = Vector3.MoveTowards(start, end, speed * Time.deltaTime);
假如移動的是介面的話,設定為localPosition,物體則為Position。
第二種:使用數學插值移動
float step = speed * Time.deltaTime; transform.localPosition = new Vector3(Mathf.Lerp(start.x, end.x, step), Mathf.Lerp(start.y, end.y, step), Mathf.Lerp(start.z, end.z, step));
還有一種是直接使用插值Vector3.lerp(start,end,f),這種更麻煩,因為無法設定速度,f是[0,1]之間的數,表示移動的比例,若為1,則最終移動到end的位置,若為0,則不移動。
第三種:使用transform.Translate
transform.Translate(Vector3.Normalize(end - start) *
(Vector3.Distance(start, end) / (time / Time.deltaTime)));
Vector3.Normalize表示移動的方向,Vector3.Distance(transform.localPosition, Vector3.zero) / (time/ Time.deltaTime)為移動的速度。
第四種:使用協程
private IEnumerator MoveObject_Time(Vector3 startPos,Vector3 endPos,float time) { float dur = 0.0f; while(dur<=time) { dur += Time.deltaTime; transform.localPosition = Vector3.Lerp(startPos, endPos, dur / time); yield return null; } }
需要移動時就呼叫這個協程,StartCoroutine(MoveObject_Time(start, enf, time))。
也可以設定速度移動,程式碼如下:
private IEnumerator MoveObject_Speed(Vector3 startPos, Vector3 endPos, float speed)
{
float startTime = Time.time;
float length = Vector3.Distance(startPos, endPos);
float frac = 0f;
while (frac <= 1.0f)
{
float dist = (Time.time - startTime) * speed;
frac = dist / length;
transform.localPosition = Vector3.Lerp(startPos, endPos, frac);
yield return null;
}
}
總結:具體效果可以測試一下,個人測試為第四種情況最為理想,不過需要開協程。一般情況下可以先使用第一種方式看看效果。需要注意的是:移動UI介面的話一般需要設定localPosition移動。假如還有其它移動方式的話,歡迎和我交流哦。