如何在不实例化和销毁的情况下切换GameObject?

时间:2018-09-15 11:34:34

标签: c# unity3d

我正在创建一个无限的2D地形生成器,并且其中包含各种图块/块。另外,某些磁贴具有特殊功能,这些功能在其自己的脚本中进行了描述。

例如,一个蜂巢砖可以在其周围产生蜜蜂。如果附近有草等,土瓦会变成草。

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

现在,我可以轻松地对所有瓷砖进行预制,并在加载新地形时实例化预制件,并在卸载时销毁预制件,但是对于垃圾收集器来说,这肯定不是一个好主意,因为这些瓷砖会生成在几秒钟内达到100秒的数量。

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


所以,这是我的问题:

我有一个上面贴有污垢脚本的泥瓦。经过一段时间后,我想将其转换为具有Grass脚本组件但没有Dirt的草块。

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

2 个答案:

答案 0 :(得分:3)

您说池化不是一种选择,但是我建议使用lazy loading为池创建对象。您可以在不需要大量时间的情况下为首次出现创建这些对象,并在需要时创建更多对象。

答案 1 :(得分:1)

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

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

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

让我知道它是否有帮助。