【问题标题】:How to switch GameObjects without Instantiate and Destroy?如何在没有实例化和销毁的情况下切换游戏对象?
【发布时间】:2018-09-15 11:34:33
【问题描述】:

我正在创建一个无限的 2d 地形生成器,其中包含各种瓷砖/块。此外,某些图块具有在其自己的脚本中描述的特殊功能。

例如,蜂箱瓷砖可以在其周围生成蜜蜂。如果附近有草等,泥瓦会变成草。

现在,所有这些图块几乎都是相同的游戏对象,唯一的区别是它们使用的精灵(图标)和描述它们行为的脚本。

现在我可以轻松地制作所有瓦片的预制件,并在加载新地形时实例化预制件并在卸载时销毁预制件,但这对于垃圾收集器肯定不是一个好主意,因为这些瓦片会生成100 秒的订单。

此外,对象池不是在这里是一个选项,因为我需要在开始时创建太多对象(成千上万)。


所以,这是我的问题:

我有一块泥土瓷砖,上面有泥土脚本。过了一段时间,我想将其转换为具有草脚本组件但没有污垢的草瓦。

除了删除 Dirt 脚本和添加 Grass 脚本之外,还有其他更好的方法来转换这些 GameObjects 吗?另外,大量添加和移除组件的效率如何?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您说池不是一个选项,但我建议使用lazy loading 为池创建对象。您为第一次出现创建了那些不需要太多时间和进度的内容,如果需要,您可以创建更多。

    【讨论】:

      【解决方案2】:

      您可以创建一个包含不同类型图块的父游戏对象。然后根据需要激活/停用孩子。
      您的层次结构如下所示:

      Tile (Holds switching functionality)
       |->Dirt Tile (Holds 'Dirt' functionality)
       |->Grass Tile (Holds 'Grass' functionality)
       |->Water Tile (Holds 'Water' functionality)
       |-> ...
      

      例如,当您希望磁贴为Dirt 时,您激活Tile 下的Dirt Tile 游戏对象并停用所有其他子对象。

      让我知道它是否有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多