这个问题有两个部分 - 第一部分是运行嵌套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:
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;
}