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:不要每次需要更改精灵时都使用 GetComponent
和 Resources.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");
}
}
我正在为我的 2D 游戏中的农田创建预制件。因为我希望所有的地砖在用锄头敲击时都变成可耕地,所以我担心性能(因为一个场景中会有数百个这样的游戏对象)。
最好的办法是销毁地砖并在其位置实例化农场地砖,还是创建一个更通用的脚本附加到每个地砖(?),其状态如下:
GROUND, FARMABLE, PLANTED
,然后根据状态我改变行为并设置一个像这样的精灵:tile.GetComponent<Image>().sprite = Resources.Load<Sprite>(pathToSprite);
也许我错过了更好的选择,但这些是我能想到的。
试试这个:{ tile.GetComponent(/).sprite = Resources.Load(pathtosprite); }
在运行时销毁和实例化数百个游戏对象会导致灾难、内存碎片和 GC 失控,这会降低性能。
第二种解决方案更好。在您的游戏逻辑中使用一个 enum
表示一个方块的所有可能状态,然后相应地更改 Sprite Renderer
组件的 Sprite
字段。
PSA:不要每次需要更改精灵时都使用 GetComponent
和 Resources.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");
}
}