如何在 IEnumerator 函数中移动对象两次

How can I move a object twice in a IEnumerator function

我想在特定时间将我的对象从一个地方移动到另一个地方,过一会儿我想将它移动到另一个地方。我可以在一个 IEnumerator 函数中完成吗?

这是我的代码,顺便说一句,这里的开始是启动触发器,它工作正常。

void Start()
{
    StartCoroutine(Begin());
}

IEnumerator Begin()
{
    while (!start)
    {
        yield return null;
    }
    StartCoroutine(goDown());
}

IEnumerator goDown()
{
    yield return new WaitForSeconds(62);

    while ( transform.position.x < -1.4f 
        || transform.position.y > -1.3f 
        || transform.position.z < 9.33f)
    {

        if(transform.position.x < -1.4f)
        {
            transform.position = new Vector3(transform.position.x + Time.deltaTime * 0.6f, 
                transform.position.y, transform.position.z);
        }

        if (transform.position.y > 1.3f)
        {
            transform.position = new Vector3(transform.position.x, 
                transform.position.y - Time.deltaTime * 0.6f, 
                transform.position.z);
        }

        if (transform.position.z < 9.33f)
        {
            transform.position = new Vector3(transform.position.x , 
                transform.position.y, 
                transform.position.z + Time.deltaTime * 0.6f);
        }

        yield return null;
    }

    yield return new WaitForSeconds(25);

    while (transform.position.x > -8.79f 
        || transform.position.y < 1.67f 
        || transform.position.z < 9.86f)
    {

        if (transform.position.x > -8.79f)
        {
            transform.position = new Vector3(transform.position.x - Time.deltaTime * 0.6f, transform.position.y, transform.position.z);
        }

        if (transform.position.y < 1.67f)
        {
            transform.position = new Vector3(transform.position.x, transform.position.y + Time.deltaTime * 0.6f, transform.position.z);
        }

        if (transform.position.z < 9.86f)
        {
            transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z - Time.deltaTime * 0.6f);
        }

        yield return null;
    }
}

我做到了,对象只能移动到第一个位置,不能移动到下一个位置。不知道有什么问题?

这是因为你的 while 循环和你的 if 条件不匹配:

    || transform.position.y > -1.3f 

不同于

    if (transform.position.y > 1.3f)

所以你的协程卡在第一个循环中,因为转换的 y 卡在 -1.3 和 1.3 之间。

作为sidenode,您可以将转换的当前目标分配给一个变量并使用Vector3.MoveTowards来避免这种copy-paste错误:

IEnumerator goDown()
{
    yield return new WaitForSeconds(62);

    Vector3 goal = new Vector3(-1.4f, -1.3f, 9.33f);

    while (transform.position != goal) 
    {
        transform.position = Vector3.MoveTowards(transform.position, goal, 
                                                 1.03f * Time.deltaTime);
        yield return null;
    }

    yield return new WaitForSeconds(25);

    goal = new Vector3(-8.79f, 1.67f, 9.86f);

    while (transform.position != goal) 
    {
        transform.position = Vector3.MoveTowards(transform.position, goal, 
                                                 1.03f * Time.deltaTime);
        yield return null;
    }
}