2017-06-11 115 views
1

我在2D游戏中创建农田预制件。由于我希望所有的地面砖在用锄头击打时变成可耕地,我担心表现(因为场景中会有数百个这样的GameObjects)。Unity 2D:销毁+实例化新游戏对象vs更改状态和精灵

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

GROUND, FARMABLE, PLANTED 

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

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

+0

请让我知道你为什么downvote?我是新来的,不确定这个问题有什么问题 – Majs

回答

2

在运行时毁灭并实例化数百个游戏对象是灾难,内存碎片和GC疯狂的秘诀,这将导致性能下降。

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

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

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

  • 要确保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"); 
    } 
} 
+0

如果我尝试调用'cachedSprites [0] = Resources.Load (“path”);'在开始()我得到一个'NullReferenceException:对象引用未设置为对象的实例' – Majs

+0

我启动数组:'私人雪碧[] cachedSprites',我错过了什么? – Majs

+0

增加了一个编辑来回答。 – Galandil

-2

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

+2

什么?这不是我在问什么.. – Majs

+0

好吧请清楚地解释问题,因为像我这样的人不明白什么,甚至意味着... –

+0

这个问题是很清楚的。你的答案质量很低,我建议你删除它。 – Lestat