2017-06-11 12 views
1

私は2Dゲームで農地用のプレハブを作成しています。鍬で叩かれると、すべての陸上タイルが耕作可能な土地になることを望んでいるので、私はパフォーマンスについて心配しています(シーン内に数百のゲームオブジェクトが存在するため)。Unity 2D:新しいGameObjectを破棄+インスタンス化する状態とスプライトを変更する

地面のタイルを破棄し、その位置に農場のタイルをインスタンス化するのが最善の方法でしょうか、またはすべての地形タイル(?)に接続されたより一般的なスクリプトを作成する方が良いでしょうか?その後、

GROUND, FARMABLE, PLANTED 

、私は行動を変えるなどのスプライトを設定状態に応じて:たぶん私は良いオプションが欠落していますが、これらは私が考えることができるものですtile.GetComponent<Image>().sprite = Resources.Load<Sprite>(pathToSprite);

+0

あなたはdownvoteなぜ私に知らせてください!私はここに新しい、この質問で何が間違っているかわからない – Majs

答えて

2

ランタイム中にDestroyinを実行して何百ものゲームオブジェクトをインスタンス化することは、パフォーマンスを低下させる災害、メモリの断片化、GCのワイルドカードのレシピです。

もう1つ解決策は良い方法です。ゲームロジックのタイルのすべての可能な状態にenumを使用し、それに応じてSprite RendererコンポーネントのSpriteフィールドを変更します。

PSA:GetComponentResources.Loadあなたはこれらの参照を使用し、その後、スプライトを変更Sprite RendererコンポーネントへとAwakeで使用するすべての可能な状態の画像が含まれているSprite[]配列への参照を取得し、する必要があるたびに使用しないでください。必要に応じてスプライト画像を変更します。

編集:コメントにあなたの質問に答えてください。

  • はすなわち、Spritesはすべてあなたの プロジェクトのResourcesフォルダ内にある、彼らはサブフォルダにあることができることを確認してください。:Resources/Sprites。スプライト資産がCircleと呼ばれ、それがResources/Spritesフォルダにありますされている場合path文字列が正しい
  • チェックは、すなわち、 path"Sprites/Circle"でなければなりません。

コード例:

public class MyClass : MonoBehaviour { 

    Sprite[] spritesArray = new Sprite[10]; 

    void Awake() { 
     spritesArray[0] = Resources.Load<Sprite>("Sprites/Circle"); 
    } 
} 
+0

'()' NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません '(" path ");'を呼び出そうとすると、 – Majs

+0

のように配列を開始します。 : 'プライベートSprite []キャッシュされたSprites'、何か不足していますか? – Majs

+0

回答を編集しました。 – Galandil

-2

これを試してください:{tile.GetComponent(/)。sprite = Resources.Load(pathtosprite); }

+2

何ですか?これは私が聞いていることではありません.. – Majs

+0

あなたが私のような人たちが何を意味するのかわからないので、質問を明確に説明してください... –

+0

質問は十分に明確です。あなたは答えが非常に低品質です、私はそれを削除することをお勧めします。 – Lestat

関連する問題