1. 程式人生 > >四種移動到目標位置的方式(物體與UI介面皆可)

四種移動到目標位置的方式(物體與UI介面皆可)

第一種:使用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移動。假如還有其它移動方式的話,歡迎和我交流哦。