Unity 2D:销毁+实例化新游戏对象与更改状态和精灵

Unity 2D: Destroy + Instantiate new GameObject vs Changing state and sprite

我正在为我的 2D 游戏中的农田创建预制件。因为我希望所有的地砖在用锄头敲击时都变成可耕地,所以我担心性能(因为一个场景中会有数百个这样的游戏对象)。

最好的办法是销毁地砖并在其位置实例化农场地砖,还是创建一个更通用的脚本附加到每个地砖(?),其状态如下:

GROUND, FARMABLE, PLANTED

,然后根据状态我改变行为并设置一个像这样的精灵:tile.GetComponent<Image>().sprite = Resources.Load<Sprite>(pathToSprite);

也许我错过了更好的选择,但这些是我能想到的。

试试这个:{ tile.GetComponent(/).sprite = Resources.Load(pathtosprite); }

在运行时销毁和实例化数百个游戏对象会导致灾难、内存碎片和 GC 失控,这会降低性能。

第二种解决方案更好。在您的游戏逻辑中使用一个 enum 表示一个方块的所有可能状态,然后相应地更改 Sprite Renderer 组件的 Sprite 字段。

PSA:不要每次需要更改精灵时都使用 GetComponentResources.Load,获取对 Sprite Renderer 组件和 Sprite[] 的引用包含所有可能在 Awake 中使用的状态图像的数组,然后在需要时使用这些引用更改精灵图像。

编辑:在评论中回答您的问题。

  • 确保 Sprites 都在您的 Resources 文件夹中 项目,它们可以在子文件夹中,即:Resources/Sprites.
  • 检查 path 字符串是否正确,即如果精灵资产名为 Circle,并且它位于 Resources/Sprites 文件夹中, path 必须是 "Sprites/Circle".

代码示例:

public class MyClass : MonoBehaviour {

    Sprite[] spritesArray = new Sprite[10];

    void Awake() {
        spritesArray[0] = Resources.Load<Sprite>("Sprites/Circle");
    }
}