今回は前回問題となった箇所(野菜が追加される毎に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();
}
}
}
崩れると、画面が初期化されるようになりますが、このままだと意図しない動作になりそうだなと、ソースコードの段階で思いましたので、修正方法を考えたいと思います。

コメント