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:在同一帧不重叠的情况下生成对象的问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

unity 2d 重叠半透明对象

unity啥情况下gc不能自动回收垃圾对象

unity中动态生成的Button和TextField重叠后,不能点击怎么办?

Unity2D重叠圆LayerMask不起作用

防止热键重叠 [Unity]

unity物理引擎浅谈