Coroutine Lerp无法正常运行?

时间:2017-11-14 15:19:14

标签: c# unity3d lerp

这个问题有两个部分 - 第一部分是运行嵌套for循环以通过碰撞边界(collider.bounds)分离父游戏对象的子节点。如果存在碰撞(边界相交),则交叉游戏对象执行Lerp代码以尝试退出碰撞。

Lerp正常执行但是,如图所示,它无法正常运行。它正确地将儿童1,2,3,4移动到彼此边界之外,但它将它们完全移动到距离儿童0太远。同样,如果持续时间改变,则调整移动每个对象的时间,但是它们之间的距离也是如此。他们 - 不应该这样。

编辑:(其他详细信息)
函数通过参数而不是Transform和Vector3传递索引。转换fromPosition,Vector3 toPosition和startPos都以相同的方式使用,而不是像程序员协同程序那样传递它们,(因为我不能,因为这个实现是运行时特定的,我不知道哪些对象这将是正在运行的)它们是在修改过的协同例程中首先计算的。

程序员实现正在将游戏对象移动到指定位置。我需要抓住每个孩子,直到他们不与彼此的界限相交。

这意味着Lerp需要连续执行endPosition的规范,一旦它移动的对象不再与其比较的对象相交。它在这里实现的方式是使用while循环连续执行Lerp,逐渐移动(Vector3.right)作为endPosition,直到碰撞器不再相交。问题是,它没有按预期工作。

那么,如何修复Lerp实现呢?

以下资源:
内联图片,链接到此图片,相关代码

P.S:

  • 评论'//翻译'下的代码是显示内容 期望的结果是,除了翻译不会产生平滑 像Lerp这样的运动。
  • Coroutine,'MoveToX',几乎完全是代码 从SE上的类似问题重用,其中用户询问如何 Lerp在更新之外顺利进行。

External image link

Inline image two

int numChildren = gameObject.transform.childCount;
for (int i = 0; i<numChildren; i++)
{
    for (int a = i+1; a<numChildren; a++)
    {
        while (gameObject.transform.GetChild(a).GetComponentInChildren<Collider>().bounds.Intersects
            (gameObject.transform.GetChild(i).GetComponentInChildren<Collider>().bounds))
        {
            // print
            Debug.Log("Bounds intersecting " + i + ":" + a);

            // translating
            //gameObject.transform.GetChild(a).GetComponentInChildren<Transform>()
            //    .transform.Translate(Vector3.right* Time.deltaTime* 100f, Space.World);

            // lerping
            StartCoroutine(MoveToX(a, 0.1f));

        }
    }
}


IEnumerator MoveToX(int a, float duration)
{
    //Get the current position of the object to be moved
    Vector3 startPos = gameObject.transform.GetChild(a).transform.position;

    Vector3 toPosition = gameObject.transform.GetChild(a).transform.position + Vector3.right;

    //Make sure there is only one instance of this function running
    if (isMoving)
    {
        yield break; ///exit if this is still running
    }
    isMoving = true;

    float counter = 0;

    while (counter < duration)
    {
        counter += Time.deltaTime;
        gameObject.transform.GetChild(a).transform.position = Vector3.Lerp(startPos, toPosition, counter / duration);
        yield return null;
    }

    isMoving = false;
}

0 个答案:

没有答案