Unityで何かを作ってみる その10

Unity

今回は前回問題となった箇所(野菜が追加される毎に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();
        }
    }
}

崩れると、画面が初期化されるようになりますが、このままだと意図しない動作になりそうだなと、ソースコードの段階で思いましたので、修正方法を考えたいと思います。

Unity
スポンサーリンク
northprintをフォローする
おおよそ北の方向から

コメント