Unity:在同一帧不重叠的情况下生成对象的问题[重复]
Posted
技术标签:
【中文标题】Unity:在同一帧不重叠的情况下生成对象的问题[重复]【英文标题】:Unity: Problem spawning objects without overlapping at the same frame [duplicate] 【发布时间】:2022-01-21 03:47:34 【问题描述】:我想用这段代码生成一些球(使用 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);
【问题讨论】:
这有帮助吗? ***.com/q/58175470/1092820 是的@Ruzihm,修复了它。谢谢你。只检查选项 Edit>ProjectSettings>Phisics2D>AutoSyncTransform 请使用正确的标签!请注意,unityscript
是或更好的是曾经是一种 javascript 风格,类似于早期 Unity 版本中使用的自定义语言,并且现在已经不推荐使用了!您的代码显然在c#
..
【参考方案1】:
您可以尝试使用Physics.SyncTransforms。或Physics.Simulate 实际上,这样做并不是一个好习惯,它会对性能造成很大影响。
如果您不需要立即生成球体,在单个帧中,您可以将代码放入协程中,生成每个球后,等待物理更新:yield return new WaitForFixedUpdate();
如果您的所有球体都具有相同的比例,您可以轻松地使用数学而不是物理。为此,您只需检查当前点到所有其他点的距离。
如果您有大量的点,它可能会很昂贵 - 因此您可以优化它,保持您的点排序 - 如果您的点数组已排序,您只需要比较 2 个距离,下一个更大,前一个更小。但实施起来可能很棘手。 此外,如果您要比较许多距离,请不要使用 Vector2.magnitude - 使用 Vector2.sqrMagnitude,它会快得多。
【讨论】:
非常感谢您的回答,很好的解释。我认为一次不会超过 20 个球,所以我将使用 SyncTransforms以上是关于Unity:在同一帧不重叠的情况下生成对象的问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章