Unityに関連する記事です

干支のシャッフル機能を追加する


 発展2においてシャッフル用のゲームオブジェクトとシャッフル用のボタン、そしてShuffleスクリプトを作成しました。
それらの機能を使用できるように、UIManagerスクリプトとGamanManagerスクリプトを修正していきます。

 UIManagerスクリプトには、シャッフルボタンの機能を追加し、Shuffleスクリプトへの紐づけを行って、ボタンと連動してシャッフル処理を実行させます。

 GamanManagerスクリプトには、シャッフルボタンの制御を追加し、干支の生成中やゲームが終了した際には、シャッフルボタンを押せないようにする処理を追加します。



 実装の手順です。
 1.UIManagerスクリプトを修正する
 2.GameManagerスクリプトを修正する
 3.ゲームを実行して動作を確認する



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

複数のStartメソッドを使わない設計方法


1.UIManagerスクリプトを修正する


 シャッフルボタンの機能を追加し、Shuffleスクリプトへの紐づけを行って、ボタンと連動してシャッフル処理を実行させます。

UIManager.cs

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




UIManagerのインスペクター画像


アサイン



ゲーム終了時にシャッフルボタンが非活性化(半透明で押せない状態)かどうか確認する



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


 GamanManagerスクリプトを修正していきます。修正箇所はStartメソッド内、CreateEtosメソッド内、GameUpメソッド内の3カ所です。

 StartメソッドにはUIManagerのInitializeメソッドの呼び出しを追加します。UIManagerにStartメソッドを用意して初期設定を行うのではなく、
GamanManagerがUIManagerに命令して初期設定を行うようにしています。

 CreateEtosメソッドには処理を追加し、干支の生成時にはシャッフルボタンを押せないように制御を行います。干支の生成が終了したら押せる状態になります。

 GameUpメソッドも同様で、ゲームが終了したらシャッフルボタンを押せないように制御を行います。

 新しく処理を追加・削除する際には、処理の追加によって発生する挙動を網羅して、
処理の追加・削除における修正内容を自分で拾い出して問題がないかを確認します。

 こういった考え方を影響範囲といい、処理の追加・削除によっては広大な影響範囲を持つ修正も起こり得ます。
そのような場合も念頭において、処理の追加と削除には気を付けていく必要があります。


GameManager.cs

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



<複数のStartメソッドを使わない設計方法>


 Unityにおいて複数のスクリプトにStartメソッドが存在している場合、どのStartメソッドから実行される、という保証がありません。
つまり、Startメソッドの処理の順番によっては、エラーにならないはずの処理が、急にエラーになってしまうようなケースがあります。
これは順番の前後が変わることでStartメソッドによって行われていた処理に起因していることが多いです。
例えば、AのスクリプトのStartメソッドの処理が終了していないとBのStartメソッドの処理がエラーになる、などです。

 そのため今回のように、Startメソッドを用意するのは1つのスクリプト(管理用スクリプトが理想)のみとし、このスクリプトが起点となって他のスクリプトへ命令を行う設計にしています。
こうすることによって、不安定なStartメソッドの処理順番に左右されることなく、処理の順番をこちらの指定通りに動かすことができます。

 現在の処理の流れを実際に見てみます。

すべてのスクリプト内においてStartメソッドがGamanManagerに1つしかないので、GamanManagerのStartメソッドが必ず最初に実行される
  ↓
UIManagerのInitializeメソッドを呼び出す。ここでUIManagerの初期設定を行う(UIManagerのStartメソッドの代わり)
  ↓
GameDataに干支データのリストがあるか確認し、リストがなければリストを作成する処理を行う(GameDataのStartメソッドの代わり)
  ↓
干支の生成を行う

 このように、UIManagerやGameDataにはStartメソッドがありませんが、GamanManagerから順番に処理を行うように命令が出ますので
記述した処理の順番通りに処理が実行されていくようになります。


 これがすべて各スクリプトのStartメソッドで行われていた場合には、以下のような問題をはらむ結果になります。

すべてStartだと、どれがどの順番で動くかわからない。

 GamanManagerのStartメソッド
  
 UIManagerのStartメソッド
 
 GameDataのStartメソッド
  
上記の3つの処理の順番は、Unityが毎回決める。そのため、

 問題となる処理 → GamanManagerの干支の生成を行う(もしもGameDataのStartメソッドがGamanManagerのStartメソッドより遅い順番の場合、干支データがなくてエラーになる)

が発生する

 スクリプトが増えてくると、このように処理の順番に起因する問題が発生することになります。完全に独立している処理であればStartメソッドを使っても問題ありませんが
そのStartメソッドの処理の結果を他のスクリプトが参照して利用したいような場合には、しっかりと処理の順番を考えて、Startメソッドは使わない設計をするようにしましょう。
 

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


 これですべての実装が終了しました。ゲームを実行して、シャッフルボタンが機能するかを確認します。

 まずは前回の発展2の手順において、Shuffle スクリプト内の一部の処理をコメントアウトしていますので、そちらを解除してください。

Shuffle.cs StopShuffle メソッド内のコメントアウトを解除する
 // 再度シャッフルボタンを押せるようにする
  uiManager.ActivateShuffleButton(true);



 動作の検証をする際には、どういった挙動になれば正しい状態であるのかを、認識した状態で確認を開始します。

<検証確認内容>
 ・干支の生成が終了するまではシャッフルボタンが押せなくなっていること
 ・干支の生成が終了していればシャッフルボタンを押すことで干支が空中に浮かび上がって落下すること
 ・ゲーム終了時にはシャッフルボタンが押せなくなっていること

 以上の部分が正常に機能しているか、何回かゲームを実行しながら確認してください。
教材ではこれらの検証項目を提示していますが、実際に自分で処理の追加・削除を行った際には、自分で検証すべき内容を考えて、事前に認識しておく必要があります

 闇雲にゲームのデバッグを行っても価値のあるデバッグになりませんので、目的をもってデバッグを行うようにしましょう。


<検証動画>

ゲーム開始時の干支の生成が終了するまでシャッフルボタンが非活性化(押せない状態)かどうか確認する
https://gyazo.com/de8795e318e3aa157a8e9775d02a693b


 エラーが発生していたり、正常に動作しない場合には、原因の特定ができないと修正が難しいため
Debug.Logを利用して、問題点の切り分けを行いながら処理の流れを見なおしてください。



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

 次は 発展4 です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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