协同调用栈

时间:2017-01-03 12:54:10

标签: c# unity3d coroutine

我想使用我的协程平滑地插入多个GameObjects的位置和旋转,并附加脚本。当我启动协程时,平滑部分工作正常,但我的所有对象都移动到相同的位置,这不是我想要的。我想理解为什么会这样,如果有一种聪明的方法来处理它。

这是我的协程的样子:

    IEnumerator interpolate_Plate(Transform targ)
{
    float passedTime = 0;

    while (!transform.Equals(targ))
    {
        passedTime += Time.deltaTime;

        transform.position = Vector3.Lerp(transform.position, targ.position, passedTime);
        transform.rotation = Quaternion.Lerp(transform.rotation, targ.rotation,passedTime);
        yield return null;
    }

    yield break;
}

我正在考虑创建一个带有列表的mastercoroutine,然后调用平滑部分。 问题是,targ的引用总是被重置为堆栈上的所有coroutinecalls吗?

根据您的要求调用协程的函数:

public void move_Plate(Transform newPosition)
{
  StartCoroutine(interpolate_Plate(newPosition));
}

1 个答案:

答案 0 :(得分:1)

好的,所以我找到了解决方案,因为Unity或C#使用指针等问题。我不断改变所有对象的变换,因为我使用了指向下一个对象变换的指针。但是我把那个对象移动到所有这一切都结束了我移动的最后一个对象。

如何防止这种情况:

我创建了一个新类,它存储我的值,以便保存旧值的位置和旋转。我在我的班级中存储了一个实例,我移动了这些板块。 我现在从coroutine更改为注释中建议的更新方法。用旗帜检查我是否应该移动物体。然后我顺利地将它移动到新职位。

代码:

private Trans MoveTo;
private bool move;

void Update()
{
    if (move)
    {
        float passedTime = 0;
        passedTime += Time.deltaTime;

        transform.position = Vector3.Lerp(transform.position, MoveTo.position, passedTime);
        transform.rotation = Quaternion.Lerp(transform.rotation, MoveTo.rotation, passedTime);
    }
}

似乎工作。