Unityに関連する記事です



設計


 エリアの進行管理についてはGameManagerクラスに実装していますので、この手順ではステージの進行管理と、
それにまつわる処理(ステージのクリア判定、ゲームのクリア判定、次のステージへの遷移処理など)について実装を行います。


<実装動画 ゲームクリア判定>
https://gyazo.com/e2f878244debf1240aed35b63fcde4bf


ステージの進行状態
 ステージ内の全エリアをクリア
   ↓
 GameDataクラスにクリアしたステージの番号を保存
   ↓
 <ゲームのクリア判定 全ステージクリア?>  → 全ステージをクリアしている場合には、ゲームクリア
   ↓
 (必要ならば)全ステージクリアしていない場合には、次のステージ開始前のイベントを再生
   ↓
 次のステージをスタート
   ↓
 この手順をゲームクリアするまで返す。
 


実装の手順


 実装手順は以下の通りです。

 1.GameData スクリプトを作成する
 2.GameData ゲームオブジェクトを作成して、GameDataスクリプトをアタッチする
 3.GameManagerクラスを修正する
 4.ゲームを実行して動作を確認する


新しく学習する内容


 ・if文の条件式に戻り値を持つメソッドを利用する場合の実装例


1.GameData スクリプトを作成する


 シーン遷移を行った際にクリアしたステージの番号を保持できるように、DontDestroyOnLoadメソッドを利用したクラスを作成します。
現在 GameManagerクラスにて管理している currentStageNo 変数をこちらのクラスに移動させて、こちらで管理を行うようにします。
シーン遷移を行っても値が保持されますので、このクラスを参照することにより、必要なステージの番号を参照することが可能になります。

 参照しやすいように、GameDataクラスはシングルトン・デザインパターンにて作成を行います。


GameData.cs



2.GameData ゲームオブジェクトを作成して、GameDataスクリプトをアタッチする


 ヒエラルキーの何もない部分で右クリックをしてメニューを表示し、Create Empty を選択します。
ヒエラルキーに空のゲームオブジェクトが1つ作成されますので、名前を GameData に変更します。

 先ほど作成した GameData スクリプトを GameData ゲームオブジェクトにドラッグアンドドロップしてアタッチしてください。


GameData ゲームオブジェクト インスペクター画像


 CurrentStageNo 変数はゲームの進行に合わせてカウントアップされる値ですので、この値は 0 のままで構いません。
0 = ステージ1、1 = ステージ2、となり、この値をステージデータのインデックスの値と連動させます。(ステージデータ上のステージ1は、インデックス 0 番です)

 BattleTime 変数はまだ未使用です。もしもエリア内やステージ内にゲームの残り時間を設定する場合に利用できます。
この値も現在は 0 のままで構いません。


3.GameManagerクラスを修正する


 currentStageNo 変数を GameData クラスへ移動しましたので、この変数はコメントアウトします。
それに合わせて、InitStageメソッド内のこの変数を利用していた部分を GameData クラスを参照する書式
(currentStageNo => GameData.instance.currentStageNo)に変更します。

 GameDataクラスはシーン遷移しても破棄されないオブジェクトになっていますので、クリアしているステージの番号が保持されています。
この値を参照することによって、ステージクリア後にいずれのシーンに遷移していても、次に用意するステージの番号を参照してゲームを進行することが可能になります。 

 ステージクリア関連の処理として、新しくメソッドを3つ追加しています。ステージのクリア判定を行うメソッドや、
ステージの遷移、別のシーンへの遷移などの処理を追加するメソッドになります。

 Updateメソッドの処理を修正して、これらの追加したメソッドを実行してステージクリアの判定やゲームクリアの処理に、処理をつなげていきます。


GameManager.cs



<if文の条件式に戻り値を持つメソッドを利用する場合の実装例>


 if文には戻り値を持つメソッドを利用することで、その戻り値の値を評価して判定を行うことが出来ます。

  // ステージをクリアしたか確認
  if (CheckStageClear() == true) {  // true かどうか判定。書式は、if(CheckStageClear()){ でもよい
      // クリアしていれば、次のステージをスタート
      NextStage();
  } else {
      // クリアしていなければ、次のエリアをスタート                 
      SetUpNextArea();
  }

 ここでは、CheckStageClearメソッドを実行し、このメソッドの戻り値が bool 型であるため、その戻り値を評価して条件分岐を行います。

    /// <summary>
    /// ステージのクリア判定
    /// </summary>
    private bool CheckStageClear() {

        // エリアの番号がステージの最後のエリアの番号かどうか確認する
        if (areaIndex >= currentStageData.areaDatas.Count) {
            return true;
        }
        return false;
    }

 CheckStageClear メソッドには bool 型の戻り値がありますので、このメソッドの処理結果が、if文の条件式に対しての評価対象となり、条件を満たすか、満たしていないかを判定します。

 処理の順番としては

  if 文に処理が到達する → CheckStageClearメソッドを実行し、その結果であるbool型の値が if 文内の条件式に戻る → 戻り値を if 文が評価して条件分岐する

 という流れになります。


4.ゲームを実行して動作を確認する


 最初にゲームクリアの判定の確認を行います。ステージデータを1つ分のステージ情報にしてください。エリアの数は自由です。

 ステージに登録されているエリアをすべてクリアして右端の移動範囲外へ侵入した場合、ゲームクリアの判定が行われます。


<実装動画>
https://gyazo.com/e2f878244debf1240aed35b63fcde4bf


 
 次に。ステージクリアの判定後に、次のステージに遷移する処理の確認を行います。
ステージデータに2つ分のステージ情報を追加してください。エリアの数は自由です。


StageList インスペクター画像



Stage 0 エリア 0



Stage 0 エリア 1



Stage 1 エリア 0



Stage 1 エリア 1



 1つ目のエリアを全部クリアした状態で次のエリアに移ろうとすると、そこでクリアの判定が発生します。
すべてのステージはクリアしていませんので、ここでは次のステージに移行する判定になります。


Console画像



 以上でこの手順は終了です。お疲れ様でした。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます