2017-06-11 114 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