今回は前回問題となった箇所(野菜が追加される毎にList変数が追加されてしまう問題)の修正と、画面外に落ちた際にゲームオーバーにする対応を行います。
GameManagerに野菜のリストを持たせる
野菜のクラスに野菜の種類のリストを持たせているせいで、とてもメモリに良くない実装になっています。
これをGameManagerにプロパティとして持たせることで、Listの生成を一度だけにします。
GameManager.cs
-略- //野菜のリスト List _vegetableList = new List(); public List VegetableList { get { return _vegetableList; } } -略- void Awake() { if (_instance == null){ _instance = this; } _maxHeight = -100; //野菜のリスト _vegetableList.Add("cabbage"); _vegetableList.Add("tomato"); } -略-
VegetableSpriteからは、リストの作成とAwakeの処理を無くします。
野菜の決定時にGameManagerを参照するようにします。
VegetableSprite.cs
public void SetImage() { //野菜の決定 string vegetableName = GameManager.Instance.VegetableList[Random.Range(0, GameManager.Instance.VegetableList.Count)]; _sprite.sprite = (Sprite)Resources.Load("images/" + vegetableName , typeof(Sprite)); }
これで、Listの作成は1回にすることが出来ました。
パフォーマンスも元通りです。
野菜が画面外に落ちた際、リセットして最初の状態にする
野菜が画面外に落ちたらゲームオーバーです。
今回、ゲームオーバーの演出はまだ作っていないので、画面をリセットして最初の状態に戻します。
GameManager.csに、野菜のオブジェクトを格納しておき、リセット時に全てDestroyします。
GameManager.cs
-略- //初期化用に野菜を格納しておく用 List _vegetableSpriteList = new List(); -略- //ゲームオーバー public void GameOver() { //初期化 Initialize(); } //初期化 void Initialize() { //野菜を消す foreach (VegetableSprite sprite in _vegetableSpriteList){ Destroy(sprite.gameObject); } _vegetableSpriteList.Clear(); //カメラ位置を戻す Camera.main.transform.localPosition = new Vector3(0, 0, -10); _maxHeight = -100; //野菜の生成 CreateVegetable(); } -略-
VegetableSprite側では、画面外に出た場合、GameManagerのGameOverを呼ぶようにします。
VegetableSprite.cs
-略- void Update(){ -略- if (!GetComponent().isVisible && _state == State.move) { _state = State.destroy; GameManager.Instance.GameOver(); } } }
崩れると、画面が初期化されるようになりますが、このままだと意図しない動作になりそうだなと、ソースコードの段階で思いましたので、修正方法を考えたいと思います。
コメント