Unityに関連する記事です

 何回も繰り返してゲームを遊べるようにするために、ゲームのサイクル化を行っていきます。

 この手順では、ゲーム中に生成される空中床や敵などのオブジェクトの制御処理を実装していきます。


<実装動画 タイトル表示中は空中床や敵などのオブジェクトを生成しない>
https://gyazo.com/acec6aae752b92340dc64fab14be174f


<実装動画 ゴール地点が生成されたら、空中床や敵などのオブジェクトを生成しない>
https://gyazo.com/56e1f6a551d7fd42307467c50b03476e


手順25 ー自動生成の制御処理の実装ー
43.オブジェクトの生成の制御処理を追加する(ゲームスタートするまで生成しない。ゲームクリアしたら生成しない)



 新しく学習する内容は以下になります。

・処理の流れを読み解く
・for 文と配列の組みあわせ処理



43.オブジェクトの生成の制御処理を追加する(ゲームスタートするまで生成しない。ゲームクリアしたら生成しない)

1.設計


 現在はタイトル表示のままでしばらく待っていると、ゲーム内のオブジェクトの生成処理が実行されているため、
敵や空中床などのオブジェクトが自動生成されます。

 ゲームの開始前にこれらのオブジェクトが生成されてしまうのを制御して、
タイトル表示が消えてから始めてオブジェクトの生成が行われるように処理を追加します。

 またゴール地点が生成されてからもずっとオブジェクトが生成されてしまうと
その場でゴールを通過せずにコインだけを集めてしまうことが出来てしまいますので
こちらも、ゴール地点が生成されるタイミングに合わせて、オブジェクトを自動生成しないように制御処理を追加します。

 


2.RandomObjectGenerator スクリプトを修正する


 GameDirector からの命令によって、自動生成を停止したり、あるいは生成をスタートしたりする処理を追加します。


RandomObjectGenerator.cs

 <= クリックすると開きます



 設定の変更はありませんので、スクリプトの修正が完了すれば、この手順は完成です。


3.FloorGenerator スクリプトを修正する


 GameDirector からの命令によって、自動生成を停止したり、あるいは生成をスタートしたりする処理を追加します。


FloorGenerator.cs

 <= クリックすると開きます



 設定の変更はありませんので、スクリプトの修正が完了すれば、この手順は完成です。


<処理の流れを読み解く>

 今回2つのスクリプトに追加した処理は同じ内容になっています。
この処理によってどのような制御が行われるようになったのかを、自分で考えて処理の流れを書き出してみてください。


4.GameDirector スクリプトを修正する


 TODOとして用意しておいた部分に、オブジェクト生成の制御処理を追加していきます。
2と3の手順で各スクリプトへ追加した生成の停止かスタートを命令する処理を追加して実装します。


GameDirector.cs

 <= クリックすると開きます



 ※ 追加した2つのメソッドは、引数を利用することで、FloorGeneratorの SwitchActivation メソッドのように1つのメソッドにしても実装出来ます。
   挑戦してみましょう。


<5.for 文と配列の組み合わせ処理>


 for 文と配列変数は相性がよいため、構文と一緒に利用されることが多いです。
最もよく利用されるパターンは、for 文の条件式に配列の Lenght (レングス)を利用することで、配列の最大要素数分だけ処理を繰り返し、
その1回当たりの処理には、配列のインデックスの番号を利用することで、各配列の要素の情報に対して処理を順番に行えるようにする書式です。

 もしもこれらの配列にまつわる単語がわからない場合には、早速自分で調べて知識を身につけましょう。


    private void StopGenerators() {
        for (int i = 0; i < randomObjectGenerators.Length; i++) {  // 条件式に配列の最大値を利用している
            randomObjectGenerators[i].SwitchActivation(false);       // for文の繰り返し処理用の変数をインデックスに利用することで、配列の要素を順番に参照できる
        }

        for (int i = 0; i < floorGenerators.Length; i++) {
            floorGenerators[i].SwitchActivation(false);
        }
    }

 条件式に配列の最大値を利用しているということは、配列の最大値が変化した場合には、その変化に対してプログラムも自動的に対応をしてくれる設計になります。
条件式に固定値で数字を指定してしまうと、このような変化する値に対して対応が出来なくなります。
たとえば条件式に i < 3 と書いてしまうと、配列の最大値にかかわらず3回しか処理が行われなくなります。

 そのため変数を用いたり、今回のように配列の最大値を用いることで、プログラムはより柔軟な挙動になります。
ロジックを考えるときには変数を念頭において、どのようにすれば効率的な処理になるか、ロジックを考えてみましょう。


6.GameManager ゲームオブジェクトを選択して GameDirector スクリプトの設定を行う


 新しく追加した randomObjectGenerators 変数が表示されていますので、こちらに Size を設定して、Element(配列の要素)にアサインを行います。


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



 この配列変数には、RandomObjectGenerator スクリプトがアタッチされているゲームオブジェクトをアサインします。
GameManager ゲームオブジェクトにアタッチされていますので、インスペクターからドラッグアンドドロップしてアサインします。
複数の randomObjectGenerator スクリプトがアタッチされている場合には、それぞれ別々の randomObjectGenerator スクリプトをアサインしてください。


<手順動画 アサイン>
https://gyazo.com/96a7513ec4140943f5c2b09626da35ed


GameManager ゲームオブジェクト アサイン後のインスペクター画像



7.ゲームを実行して確認する


 GameDirector スクリプトの設定が終了したら、ゲームを実行して処理を確認していきます。

 GameDirector スクリプトから各 Generator スクリプトへ命令が処理されて、タイトル表示中は敵などのオブジェクトが生成されなくなっていれば成功です。
もしもエラーが出る場合には、そのエラーの原因がどこにあるかをよく調べて特定につとめてください。


<実装動画 タイトル表示中は空中床や敵などのオブジェクトを生成しない>
https://gyazo.com/acec6aae752b92340dc64fab14be174f


 タイトル表示が消えたあとは、今までと同じように自動生成がスタートすれば制御成功です。


<実装動画 タイトル表示が消えたらオブジェクトの生成をスタートする>
https://gyazo.com/58c0efcb2388ab81fcfa6c7525d5bcf0


 ゴール地点が生成された際にも、GameDirector スクリプトから 各Generator スクリプトへ生成停止を行う命令が出されます。
ゴール地点が生成された後には空中床や敵などのオブジェクトが生成されないかを確認します。


<実装動画 ゴール地点が生成されたら、空中床や敵などのオブジェクトを生成しない>
https://gyazo.com/56e1f6a551d7fd42307467c50b03476e


 以上でこの手順は終了です。

 次は 手順26 ーBGMの制御処理の実装  です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

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

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

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

private



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

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