【问题标题】:How to make sure lerp has ended before disabling collider2d如何在禁用 collider2d 之前确保 lerp 已结束
【发布时间】:2016-06-16 14:40:37
【问题描述】:

我正在运行一些协程,它们每隔几秒就将对象从一个位置移动到另一个位置。在某个时候,我想禁用他们的对撞机。在禁用它的对撞机之前,如何确保每个游戏对象都已完成“lerping”到新位置,以防止在跳跃过程中禁用对撞机?下面是相关代码:

    IEnumerator moveObjToRight  (Transform fromPosition, Vector3 toPosition, float duration, int newIndex)  {


            while (freePositions.Contains(objPositions[newIndex])) {

            freePositions.Add (objPositions [newIndex - 1]);
            filledPositions.Remove (objPositions [newIndex - 1]);

            float counter = 0;

        Transform startTrans = fromPosition;

        freePositions.Remove (objPositions [newIndex]);
        filledPositions.Add (objPositions [newIndex]);

            while (counter < duration) {                
                counter += Time.deltaTime;
                fromPosition.position = Vector3.Lerp (startTrans.position, toPosition, counter / duration);
                yield return null;

            }


            if (newIndex < objPositions.Count) {

                newIndex++;

                if ((newIndex == 9) || !freePositions.Contains (objPositions [newIndex]))   {

                isMovingLeft = true;

                yield return new WaitForSeconds (2.0f);

                if (freePositions.Contains (objPositions [newIndex - 2])) {

                toPosition = new Vector3(objPositions[newIndex - 2], startTrans.position.y, startTrans.position.z );
                yield return StartCoroutine(moveObjToLeft(startTrans, toPosition, 1.0f, newIndex - 2));

                }

                else if (!freePositions.Contains (objPositions [newIndex - 2])) {
                    yield return new WaitForSeconds (3.0f);

                    toPosition = new Vector3(objPositions[newIndex - 2], startTrans.position.y, startTrans.position.z );
                    yield return StartCoroutine(moveObjToLeft(startTrans, toPosition, 1.0f, newIndex - 2));


                }
            }
        }

        startTrans.position = toPosition;
        toPosition = new Vector3 (objPositions [newIndex], startTrans.position.y, startTrans.position.z);

        int waitTime = Random.Range (3, 5);
        yield return new WaitForSeconds (waitTime);

    }
}

【问题讨论】:

  • 如果不提供 lerp 代码,我们如何知道您的对象何时完成了 lerp?你不是新来的,你知道没有代码你不会得到合理的帮助。
  • @Programmer 我刚刚编辑了问题:)
  • 对象在while loop block has finished running. while (counter
  • 谢谢,解决了

标签: unity3d unity5


【解决方案1】:
IEnumerator LerpWithCompletionAction(Action onCompletion){
    while(Vector3.Distance(this.transform.position, this.target.position)<0.001f)       
    {
          // Lerp
          yield return null
    }
    if(onCompletion != null) { onCompletion(); }
}

检查使用距离,因为您不能真正依赖检查浮点比较。您可以降低检查值或增加检查值,无论它发生得太快还是因为太小而没有发生。

然后你这样调用:

void DisableColliders(){  // Disable your colliders }

void AnyMethod()
{
    StartCoroutine(LerpWithCompletionAction(DisableColliders));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    相关资源
    最近更新 更多