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

时间:2017-06-11 13:22:49

标签: c# performance unity3d unity5

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

最好的办法是破坏地面图块并在其位置实例化一个农场图块,还是最好创建一个附加到每个地面图块(?)的更通用的脚本,其状态如下: / p>

GROUND, FARMABLE, PLANTED

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

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

2 个答案:

答案 0 :(得分:2)

在运行期间销毁和实例化数百个游戏对象是导致灾难,内存碎片和GC疯狂的一个因素,这会破坏性能。

第二种解决方案更好。对游戏逻辑中磁贴的所有可能状态使用enum,然后相应地更改Sprite组件的Sprite Renderer字段。

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");
    }
}

答案 1 :(得分:-2)

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