Unityに関連する記事です

 行き先ごとのお使いの情報をセーブ・ロードするにあたり、行き先のゲームオブジェクトを管理するクラスを作成します。

 このクラスではゲーム内にある複数の行き先を管理し、このクラスが行き先確認ポップアップを表示したり、行き先の状態を変更したりして、
ゲーム進行を管理できる状態を作り出します。


手順13 −ゲーム管理クラスの実装−
22.GameManager スクリプトを作成する
23.TapPointDetail スクリプトと JobsConfirmPopUp スクリプトと CharaDetail スクリプトをそれぞれ修正して、GameManager クラスを経由して処理を実行するように修正する



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

 ・List の使い方  疾觚澄⊇藉化、Count プロパティー
 ・リファクタリング



22.GameManager スクリプトを作成する

1.設計


 各スクリプトにおいて処理していた内容の一部を管理クラス内に移管して、そこに一連の処理を集約させます。
1つのクラスに命令系統をまとめておくことにより、個別で動作していた行き先のゲームオブジェクトの処理を管理クラスに一任させることが出来ます。

 管理クラスを作成することによって、複数の行き先のゲームオブジェクトを、このクラスですべて管理することが出来るようになります。
それによってはじめて、ゲーム内にあるお使いの管理を行える状態を作りだします。お使いの管理が出来るということは、お使い時間についてもセーブやロードも行える状態になるということにもなります。

 まとめておく処理の流れは次の内容になります。

<現在の処理の流れ>
 1.行き先のゲームオブジェクトをタップすると、TapPointDetail クラスの OnClickTapPoint メソッドが実行されて、行き先確認ポップアップ(JobsConfirmPopUp ゲームオブジェクト)を生成する

 2.行き先確認ポップアップの中のお使い開始のボタンを選択することで、OnClickSubmit メソッドが実行されて、TapPointDetail クラスの PrapareteJobs メソッドが実行されることにより
   そのメソッド内でお使いの処理である WorkingJobs メソッドがコルーチンメソッドとして実行される

 3.WorkingJobs メソッド内でお使いの時間が経過すると、GenerateCharaDetail メソッドが実行されて、行き先ボタンの上にキャラ(CharaDetail ゲームオブジェクト)が生成される

 4.キャラのゲームオブジェクトをタップすると、キャラのゲームオブジェクトが破壊されて、再度、行き先のゲームオブジェクトがタップできる状態になる

 まずはこの処理の流れをしっかりと確認しておいてください。

 この処理の内容はそのままで、各クラスの処理を GameManager クラスを経由した処理の内容に再構築を行います
そのため、この元々の処理が理解できていないと、GameManager クラスに、どのクラスの、どんな処理を記述しているのか分からなくなってしまいますので、
しっかりと把握した上で進めていくようにしてください。


2.GameManager スクリプトを作成する


 ゲーム管理用のクラスである GameManager クラスを作成します。
Scripts フォルダ内で右クリックをしてメニューを開き、Create => C# Script を選択して新しいスクリプト・ファイルを1つ作成します。
名前を GameManager に変更してダブルクリックしてください。

 GameManager クラスにはゲーム内にある TapPointDetail クラスのアタッチされている行き先のゲームオブジェクト(btnTapDetail ゲームオブジェクト)を1つの変数に集約して管理を行います。
これには List という機能を利用します。複数の行き先のゲームオブジェクトを1つの変数内に登録しておくことで、どの行き先のゲームオブジェクトがどのような状態であるのかを、
GameManager クラスが把握できる状態を作りだします。この状態が完成してはじめて、各行き先のゲームオブジェクトのお使いの時間の管理が行えるようになります。

 TapPointDetail クラスと、JobsConfirmPopUp クラスにある処理を、GameManager クラスに移管しますので、
それぞれのメソッドと、そのメソッドで利用されていた変数も含めて、必要なものはすべて GameManager クラスに記述し直します。


<移管する処理>
 1.行き先のゲームオブジェクトをタップすると、TapPointDetail クラスの OnClickTapPoint メソッドが実行されて、行き先確認ポップアップ(JobsConfirmPopUp ゲームオブジェクト)を生成する
     => GameManager クラス内に GenerateJobsConfirmPopUp メソッドを作成し、そのメソッドを実行する処理に変更する

 2.行き先確認ポップアップの中のお使い開始のボタンを選択することで、OnClickSubmit メソッドが実行されて、TapPointDetail クラスの PrapareteJobs メソッドが実行されることにより
   そのメソッド内でお使いの処理である WorkingJobs メソッドがコルーチンメソッドとして実行される
     => GameManager クラス内に JudgeSubmitJob メソッドを作成し、そのメソッドを実行する処理に変更する。このメソッド内で TapPointDetail クラスの  PrapareteJobs メソッドを実行する

 3.WorkingJobs メソッド内でお使いの時間が経過すると、GenerateCharaDetail メソッドが実行されて、行き先ボタンの上にキャラ(CharaDetail ゲームオブジェクト)が生成される
     => GameManager クラス内に GenerateCharaDetail メソッドを作成し、そのメソッドを実行する処理に変更する

 4.キャラのゲームオブジェクトをタップすると、キャラのゲームオブジェクトが破壊されて、再度、行き先のゲームオブジェクトがタップできる状態になる
     => 現状は変更なしだが、今後の実装をふまえて修正を行う

 今後実装を行う処理についても TODO 機能を記述しています。
どのような処理があればお使いの処理を完成させることが出来るのか、イメージしながら処理を考えてみてください。


GameManager.cs

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


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


3.GameManager ゲームオブジェクトを作成する


 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、Create Empty を選択して、新しいゲームオブジェクトを作成します。
名前を GameManager に変更します。

 GameManager スクリプトをドラッグアンドドロップしてアタッチしたいのですが、
今はまだ、TapPointDetail クラスと JobsConfirmPopUp クラスの修正が済んでいないため、アタッチをしようとするとエラーが出ます。
先にそれらの修正を行います。


4.<List の使い方  疾觚澄⊇藉化、Count プロパティー>


 List クラスは <T> にジェネリック型(任意の型)を指定して、同じデータ型をまとめて管理するコレクション機能を持つクラスです。
配列と異なり、要素を自由に追加・削除できます。(要素数が可変する)


1.Listの宣言と初期化

 List を利用する場合には配列と同様に初期化が可能ですが、Listでは初期化時に要素数の宣言が不要です

<配列の初期化>
  private TapPointDetail[] tapPointDetails = newTapPointDetail[3];                   // <=  要素数の宣言が必要

<List の初期化>
  [SerializeField]
  private List<TapPointDetail> tapPointDetailsList = new List<TapPointDetail>();     // <=  要素数の宣言が不要

 そのため基本的には、予め要素数の確定しているデータを扱う場合には配列を、要素数が未確定であったり可変長であるデータについてはListを利用するように考えてください。

参考サイト
MicroSoft
List<T> クラス
https://docs.microsoft.com/ja-jp/dotnet/api/system...
.net column様
【初期化の方法】C#で配列やリストを初期化するには?
https://www.fenet.jp/dotnet/column/language/713/ 


2.Count プロパティ

 Count プロパティは List の持つプロパティの1つです。現在の List の要素の最大値を取得することができます。
配列では Length プロパティを利用して要素の最大値を取得できましたが、それと同じ使い方が出来ます。
今回は for 文の条件式に利用し、List の Count プロパティの値を目標値として繰り返し処理を行っています。

 List の要素も、配列と同じで [index] で指定してから利用する手順になります。

<参照方法>
  // List に登録されているすべての TapPointDetail クラスに対して1回ずつ処理を行う
  for (int i = 0; i < tapPointDetailsList.Count; i++) {

     // TapPointDetail クラスの設定を行う 
      tapPointDetailsList[i].SetUpTapPointDetail(this);

 使用する場合は配列と同じように、要素番号を変数名の後ろに指定することで、「どの」TapPointDetail クラスかを指定して利用できる状態になります。
今回のケースのように、for 文と組み合わせることで、List 内のすべての要素(今回であれば TapPointDetail クラス)を順番に指定していく処理を実装出来ます。これも配列と同じです。


参考サイト
MicroSoft
List<T>.Count プロパティ
https://docs.microsoft.com/ja-jp/dotnet/api/system...


23.TapPointDetail スクリプトと JobsConfirmPopUp スクリプトと CharaDetail スクリプトをそれぞれ修正して、GameManager クラスを経由して処理を実行するように修正する

1.設計


 GameManager スクリプトを作成し、TapPointDetail スクリプトと JobsConfirmPopUp スクリプトで利用している変数やメソッドの内容について記述を行いました。

 今まで各スクリプトで実行していた処理が GameManager スクリプト側に移管されたので、各スクリプトの処理の内容を GameManager クラスを経由して実行する処理に変更する必要があります。
GameManager スクリプトの処理とそれぞれのスクリプトの処理を見比べながら、どの処理がどの部分とつながっているのかを確認しながら処理の修正を行います。

 スクリプトを呼び出してメソッドを実行 => すぐに処理をする
      ↓
 スクリプトを呼び出してメソッドを実行 => 別のスクリプトのメソッドを実行する => 別のスクリプトのメソッド内で処理を実行する

 ゲーム上の動きは変わりませんが、スクリプト内の処理の内容を変更します
このように外部から見た処理は変わらないものの、内部的な処理の動きを修正することを「リファクタリング」といいます。
デバッグと異なり、不具合を修正することを目的とせず、処理の流れを見直しておくことを言います。

 これは処理を再構築する以外に、読みにくい処理を読みやすくするといった内容も含まれます。



 上記の処理の移管の他に、Start メソッドを廃止して、外部から実行するためのメソッドに作りを変えています。
複数の Start メソッドが各スクリプト内に存在する場合、どの Start メソッドから実行を行うという保証がないため、
Start メソッドで行う処理自体を外部のスクリプトから実行してもらって処理を行うように設計を変更します。

 このような設計にすることにより、すべてプログラムした順番(製作者が意図している順番)通りに動く、処理の流れを作り出すことが出来るようになるためです。
またエラーを発見する際にも役立ちます。エラーによって途中で処理が終了してしまった場合、Start メソッドがあると、どの部分に問題があるかを
すべての Start メソッドで見直す必要がありますが、すべて順番だてて動いているのであれば、エラーの該当する部分を発見しやすくなります。

 プログラムは設計者の記述した順番と内容でしか動きません
そのため、自分で処理を書くということは処理に対しての責任が発生します。
処理の内容を把握し、その内容に対しての修正方法もわかった上でロジックを組むことが大切になります。


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


 GameManager スクリプトに移管した変数を削除します。
また、Start メソッドの名前と引数、修飾子を変更して、外部から実行してもらうように設計し直します。

 いままで生成処理を行っていた2つのメソッド内の処理を修正し、GameManager スクリプトに用意した
それらの生成処理を行うメソッドを呼び出して実行させる内容に変更します。


TapPointDetail.cs

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


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


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


 新しく GameManager スクリプトの情報を代入するための変数を宣言して用意しておきます。
これは GameManager スクリプトに対して命令を実行できるようにするためです。

 TapPointDetail スクリプトと同じように、OpenPopUp メソッドの修飾子と引数を修正して、
外部のスクリプトから実行して動きだすように処理を変更します。


JobsComfirmPopUp.cs

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


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


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


 こちらも Start メソッドを修正します。引数を追加して、外部のスクリプトから情報を受け取れるようにします。
受け取った情報を代入しておくための変数を2つ新しく宣言しておきます。この情報は次以降の手順で利用するようになります。


CharaDetail.cs

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


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


5.GameManager ゲームオブジェクトに GameManager スクリプトをアタッチして設定を行う


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


ヒエラルキー画像



 アタッチを行ったら、必ずゲームオブジェクトのインスペクターを確認してアタッチできていることを確認します。



 SerializeField 属性の変数が5つありますので、charaDetailsList 変数以外の情報をアサインして登録します。

 tapPointDetailsList 変数には、ヒエラルキーにある TapPointDetail スクリプトがアタッチされているゲームオブジェクト(btnTapDetail)をドラッグアンドドロップしてアサインしてください。
複数ある場合には、それらを全部1つずつ登録します。そのため Size はアサインして登録したいゲームオブジェクトの数に設定してください。

 残る3つは TapPointDetail スクリプトと同じ情報をそれぞれ登録しますので、参考にしながら登録してください。
なぜ同じ情報を登録することになるのか、理解しながら進めるようにしてください


インスペクター画像



 以上で設定は完了です。


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


 ゲームを実行して、いままでと同じように操作を行ってください。

 今回は新しくクラスを作成し、分散していた処理の集約をおこないました。
それに関連する処理のリファクタリングを行いましたので、外部の動作は変わらず、これまで動いていた状態と同じように制御が行われていれば成功です。


 以上でこの手順は終了です。
 
 次は 手順14 −お使いの時間の経過を管理する処理の実装− です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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