Unity:在同一帧不重叠的情况下生成对象的问题
Unity: Problem spawning objects without overlapping at the same frame
我想用这段代码生成一些球(使用 CircleCollider2d 和静态 Rigidbody2D)。我使用一个按钮来查看它是否有效,当我使用它时一切正常。但是当我使用循环在单个帧中创建一堆球时,它们看起来是重叠的。我认为这是因为您必须等待物理更新,但我需要同时生成所有球。有什么想法或解决方案吗?
这是我的第一个问题,我的英语说得不好,但我希望我已经解释清楚了。非常感谢
public void CreatePointBall()
{
Vector2 pos;
float x, y;
int tries = 0;
do
{
tries++;
x = Random.Range(MIN_POS_X, MAX_POS_X);
y = Random.Range(MIN_POS_Y, MAX_POS_Y);
pos = new Vector2(x, y);
} while (Physics2D.OverlapCircle(pos, radius, LayerMask.GetMask("PointBall")) != null && tries < MAX_TRIES);
if(tries == MAX_TRIES) Debug.Log("MAX TRIES WITHOUT A CORRECT POS");
GameObject go = Instantiate(pointBallPrefab);
go.name = "PointBall";
go.transform.parent = transform;
go.transform.position = pos;
pointBallsList.Add(go);
}
你可以尝试使用Physics.SyncTransforms. Or Physics.Simulate
实际上,这样做并不是一个好的做法,它会严重损害性能。
如果您不需要立即生成球体,在单帧中,您可以将代码放入协程中,并在生成每个球体后等待物理更新:yield return new WaitForFixedUpdate();
如果你所有的球体都有相同的比例,你可以很容易地使用数学而不是物理。为此,您只需要检查从当前点到所有其他点的距离。
它可能很昂贵,如果你有大量的点 - 所以你可以优化它,保持你的点排序 - 如果你的点数组被排序,你只需要比较 2 个距离,下一个更大的和前一个更小。但实施起来可能很棘手。
此外,如果您要比较许多距离,请不要使用 Vector2.magnitude - 使用 Vector2.sqrMagnitude,它会快得多。
我想用这段代码生成一些球(使用 CircleCollider2d 和静态 Rigidbody2D)。我使用一个按钮来查看它是否有效,当我使用它时一切正常。但是当我使用循环在单个帧中创建一堆球时,它们看起来是重叠的。我认为这是因为您必须等待物理更新,但我需要同时生成所有球。有什么想法或解决方案吗?
这是我的第一个问题,我的英语说得不好,但我希望我已经解释清楚了。非常感谢
public void CreatePointBall()
{
Vector2 pos;
float x, y;
int tries = 0;
do
{
tries++;
x = Random.Range(MIN_POS_X, MAX_POS_X);
y = Random.Range(MIN_POS_Y, MAX_POS_Y);
pos = new Vector2(x, y);
} while (Physics2D.OverlapCircle(pos, radius, LayerMask.GetMask("PointBall")) != null && tries < MAX_TRIES);
if(tries == MAX_TRIES) Debug.Log("MAX TRIES WITHOUT A CORRECT POS");
GameObject go = Instantiate(pointBallPrefab);
go.name = "PointBall";
go.transform.parent = transform;
go.transform.position = pos;
pointBallsList.Add(go);
}
你可以尝试使用Physics.SyncTransforms. Or Physics.Simulate 实际上,这样做并不是一个好的做法,它会严重损害性能。
如果您不需要立即生成球体,在单帧中,您可以将代码放入协程中,并在生成每个球体后等待物理更新:
yield return new WaitForFixedUpdate();
如果你所有的球体都有相同的比例,你可以很容易地使用数学而不是物理。为此,您只需要检查从当前点到所有其他点的距离。
它可能很昂贵,如果你有大量的点 - 所以你可以优化它,保持你的点排序 - 如果你的点数组被排序,你只需要比较 2 个距离,下一个更大的和前一个更小。但实施起来可能很棘手。 此外,如果您要比较许多距离,请不要使用 Vector2.magnitude - 使用 Vector2.sqrMagnitude,它会快得多。