C# 统一2D:摧毁+;实例化新游戏对象与更改状态和精灵

C# 统一2D:摧毁+;实例化新游戏对象与更改状态和精灵,c#,performance,unity3d,unity5,C#,Performance,Unity3d,Unity5,我在我的2D游戏中为农田创建预制件。因为我想用锄头把所有的地砖都变成可耕种的土地,所以我担心性能(因为一个场景中会有数百个这样的游戏对象) 最好的做法是销毁地面互动程序并在其位置实例化农场互动程序,还是创建一个附加到每个地面互动程序(?)的更通用脚本更好,该脚本具有如下状态: GROUND, FARMABLE, PLANTED ,然后根据状态更改行为并设置一个精灵,如:tile.GetComponent().sprite=Resources.Load(pathToSprite) 也许我错过了一

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

最好的做法是销毁地面互动程序并在其位置实例化农场互动程序,还是创建一个附加到每个地面互动程序(?)的更通用脚本更好,该脚本具有如下状态:

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分配引用。