Unityに関連する記事です

 バレット選択ボタンのオン・オフ切り替え制御を、ボタンのコストと現在の Exp の値を参照して、自動的に切り替える制御を実装します。

<実装動画>
動画ファイルへのリンク


 以下の内容で順番に実装を進めていきます。

発展26 −バレット選択用ボタンのコストと Exp の現在値による、ボタンのオン・オフ制御の連動−
53.BulletSelectManager スクリプト、GameManager スクリプト、EnemyGenerator スクリプトを修正し、Exp の値が更新されるたびに、バレットのコストを確認し、ボタンが押せるようになるか判定を行い、ボタンの制御を行う



 新しい学習内容は、以下の通りです。

 ・Startメソッドの戻り値を void から IEnumerator 型にして使用する処理
 ・yield return StartCoroutine メソッドによる待機処理



53.BulletSelectManager スクリプト、GameManager スクリプト、EnemyGenerator スクリプトを修正し、Exp の値が更新されるたびに、バレットのコストを確認し、ボタンが押せるようになるか判定を行い、ボタンの制御を行う

1.設計


 バレット選択ボタンの上に表示されているコストの値とエネミーを倒した際に獲得できる Exp の値をシステム的にリンクさせる処理を設計して実装を行います。
なおこの利用方法も一例ですので、別の方法を検討していただいても構いません。

 今回の設計は、エネミーを倒して獲得した Exp をバレットを使用するためのコストとして支払うことで、初期バレット以外のバレットを発射出来るようにします。
コストの値は各バレットのデータごとに異なっていますので、コストの安いバレットとコストの高いバレットによって、発射が可能になるまでに必要な Exp が異なります。
MP を消費して魔法を使ったり、お金(Exp)を使ってバレットを買う(コストを支払いを)するイメージです。



 各バレット選択ボタンの上には発射可能になるためのコストを数字で表示していますので、この値が Exp の目標値になります。

 まず、初期バレット以外のバレットはすべてボタンが押せない状態になっていますので、Exp を獲得するたびに、Exp の現在値と
各バレット選択ボタンのコストとを比較して、Exp の値がコストを上回ったら、そのバレット選択ボタンを押せる状態に切り替えします。
上回らないボタンについては、そのまま押せない状態になります。

 この処理を実装することを目標にしてください。すべてのボタンを確認する必要がありますので、
BulletSelectManager にあるバレット選択ボタンの List を利用して、各ボタンのコスト情報を確認するロジックを考えてみてください。
メソッド化しておくことにより、Exp が更新されるたびに呼び出す、という設計が出来ます。



 次は、ゲームの開始時と、Exp を獲得した際に上記のメソッドを呼び出すことが出来れば、
その都度、最新の Exp の値を参照してコストと比較を行って、バレット選択ボタンのオン・オフの切り替えが可能になります。

 ゲームの開始時、というタイミングですが、現在、Start メソッドは GameManager スクリプトのみに一元化して制御をしています。
BulletSelectManager スクリプトについても同じように、Start メソッドで GenerateBulletSelectDetail メソッドを呼び出すのではなく、
GameManager スクリプトの Start メソッドから GenerateBulletSelectDetail メソッドを呼び出すように設計を修正してください。
そのあとに上記の Exp とコストを確認するメソッドを呼び出すようにすれば GameManager スクリプトから順番に処理を実装出来ます。
 


 このとき注意すべき点があります。
GenerateBulletSelectDetail メソッドは StartCoroutine メソッドで実行されるコルーチン・メソッドです。
これはバレット選択ボタンを1つずつ順番に生成を行うために、一時中断処理を実装しているためですが、
そのままこの処理に続けて、Exp とコストの確認処理を実装すると、バレット選択ボタンがすべて生成されていない状態で実行されるため、
ここでエラーが発生します

 解決策はいくつかありますが、GameManager スクリプトの Start メソッドの戻り値を void から IEnumerator 型に変更して対応してみましょう。
これは Start メソッドのみで許可されている処理の1つで、Start メソッドをコルーチン・メソッド化することが出来ます。
コルーチン・メソッド内では遅延処理や一時中断処理が実装できますので、GenerateBulletSelectDetail メソッドを一時中断処理として実行するように設計します。
メソッドの実行を一時中断処理として行った場合、そのメソッドの処理が完了するまで、プロジェクトの処理が一時中断して待機します
つまり、バレット選択ボタンが1つずつ順番に生成されて、それを待ってから、次の処理を実行する、という流れを作り出すことが出来ます。

 このようにして制御を行っておけば、次の行に Exp とコストの確認処理があったとしても、バレット選択ボタンがちゃんと生成されてから実行されますので
この部分でエラーが発生することを防ぐことが出来ます。



 最後に、Exp を獲得したときに、Exp とコストの確認を行うメソッドを呼び出すタイミングを考えます。
 どのスクリプトのどのメソッドにこの処理を実装すれば制御が可能になるかを考えてみてください。
ヒントはエネミーを倒した際に Exp の表示更新を行う処理が EnemyGenerator スクリプトのメソッドにあります。


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


 設計を元にロジックを考えてみてください。
Start メソッドで呼び出していた GenerateBulletSelectDetail メソッドは GameManager スクリプトから呼び出すように設計を変更しますので、
コメントアウトするか、削除してください。外部のスクリプトから呼び出すことを想定して、GenerateBulletSelectDetail メソッドは public 修飾子で宣言してあります。
このメソッドには引数を追加して、 GameManager クラスを受け取って変数に代入するようにしておいてください。
GameManager にある isGameUp 変数を利用できるようになりますので、ゲーム終了の状態に合わせてボタンをオフにする処理が実装出来ます。


BulletSelectManager.cs


 スクリプトを作成したらセーブします。


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


 設計に基づいて、Start メソッドの戻り値を変更しましょう。
また、BulletSelectManager スクリプトの情報を取得しておいてメソッドを実行できるようにします。
外部のスクリプトでも利用できるように public 修飾子で宣言して、インスペクターから事前にアサインして登録しておくといいでしょう。

 Start メソッド内に、バレット選択ボタンを生成する処理と、Exp とコストの確認を行って、ボタンのオン・オフの切り替えを行う処理を実装します。
生成処理については、一時中断処理で実装し、ボタンの生成が終了するまでは次のメソッドが実行されないように制御してください。

 この処理については、先に説明があります。


GameManager.cs

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


 スクリプトを修正したらセーブします。



 GameManager ゲームオブジェクトのインスペクターを確認して、public 修飾子で宣言した変数が追加されていることを確認します。


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




4.<Startメソッドの戻り値を void から IEnumerator 型にして使用する処理>


 通常の Start メソッドの戻り値は void ですが、用途に応じて戻り値を IEnumerator型 に変更して利用することができます。
その場合、通常と同じようにゲームの実行と同時にStartメソッドが呼ばれる部分は変わりませんが、
コルーチンメソッドとして機能するようになりますので、Start メソッド内で遅延処理や待機処理などを実装することが可能になります

 今回のケースでは、Start メソッド内に、バレット選択ボタンを生成する処理がありますので、
こちらの処理をすべて終了してから次の処理へと移る、という順序立てた制御を行いたいため、この処理を実装しています。


5.<yield return StartCoroutine メソッドによる待機処理>


 コルーチン(Coroutine)とは一定の時間や条件をもとに、処理を中断・再開・終了させることができる処理のことです。

 コルーチンについての詳細な説明は割愛します。こちらの記事や、サイトで広く情報を取得できますので、そちらを参考にしてください。

XR-HU3様
【Unity】コルーチンで処理を中断・再開・停止させる方法を学ぶ
https://xr-hub.com/archives/20368


 コルーチンメソッド内には、yield を利用した処理を記述することができます。
例えば、数秒間の遅延処理や、条件達成までメインスレッドの処理を一時中断して待機させる処理などを、この yield を利用すると実装できます。

 // バレット選択用のボタンを生成。この処理が終了するまで、次の処理は動かない
  yield return StartCoroutine(bulletSelectManager.GenerateBulletSelectDetail(playerController));

 通常のコルーチンメソッドの呼び出しと違いまして、呼び出す前に yield return があります
この場合、呼び出されたコルーチンメソッドの処理がすべて終了するまで、ここでプログラムを一時中断して待機させる、という処理が実行されます。

 呼び出すコルーチンメソッドの処理は、
「BulletSelectManager スクリプトにある GenerateBulletSelectDetail メソッドを実行する。そのメソッドの処理がすべて終了するまで、プログラムを一時中断させる」

という内容です。

 その結果、バレット選択ボタンの生成が終了してから、はじめて次の処理が行われるという処理が実装されています。

 プログラムは上から下へと流れて処理されていきますが、このような中断処理を挟むことによってゲームの流れを制御しています。


6.GameManager ゲームオブジェクトの設定を行う


 インスペクターに表示されている変数に、必要な情報を持つゲームオブジェクトをドラッグアンドドロップしてアサインしてください。


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



 以上で設定は完了です。


7.EnemyGenerator スクリプトを修正する


 設計に基づいて、Exp の表示更新を行う処理のあとに、Exp とコストの確認をするメソッドを記述します。
このメソッドは BulletSelectManager スクリプトにあるメソッドですが、GameManager スクリプトが public 修飾子の情報として管理していますので、
このスクリプトからでも実行することが出来ます。同じように、UIManager スクリプトのメソッドを実行していますので
そちらの処理を参考にして処理を実装してください。


EnemyGenerator.cs

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


 スクリプトを修正したらセーブします。


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


 複数のスクリプトを修正していますので、どの部分の処理がつながっているかを確認しておいてください

 ゲームを実行してバレットを生成処理後に、各ボタンのオン・オフの切り替えが実行されることを確認してください。
実装した順番通りに制御されていれば、生成前にボタンのオン・オフの切り替えが実行されることはありませんのでエラーは発生しません。


<実装動画>
動画ファイルへのリンク



 エネミーを倒して Exp を獲得してください。
Exp の現在値がバレット選択ボタン上に表示されている Exp の値と同じになるか、超えた場合に
対象のバレット選択ボタンの色が変わり、ボタンが押せる状態になります。


<実装動画>
動画ファイルへのリンク


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

 次は 発展27 −バレット選択用ボタンのコストの支払い処理とボタンのオン・オフ制御の連動− です。
バレット選択ボタンを押した場合に、表示されている Exp 分の値を Exp から減算する処理と、
それに連動して、Exp の現在値を元に、ボタンのオン・オフを切り替える処理を実装します。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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