【问题标题】:How to instantiate GameObject at random collision free position?如何在随机无碰撞位置实例化 GameObject?
【发布时间】:2017-12-23 07:33:30
【问题描述】:

我正在使用 Unity 制作游戏。我在随机位置实例化(圆圈)GameObjects,它运行良好。我要做的是仅在不会与其他GameObjects 重叠的位置上进行实例化。我在互联网上找到的解决方案没有解决我的问题,我该怎么办?这可能吗?

【问题讨论】:

    标签: c# unity3d random gameobject


    【解决方案1】:

    好的。为了检测您的圆圈是否有空间,您需要使用对撞机或数学/体积方程。但是无论您采用哪种方式,您都需要参考一个位置(变换 x、y、z)来对一个区域进行采样并确定您的圆圈是否可以在那里生成。

    您可以执行以下操作之一:

    1. 像往常一样创建对象,但如果发生碰撞立即销毁对象。然后生成另一个。
    2. 将生成器游戏对象移动到执行与上述相同检查的位置,但只有在确定圆圈有空间时才会生成它。 (edit)然后禁用或移动生成器,您只需要这些对象之一即可完成所有生成操作。
    3. 让任何生成圆圈的类从一组预定义位置(矢量 3 或场景中现有的游戏对象)中挑选,然后执行上述检查之一。

    这取决于您的需求以及重叠的可能性。

    希望对您有所帮助。

    【讨论】:

    • 方法 2 更好,但应该改进以避免不必要的实例化/销毁 GO - spawner 是层次结构中的一个永远不会被销毁的游戏对象,它有一个圆形对撞机正确的半径,它用于通过将新的随机位置提供给它的Transform 来检查该位置是否没有其他对象 - 如果是,那么您可以实例化新的游戏对象,如果没有,请选择另一个随机位置,直到你会得到一个免费的。
    • 我同意,第二个方法比方法 1 更好,也更少浪费。我喜欢你的解决方案,让生成器对象四处移动以检查它是否是合适的生成位置。这有点像我在第三点上的想法,但经过深思熟虑。
    • 感谢您的回答!方法 2 最适合我的需求。所以你的意思是我创建了一个透明的游戏对象,如果在生成时没有 coliision,则销毁透明的游戏对象并在该位置生成真实的游戏对象。如果发生碰撞,请破坏透明的一个并尝试其他位置。我说的对吗?
    • 你的 spawner GO 只是一个只有 Circle Collider 2D 组件的 GO,所以它不会在屏幕上渲染任何东西。您生成随机位置,更改生成器的transform.position,并检查OnTriggerEnter2D 是否报告碰撞 - 如果没有,Instantiate 使用该位置的新游戏对象,如果是,生成新的随机生成位置和重复直到你得到一个空闲空间。
    • 此外,池中的每个对象都可以管理自己的“生成”,方法是在这样做之前检查它可以生成的位置。但要强调的是,您实际上不需要实例化对象,如果使用对象池,只需重新定位它。
    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多