C# 统一2D:摧毁+;实例化新游戏对象与更改状态和精灵
我在我的2D游戏中为农田创建预制件。因为我想用锄头把所有的地砖都变成可耕种的土地,所以我担心性能(因为一个场景中会有数百个这样的游戏对象) 最好的做法是销毁地面互动程序并在其位置实例化农场互动程序,还是创建一个附加到每个地面互动程序(?)的更通用脚本更好,该脚本具有如下状态:C# 统一2D:摧毁+;实例化新游戏对象与更改状态和精灵,c#,performance,unity3d,unity5,C#,Performance,Unity3d,Unity5,我在我的2D游戏中为农田创建预制件。因为我想用锄头把所有的地砖都变成可耕种的土地,所以我担心性能(因为一个场景中会有数百个这样的游戏对象) 最好的做法是销毁地面互动程序并在其位置实例化农场互动程序,还是创建一个附加到每个地面互动程序(?)的更通用脚本更好,该脚本具有如下状态: GROUND, FARMABLE, PLANTED ,然后根据状态更改行为并设置一个精灵,如:tile.GetComponent().sprite=Resources.Load(pathToSprite) 也许我错过了一
GROUND, FARMABLE, PLANTED
,然后根据状态更改行为并设置一个精灵,如:tile.GetComponent().sprite=Resources.Load(pathToSprite)代码>
也许我错过了一个更好的选择,但这些是我能想到的。试试这个:{tile.GetComponent(/).sprite=Resources.Load(pathtosprite);}试试这个:{tile.GetComponent(/).sprite=Resources.Load(pathtosprite);}在运行时破坏和实例化数百个游戏对象是一个灾难,内存碎片和GC失控,这将破坏性能
第二个解决方案更好。使用enum
查找游戏逻辑中磁贴的所有可能状态,然后相应地更改Sprite Renderer
组件的Sprite
字段
PSA:不要使用GetComponent
和资源。每次需要更改精灵时,加载,获取对sprite呈现程序组件和sprite[]
数组的引用,该数组包含要在唤醒中使用的所有可能状态图像,然后在需要时使用这些引用来更改精灵图像
编辑:在评论中回答您的问题
- 确保
精灵
都在您的资源
文件夹中
项目中,它们可以位于子文件夹中,即:Resources/Sprites
- 检查
路径
字符串是否正确,即如果精灵资源被称为圆圈
,并且它位于资源/Sprites
文件夹中,
路径
必须是“精灵/圆圈”
代码示例:
public class MyClass : MonoBehaviour {
Sprite[] spritesArray = new Sprite[10];
void Awake() {
spritesArray[0] = Resources.Load<Sprite>("Sprites/Circle");
}
}
公共类MyClass:MonoBehavior{
精灵[]精灵数组=新精灵[10];
无效唤醒(){
精灵数组[0]=Resources.Load(“精灵/圆圈”);
}
}
在运行时销毁和实例化数百个游戏对象会导致灾难、内存碎片和GC失控,这将破坏性能
第二个解决方案更好。使用enum
查找游戏逻辑中磁贴的所有可能状态,然后相应地更改Sprite Renderer
组件的Sprite
字段
PSA:不要使用GetComponent
和资源。每次需要更改精灵时,加载,获取对sprite呈现程序组件和sprite[]
数组的引用,该数组包含要在唤醒中使用的所有可能状态图像,然后在需要时使用这些引用来更改精灵图像
编辑:在评论中回答您的问题
- 确保
精灵
都在您的资源
文件夹中
项目中,它们可以位于子文件夹中,即:Resources/Sprites
- 检查
路径
字符串是否正确,即如果精灵资源被称为圆圈
,并且它位于资源/Sprites
文件夹中,
路径
必须是“精灵/圆圈”
代码示例:
public class MyClass : MonoBehaviour {
Sprite[] spritesArray = new Sprite[10];
void Awake() {
spritesArray[0] = Resources.Load<Sprite>("Sprites/Circle");
}
}
公共类MyClass:MonoBehavior{
精灵[]精灵数组=新精灵[10];
无效唤醒(){
精灵数组[0]=Resources.Load(“精灵/圆圈”);
}
}
请告诉我你为什么投反对票?我是新来的,不知道这个问题出了什么问题。请告诉我你为什么投反对票?我是新来的,不确定这个问题出了什么问题好吧,请清楚地解释这个问题,因为像我这样的人甚至不理解这意味着什么……这个问题已经足够清楚了。你的答案质量很低,我建议你删除它。好的,请清楚地解释这个问题,因为像我这样的人甚至都不理解这意味着什么……这个问题已经足够清楚了。您的答案质量很低,我建议您删除它。如果我尝试调用cachedSprites[0]=Resources.Load(“path”)
在Start()中,我得到一个NullReferenceException:Object reference未设置为对象的实例
我启动数组,如:private Sprite[]cachedSprites
,我是否遗漏了什么?谢谢。它还可以使其公开并从编辑器中的参考资料中拖放精灵。是的,显然您可以通过public
或[SerializeField]private
公开数组,并通过Inspector分配引用。如果我尝试调用cachedSprites[0]=resources.Load(“路径”)
在Start()中,我得到一个NullReferenceException:Object reference未设置为对象的实例
我启动数组,如:private Sprite[]cachedSprites
,我是否遗漏了什么?谢谢。它还可以使其公开并从编辑器中的参考资料中拖放精灵。是的,显然您可以通过public
或[SerializeField]private
公开数组,并通过Inspector分配引用。