簡體   English   中英

如何在Unity中的兩點之間移動對象?

[英]How to move an object between two points in Unity?

我正在嘗試使用lerp功能向上,向下,向下lerp 但是,無論何時觸發此腳本,整個會話都會凍結。

使用統一調試器,我將問題縮小到此部分代碼。

            do
        {
            float distCovered = (Time.time - startTime) * speed;
            fracJourney = distCovered / journeyLength;
            Debug.Log(fracJourney);
            transform.position = Vector3.Lerp(startPoint, endPoint, speed);
        } while (fracJourney <= 1);

因為看起來所有變量都沒有改變,因此整個循環是無限的。

這是專用於處理運動的代碼的整個部分(向量值當前是任意的)。

    public class MovePiece : MonoBehaviour {
    Vector3 startPoint;
    Vector3 endPoint;
    float speed = 10;
    float startTime;
    private bool moving = false;
    private bool up = false;
    private bool across = false;
    private bool down = false;
    public void Start()
    {
        startPoint = gameObject.GetComponent<Transform>().position;
        startTime = Time.time;
        moving = true;
        Debug.Log("Moving Piece");
    }

    void Update() {
        if (!moving)
        {
            Destroy(this);
            return;
        }
        moveManager();
            }
    void moveManager()
    {
        if (!up)
        {
            lerpUp();
            return;
        }
        if (!across)
        {
            lerpAcross();
            return;
        }
        if (!down)
        {
            lerpDown();
            return;
        }
    }

    private void lerpUp()
    {
        Debug.Log("Upwards");
        startPoint = gameObject.GetComponent<Transform>().position;
        endPoint = startPoint + new Vector3(0, 0, 50);
        float journeyLength = Vector3.Distance(startPoint, endPoint);
        float fracJourney;
        do
        {
            float distCovered = (Time.time - startTime) * speed;
            fracJourney = distCovered / journeyLength;
            Debug.Log(fracJourney);
            transform.position = Vector3.Lerp(startPoint, endPoint, speed);
        } while (fracJourney <= 1);
        up = true;
        Debug.Log("Upwards Finished");
        return;
    }
    private void lerpAcross()
         {
             Debug.Log("Across");
             startPoint = gameObject.GetComponent<Transform>().position;
             endPoint = startPoint + new Vector3(0, 50, 0);
              float journeyLength = Vector3.Distance(startPoint, endPoint);
             float fracJourney;
             do
             {
                 float distCovered = (Time.time - startTime) * speed;
                 fracJourney = distCovered / journeyLength;
                 transform.position = Vector3.Lerp(startPoint, endPoint, speed);
             } while (fracJourney <= 1);
        across = true;
        Debug.Log("Across Finished");
        return;
         }
    private void lerpDown()
    {
        Debug.Log("Down");
        startPoint = gameObject.GetComponent<Transform>().position;
        endPoint = startPoint + new Vector3(0, 0, -50);
        float journeyLength = Vector3.Distance(startPoint, endPoint);
        float fracJourney;
        do
        {
            float distCovered = (Time.time - startTime) * speed;
            fracJourney = distCovered / journeyLength;
            transform.position = Vector3.Lerp(startPoint, endPoint, speed);
        } while (fracJourney <= 1);
        down = true;
        Debug.Log("Down Finished");
        moving = false;
        Debug.Log("Moving Finished");
        return;
    }

}
}

我一直在嘗試將問題縮小到無濟於事,所以任何幫助將不勝感激。

do
    {
        float distCovered = (Time.time - startTime) * speed;
        fracJourney = distCovered / journeyLength;
        Debug.Log(fracJourney);
        transform.position = Vector3.Lerp(startPoint, endPoint, speed);
    } while (fracJourney <= 1);

Update()每幀僅運行一次,並且Time僅在更新時更新,因此Time不會因為一個Update() ,因此(Time.time - startTime) * speed將始終保持不變,因此distCovered永遠不會改變,因此fracJourney永遠不會改變,因此fracJourney <= 1永遠不會改變,因此您將永遠陷入困境。

如果您正在尋找修復程序,幾乎不需要while Update()函數內部進行while循環。 使用Update()函數本身作為循環,或者使用IEnumerator ,在其中您可以屈服並讓幀通過,例如:

public IEnumerator MyLoop()
{
    while (fracJourney <= 1)
    {
        float distCovered = (Time.time - startTime) * speed;
        fracJourney = distCovered / journeyLength;
        Debug.Log(fracJourney);
        transform.position = Vector3.Lerp(startPoint, endPoint, speed);

        yield return null;     //< --- yield out and let a frame pass
    }
}

您在這里遇到了多個問題。

首先是您在lerp函數內部使用了循環。 直到循環結束 ,游戲才會更新渲染輸出 循環是否無限是無關緊要的,它不會只執行一次迭代,而是會執行所有迭代(這也沒有幫助Time.time在此過程中不變)。

其次,您正在計算從應用程序 開始而不是當前移動開始的距離量

第三,您要調用Vector3.lerp(),並向其傳遞第三個參數(“ float-percentage”),該參數的值不是speed而是應該計算的分數。 例如Vector3.Lerp(startPoint, endPoint, 0.5f); 將返回startPointendPoint之間的中點。

第四,沒有理由使用四種方法來控制動畫。 您只需要一個,但是您也必須將其傳遞給所需的目的地(而不是使用四個暗示不同目的地的方法)。

第五,盡管先前endPoint計算為startPoint + distance (盡管這是new Vector3(0,0,50)是一個距離!),但您journeyLengthjourneyLength計算為startPointendPoint之間的距離。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM