i-school - 2D放置ゲーム 手順7
 行き先のゲームオブジェクトにインスペクターより、お使いの情報を登録できるようにします。
 

<実装画像>



手順7 −行き先にお使いの情報を登録する−
12.JobType (お使いの種類)と JobData(お使いの内容)を登録するためのスクリプトをそれぞれ作成する
13.TapPointDetail スクリプトを修正し、行き先に JobData(お使いの情報)を登録できるようにする



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

 ・enum だけのスクリプト・ファイルの作成
 ・MonoBehaviour クラスを継承していないクラスの作成
 ・enum の列挙子と機能
 ・[System.Serializable(シリアライザブル)]属性
 ・Tooptip 属性



12.JobType (お使いの種類)と JobData(お使いの内容)を登録するためのスクリプトをそれぞれ作成する

1.設計


 行き先のゲームオブジェクトにインスペクターより、お使いの情報を登録できるようにします。
始めは手動で登録しますが、後々はプログラムから自動的に登録が行えるようにもします。

 次の手順では、行き先確認ポップアップに、この行き先に応じたお使いの情報を反映させて表示させるようにします。
ポップアップに表示する内容を固定せずに、各行き先ごとのお使いの情報が自動的に反映できるようにしておくことで、
1つの行き先確認ポップアップを使ってすべての行き先の情報をその都度書き換えて表示できる設計になります。

 お使いの情報を扱うためには、専用のクラスを作成します。
このクラスには、お使いの番号や、お使いにかかる時間などを、各お使いにつき1つずつ登録できるようにしておきます。
このような設計にしておくと、このクラスを複数まとめてお使い用のデータベースを作成することも出来るようになります。

<お使いの情報 = JobData クラスとして作成し、管理する>
 ・お使いの通し番号  =  int 型
 ・お使いの時間   =  int 型
 ・お使いの名前   = string 型
 ・お使いの種類   =  enum で作成した JobType 型

 お使いの情報の中にお使いの種類(難易度)を設定したいので、こちらも専用の enum を作成して運用するようにします。
それ以外の情報は既存の型で運用できるようにしています。


2.enum だけの JobType スクリプトを作成する


 enum (イーナム) を利用して、お使いの種類を事前に登録し、この情報をお使いの持つ情報として JobData クラス内に設定できるようにします。
enum のみでスクリプトを作成する場合、using の宣言や、MonoBehaviour(モノビヘイビア) クラスの継承は不要です。
そしてどのスクリプトからでも変数の代入なしで利用可能になります。

 enum ではゲーム内に登場させたい種類の情報を、列挙子(れっきょし)という形で種類を作成できます。
今回は、お使いの種類、という情報を JobType という名前で作成し、その中にアイテムの種類を登録しておきます。
これは追加可能な情報ですので、先々にアイテムの種類が増えても対応できます。


JobType.cs

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


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


3.<enum の列挙子と機能>


 2つ以上の情報を管理する場合には、enum でその種類を登録しておくことをおすすめします
enum を利用する場合、その登録してある列挙子からしか情報を指定できませんので、
例えば、文字列と異なり、指定に際して打ち間違えが発生しませんので、不備の値が入ることも防ぐことが出来ます。

 ゲームの内容に応じた enum を考えて作成して運用します
プレイヤーの状態用(毒、混乱、痺れとか)、アイテムの種類(消耗品、武器、防具、など)、
ゲームの状態管理(ゲーム開始前、ゲーム中、ゲーム終了)など、非常に応用が利く機能です。



 なお enum では各列挙子に自動的に整数の番号が与えられます一番上から 0 で連番になっています
今回の場合であれば、Easy には 0、Hard には 2 の数字が与えられています。

 この番号は見えない情報ですが、列挙子を int 型にキャストを行うことで取得して利用出来ます
下記の例の場合、enumValue には 1 が代入されます。

<enum の列挙子のキャスト>
int  eventValue = (int)JobType.Normal;

 また、列挙子の宣言時に数字を指定して代入することも可能です。その場合には連番ではなく、指定した数値を取得出来ます。

<数字の代入の例(今回この方式は利用しません)>
JobType.cs
public enum JobType {
    Easy= 10,
    Normal = 5,
    Hard = 100
}

 上記のように代入されている場合には、列挙子を int 型にキャストすると、代入してある値が取得出来ます。
今回は数字の代入は行っていませんので一番上の列挙子には 0 から順番に採番されています。

 enum は自分の目的に合わせて自由に作成できます。
今後も必要に応じて作成し、プログラムを読みやすく、管理をしやすいゲーム環境を作っていくようにしましょう。


4.JobData スクリプトを作成する


 お使いの情報をデータとして登録するためのクラスを作成します。
登録したい情報に合わせて、型と変数を検討しながら作成します。
今回は先ほども提示したように、以下のような構成のクラスにておきます。

<お使いの情報 = JobData クラスとして作成し、管理する>
 ・お使いの通し番号  =  int 型
 ・お使いの時間   =  int 型
 ・お使いの名前   = string 型
 ・お使いの種類   =  enum で作成した JobType 型

 お使いの種類については先ほど作成した JobType を利用して、お使いの種類を事前に登録し、この情報をお使いの持つ情報として JobData クラス内に設定できるようにします。
またこの情報は増やすこともできます。


JobData.cs

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


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


5.[System.Serializable(シリアライザブル)]属性


 JobData クラスの1行上には上記の宣言があります。[ ]で宣言された設定値は「属性」と呼ばれる情報になり、特別な意味を持ちます。

 今回利用している[System.Serializable]属性は、Systemに含まれている設定値であり、こちらを宣言することでクラスの情報をインスペクターに表示することが出来ます。
これを書き忘れてしまうと、インスペクターに JobData が表示されず、データをインスペクターから登録することが出来ません
using System; を宣言している場合には [Serializable] とだけ記述すれば適用されます。
今回のように using の宣言していない場合には [System.Serializable] と記述する必要があります。


6.<Tooptip 属性>


 JobData クラスの各変数は Tooltip 属性が付与されています。
これは変数に付与できる属性で、インスペクターにおいて、マウスカーソルが変数名の上にある間は
この属性の引数に登録した文字列をインスペクターに表示させる機能になります。引数には説明文などを登録することを主な目的としています。

 Header 属性は常に表示してくれますが、Tooltip 属性はカーソルを移動させたときだけです。
インスペクターが肥大化してしまっていて、変数のヘルプを表示したいがこれ以上インスペクターを圧迫したくないような場合には
Header 属性との兼ね合いを見ながら付与すると便利です。


<Tooptip 属性 この属性がある変数の上にマウスカーソルを移動させると、引数に登録した文字列の内容がホバー表示されます。>
動画ファイルへのリンク


参考サイト
エクスプラボ 様
【Unity】ToolTipでフィールドのヒントメッセージを表示する
https://ekulabo.com/tool-tip-attribute


13.TapPointDetail スクリプトを修正し、行き先に JobData(お使いの情報)を登録できるようにする

1.設計


 JobData クラスの作成が済みましたので、このクラスを型として宣言した変数を用意することで
他のスクリプトに JobData クラスの情報を登録することができるようになりました。

 早速、行き先の情報を管理している TapPointDetail スクリプトに、この JobData クラスの変数を追加して、
行き先にお使いの情報を登録できる状態にしていきます。


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


 自分で処理を考えて、型と変数の宣言をしてみてください。
インスペクター上に表示させつつ、他のスクリプトでも利用することをふまえて
public 修飾子の変数として宣言を行うことが大切なポイントになります。


TapPointDetail.cs


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


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


 ヒエラルキーにある btnTapPoint ゲームオブジェクトを選択し、インスペクターを確認します。

 新しく TapPointDetail スクリプトに追加した変数がインスペクター上に表示されます。

 myJobNo 変数は、この行き先の管理するお使いの番号です。最初は 0 に設定しておいてください。

 jobData 変数には JobData クラスの情報が表示されます。
これは Serializable 属性によってクラスの情報をインスペクター上に表示できる状態に設定しているためです。

 このクラスには4つの変数がありますので、こちらに自由に情報を設定してください。
ただし jobNo 変数のみ、myJobNo 変数と同じ 0 を設定してください。


インスペクター画像(参考例)



 以上で設定は完了です。



 以上でこの手順は終了です。
 
 次は 手順8 −行き先確認ポップアップに行き先ごとのお使いの情報を表示する機能を実装− です。
行き先に登録した情報を、行き先確認ポップアップに表示させる処理の実装を行います。