如何在Unity中的两点之间移动对象?

时间:2015-12-02 21:02:07

标签: c# unity3d

我正在尝试使用统一的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;
    }

}
}

我一直在努力将这个问题缩小,但无济于事,所以任何帮助都会受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

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(),所以{{ 1}}将永远保持不变,因此(Time.time - startTime) * speed永远不会改变,因此distCovered永远不会改变,因此fracJourney永远不会改变,所以你永远陷入循环。

如果您正在寻找修复,您几乎不需要fracJourney <= 1函数内的while循环。使用Update()函数本身作为循环,或者使用Update(),您可以放弃并让框架通过,如下所示:

IEnumerator

答案 1 :(得分:1)

你在这里遇到了不止一个问题。

首先,你在lerp函数中使用了一个循环。游戏不会更新渲染输出,直到循环结束。如果循环是无限的,它不重要,它不会只执行一次迭代,它将所有(它们也不会帮助Time.time在此过程中不会发生变化)。

其次,您计算的移动距离是应用程序开始的距离,而不是当前移动的开始。

第三,您正在调用Vector3.lerp()向其传递第三个参数(&#34; float-percentage&#34;),其值为speed而不是应该为的小数量计算。例如Vector3.Lerp(startPoint, endPoint, 0.5f);将返回startPointendPoint之间的中点。

第四,没有理由使用四种方法来播放动画。你只需要一个,但你必须将它传递给所需的目的地(而不是有四个方法暗示不同的目的地)。

第五,尽管您之前已将journeyLength计算为startPoint,但您计算endPointendPointstartPoint + distance之间的距离( new Vector3(0,0,50)是什么:距离!)