Unityに関連する記事です

 数回に分けて、属性の情報と設定追加と、それをゲーム内で利用する処理の実装を行います。
今回は以下の内容で順番に実装を進めていきます。

発展33 −属性の追加−
65.ElementType スクリプトと ElementDataSO スクリプトを作成する。ElementDataSO スクリプタブル・オブジェクトを作成し、設定を行う
66.各スクリプタブル・オブジェクト用のスクリプトを修正し、ElementType 型の属性情報を追加する。その後、スクリプタブル・オブジェクトの設定を行う
67.ElementCompatibilityHelper スクリプトを作成し、属性による相性の判定を行う機能を追加する



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

 ・今までの処理を復習し、自分の設計でスクリプタブル・オブジェクトや static クラスを新しく作成する



65.ElementType スクリプトと ElementDataSO スクリプトを作成する。ElementDataSO スクリプタブル・オブジェクトを作成し、設定を行う

1.設計


 属性の情報について、登録の方法と利用する方法を設計します。

 まずはこの属性の情報をどのような場面で利用したいのかを考えていきます。

<アイディア例>
 1.エネミーの情報に属性の情報を追加して、バレットとの相性を確認するのに利用する
 2.バレットの情報に属性の情報を追加して、エネミーとの相性、エネミーと自分の拠点との相性を確認するのに利用する

 エネミーの情報は EnemyData クラス、バレットの情報は BulletData クラスのことを指します。

 【1】については、エネミーの属性情報とバレットの属性情報とを確認して、相性の良しあしを判断するようにするものです。
バレット側からみて、いわゆる弱点であるか、どうか、という判定を行い、エネミーの弱点である属性のバレットの場合には、特別な処理を行うように設計します。
他にも判定の種類(有利/不利)の方法はありますので、そちらは自分で処理の設計を考えてみてください。

 【2】については、【1】で利用する他に、選択しているバレットの属性を、そのまま自分の拠点の属性情報とします。
例えば、バレットの属性が A という情報なら、自分の拠点の属性も A として扱うようにします。
この情報とエネミーの属性情報とを確認して、相性の良しあしを判断するようにします。
エネミー側からみて、拠点の状態が弱点であるかどうかを判定し、拠点の弱点である属性のエネミーや、エネミーのバレットの場合には、
プレイヤーが受けるダメージを増やす等の、特別な処理を行うようにします。

 属性の種類は増えていく可能性がありますので、専用の enum を作成し、そちらで種類の管理を行うようにします。
各スクリプタブル・オブジェクトにはこの属性の種類を1種類だけ登録できるようにします。
この情報を参照することで、エネミーやバレットに与えられた属性の情報をゲーム内に反映して処理できるようにします。

 その後、この ElementType を管理するためのデータベースとして、ElementDataSO スクリプタブル・オブジェクトを作成します。


2.ElementType スクリプトを作成し、属性の種類を ElementType 型の enum として利用できるようにする


 EnemyType 型を作成した際と同じように、enum (イーナム) を利用して、エネミーの移動方法の種類を事前に登録し、
この情報をゲーム全体で利用する属性の情報として EnemyData クラスや BullteData クラス内に設定できるようにします。

 なお、属性の種類(列挙子)については任意です。今回は ElementType 型で、色で用意していますが、Fire、Ice などの種類でも構いません。
自分の考えている世界観にあったものを列挙子として登録してください。

 属性の判定方法ですが、多くのゲームに採用されている「三すくみ(じゃんけん)」の法則と、
「表裏(A ⇔ B) = お互いが弱点同士」の法則を利用する予定です。

 下のケースでは、「White ⇔ Black」が表裏の法則、「Blue → Red → Green → Blue」が三すくみの法則として利用予定です。

 他の法則(5行の相克、弱点が2つある、など)での利用方法ももちろん可能ですので、その場合には、それをイメージして列挙子を登録してください。
その場合は設計・ロジックはしっかりと自分で考える必要があります。


ElementType.cs

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


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


3.ElementDataSO スクリプトを作成する


 ElementType 型は完成しました。これは属性の種類の情報ですので、こちらを活用するための方法を考えます。

 属性情報を扱うデータベースがあると便利ですので、ElementType を1つずつ管理しているデータを用意し、
その属性に関連する情報(属性の画像など)を1つずつまとめて置くようします。



 スクリプタブル・オブジェクトを作成するために必要な ElementDataSO スクリプトを作成します。
スクリプタブル・オブジェクト専用の ScriptableObject クラスを継承し、[CreateAssetMenu] 属性を記述することで作成可能になります。
 
 スクリプタブル・オブジェクトでは、指定したデータを複数のデータとしてまとめて管理することが出来ます。
そのため、データベースとしての役割を果たすことが可能になっています。

 今回指定して管理したいデータは属性のデータです。
そのため、スクリプタブル・オブジェクト内に必要な情報は以下の2つです。

 1.属性1つ単位でのデータ(属性の種類、画像などのデータ群)を扱うクラス
 2.属性ののデータをまとめる List(リスト)


 まずは最初にスクリプトを記述してから、内容を確認しましょう。



ElementDataSO.cs

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


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


4.ElementDataSO スクリプタブル・オブジェクトを作成する


 Unity の左上のメニューより、Assets => Create => Create ElementDataSO を選択します。
新しく ElementDataSO というファイルが作成されます。名前はそのままで構いません。

 このアイコンの形が違うファイルがスクリプタブル・オブジェクトになります。
これはアセットとして取り扱われるようになる情報です。

 ElementDataSO スクリプタブル・オブジェクトを Datas フォルダへ移動してください。


<フォルダ管理>



 それではスクリプタブル・オブジェクトに属性のデータを登録します。


5.ElementDataSO スクリプタブル・オブジェクトの設定を行う


 作成された ElementDataSO スクリプタブル・オブジェクトを選択してインスペクターを確認します。
ElementDataSO スクリプトにて宣言した elementDataList 変数がインスペクターに表示されて、 Sizeが 0 になっています。
これがスクリプタブル・オブジェクトの中身です。

 Size に任意の数を入力すると、同数の Element が作成されます。これが List で管理する ElementData クラスの情報群になります。


インスペクター画像



 属性には現在5種類ありますので、データも5つ分登録しておきたいと思います。
EnemyDataList 変数の Size を 5 に変更してください。Element 0 〜 4 が下に作成されます。

 Element とは List の要素(中身)のことです。
そのため、Element 1つが ElementData 1つになります。Element の番号は 0 から始まります。

 以上のことから、1つの Element には1つの ElementData クラスの内容を設定できるようになっています。
このとき、ElementData クラスの上に [Serializable] 属性を宣言しているので、ElementData クラスの内容がインスペクターに表示されています。
[Serializable] 属性を活用することによって、インスペクターから属性用の情報を1つずつ、ElementData 単位で登録出来るようになっています。


 
 まずは最初に、ElementType をすべて別のもので登録してください。
 画像は任意です。属性の情報に見合った画像ファイルをインポートして利用しましょう。
1つの画像ファイルに複数の画像が登録されている場合には、Sprite Editor 機能を利用して分割してください。
画像ファイルの名前はわかりやすいものに変更しておくと管理が楽になります。

 No の値だけは異なる番号で設定してください。できれば 0 から連番が理想です。
この番号は属性用の個体番号として利用する可能性がありますので、同じ番号を重複して設定してしまうと、同じ番号の個体が複数存在することになり、
番号によって属性を特定することが出来なくなります。 


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



フリー画像例






66.各スクリプタブル・オブジェクト用のスクリプトを修正し、ElementType 型の属性情報を追加する

1.設計


 作成した属性の情報を利用できる状態にします。

 属性の情報を持たせたいクラスのスクリプトを修正しましょう。

 バレットの情報に属性の情報を追加するには、BulletDataSO スクリプト内の BulletData クラスに追加します。
 エネミーの情報に属性の情報を追加するには、EnemyDataSO スクリプト内の EnemyData クラスに追加します。


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


 BulletData クラス内に ElementType 型の変数を追加します。


BulletDataSO.cs

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


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


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


 EnemyData クラス内に ElementType 型の変数を追加します。
またエネミーの発射するバレットの情報にも BulletData を利用できるようにするため
BulletType 型の変数も一緒に追加してください。


EnemyDataSO.cs

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


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


4.各スクリプタブル・オブジェクトの設定を行う


 スクリプタブル・オブジェクト用のスクリプトを修正しましたので、
各スクリプタブル・オブジェクトには、属性の情報が追加されています。
任意の情報を設定してください。

 参考画像を提示しておきます。 
なお、EnemyData には BulletType の項目も追加してありますので、
ボスは A を、もう1体のエネミーには B を設定してください。残る1体は None に設定してください。

 これでエネミーの打ってくるバレットにも BulletType を元に参照して BulletData の情報を利用出来るようになります。


BulletDataSO スクリプタブル・オブジェクト インスペクター画像



BulletDataSO スクリプタブル・オブジェクト インスペクター画像




EnemyDataSO スクリプタブル・オブジェクト インスペクター画像




EnemyDataSO スクリプタブル・オブジェクト インスペクター画像



 以上で設定は完了です。



67.ElementCompatibilityHelper スクリプトを作成し、属性による相性の判定を行う機能を追加する

1.設計


 各データに属性の種類を登録しました。この情報を元にして、ElementDataSO スクリプタブル・オブジェクトから
必要な属性の情報を参照して検索する方法で、属性の情報を特定します。
この1つの情報を元にデータベース内を検索しデータを特定する手法はエネミーやバレットの際と同じものです。

 今回作成した属性の情報は、エネミー側、そしてプレイヤー側の両方で活用したい情報になります。
例えば、プレイヤー側が発射したバレットの属性と、それがぶつかったエネミーの属性の情報の両方を確認して、
その相性となる評価を行うような設計が好ましいと考えられます。そして、その逆の処理も行いたいです。

 そうなった場合、属性間の相性の評価・判定を行う処理をどのスクリプトに準備するかをしっかりと考えて設計をしていく必要があります
プレイヤー側とエネミー側が共有して利用できるスクリプトがあって、そのスクリプトはどちらのスクリプトからでも自由に参照できるようにするイメージです。
このロジックを考えて実装を行いましょう。

 いくつかの方法が考えられます。

<実装案>
 1.GameData クラスのような、シングルトンパターンのクラスを新しく作成し、そちらに属性間の相性を判定する処理を実装する
 2.GameData クラス内に、属性間の相性を判定する処理を実装する
 3.TransformHelper クラスのような static なクラスを作成し、属性間の相性を判定する処理を実装する

 教材としてはクラスの役割分担の観点より、【3】の手順での実装を考えます。実際にはどの方法で実装していただいても構いません。
自分が試したいものを実装してみてください。また、複数の実装方法を試していただき、それぞれの処理が正常に動作するか確認することも
非常によい学習になります。教材にないことは試さない、のでなく、あくまでも自分で興味を持ってそこに取り組む、という主体性を持って製作をしてください。


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


 いずれのスクリプトからでも参照可能になる static なクラスを作成し、処理を行う static なメソッドを用意します。

 TransformHelper スクリプトを作成したときの手順を振り返りながら処理の実装を行ってください。
利用方法も同じになります。つまり、変数に代入する処理は不要となり、「static クラス名.static メソッド名」で処理を実行できます。


ElementCompatibilityHelper.cs

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


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

 処理の内容をしっかりと読み解いてから次に進みましょう。



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

 次は 発展34 −属性の要素の運用− です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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