独習 Unity アプリ開発

独習でスマフォ向けアプリ開発を勉強中

Unity で テトリス風ゲームを作ってみる(実装編)#9

 Unity Version 2022.3.4

 

前回の続き


前回はスコアとレベルについて説明した。今回はゲームオーバー画面とリスタートについて説明する。

 

GameOver 画面


GameOver 画面はシンプルにテキストコンポーネントとボタンコンポーネントのみで構成。

GameOver 画面

 

Restart ボタンのコールバックにGameControl.OnRestartClick 関数を設定。ボタンが押されるとこのコールバックが呼ばれるので、そこでリスタート処理を実行するようにする。

Restart Button 設定

 

リスタート処理では、各種データとゲーム中に生成したテトリミノオブジェクトとブロックオブジェクトをクリアしてから、次ゲーム開始に備えてテトリミノの準備し、ゲームオーバー UIを消して、ゲームプレイ UI を表示する。最後にゲームステートをDroping に変更すると、ゲームか開始される。

 

GameControl.cs の抜粋

  1.   public void OnRestartClick () {
  2.     _levelScore.Reset();
  3.     _field.DestroyAllBlocks();
  4.     _nextArea.DestroyNextTetrimino();
  5.  
  6.     PrepareNextTetrimino();
  7.     _gamePlayPanel.SetActive(true);
  8.     _gameOverPanel.SetActive(false);
  9.     _state = State.Droping;
  10.   }

 

LevelScore クラスのリセットは、変数を初期化してスコア、レベルのText コンポーネントを初期値でアップデートすれば終了。

LevelScore.cs の抜粋

  1.   public void Reset () {
  2.     _score = 0;
  3.     _level = 1;
  4.     _deletedLineCount = 0;
  5.     UpdateScoreText();
  6.     UpdateLevelText();
  7.   }

 

Field クラスは、子オブジェクトとしてフィールド上のブロックとテトリミノを保持している。リスタート時はこれらのオブジェクトを削除する必要がある。子ブロックオブジェクトは、List クラスの_blocks に保持しているのでこれらをすべてDestroy すればよい。テトリミノは、テトリミノ自身も子オブジェクトとしてブロックを持っているため、テトリミノのブロック削除用関数 DestroyBlocks をコールした後に、テトリミノオブジェクトをDestroy するようにする(親のテトリミノオブジェクトの削除だけでよいかも??)

Field.cs の抜粋

  1.   // Destroy All Block Objects include Field blocks.
  2.   public void DestroyAllBlocks () {
  3.     DestroyTetrimino();
  4.  
  5.     foreach (var block in _blocks) {
  6.       Destroy(block);
  7.     }
  8.     _blocks.Clear();
  9.   }
  10.     
  11.   private void DestroyTetrimino () {
  12.     _tetrimino.DestroyBlocks();
  13.     Destroy(_tetrimino.gameObject);
  14.   }

 

NextArea クラスもテトリミノオブジェクトを子オブジェクトとして持っているため(_next 変数)、Field クラスと同様にTetrimino クラスのDestroyBlocks をコールした後に、テトリミノオブジェクト自身を削除する。

NextArea.cs の抜粋

  1.   public void DestroyNextTetrimino () {
  2.     if (_next != null) {
  3.       _next.DestroyBlocks();
  4.       Destroy(_next.gameObject);
  5.       _next = null;
  6.     }
  7.   }

 

Tetrimino クラスのDestroyBlocks 関数は、子オブジェクトのブロックオブジェクトを全てDestroy する。ブロックオブジェクトは List クラスの_blockPrefabs に予め設定されている。

Tetrimino.cs の抜粋

  1.   public void DestroyBlocks () {
  2.     foreach (var block in _blockPrefabs) {
  3.       Destroy(block);
  4.     }
  5.     _blockPrefabs.Clear();
  6.   }

 

以上で、ゲーム実行中に生成されたテトリミノとブロックオブジェクトを全て削除でき、まっさらな状態からゲームを再開することができる。

 

次の記事


from20150817.hatenablog.com

 

 


目次に戻る