Unityに関連する記事です

設計


 敵の種類が多くなってくるとデータ管理が煩雑になってきます。Unityではスクリプタブル・オブジェクトというデータベース用の機能がありますので
この機能を利用して敵の情報をデータベースで一元管理し、必要な時に情報を取り出せるように用意しておくようにします。

 こちらの使い方を含めまして、データベースをどのようにゲーム内の敵のデータとして反映して利用していくか、手順をまとめています。

実装手順


 以下のような順番で実装を行っていきます。

1.敵の情報を設計する
2.スクリプタブル・オブジェクト用のEnemyDataListスクリプトを作成する
3.【2】のスクリプタブル・オブジェクトを元に、スクリプタブル・オブジェクトのアセットを作成する
4.スクリプタブル・オブジェクトに敵の情報(値)を登録する
5.スクリプタブル・オブジェクトを管理するDataBaseManagerスクリプトを作成する
6.EnemyBaseを修正して、スクリプタブル・オブジェクトの情報を反映できるようにする

1.敵の情報を設計する


 ゲーム内に使用したい敵の情報を定義します。今回は以下の情報を扱えるようにしようと思います。

・敵の通し番号
・名前
・最大Hp
・攻撃力
・防御力
・移動速度
・経験値
・お金
・ドロップするアイテムの種類

 この情報をスクリプタブル・オブジェクトに登録していきましょう。

2.スクリプタブル・オブジェクト用のEnemyDataListスクリプトを作成する


 【1】で設計した敵の情報を扱う、スクリプタブル・オブジェクトを作成していきます。
今回は敵1体ずつのデータを扱うEnemyDataクラスと、そのEnemyDataをListにして管理するスクリプタブル・オブジェクトとを一緒に作成しています。

 新しくC#スクリプトを作成して、名前を EnemyDataList に変更します。

EnemyDataList.cs


 EnemyDataというクラスが、敵の情報を扱うクラスです。この情報を登録し、ゲーム内で扱えるようにします。これは敵1体ずつ、設定できます。

 また、enemyDatasというListの変数が、EnemyDataをまとめて管理している値になります(この中に、複数のEnemyData(敵1体ずつ)の情報が入っています。)

3.【2】のスクリプタブル・オブジェクトを元に、スクリプタブル・オブジェクトのアセットを作成する


 スクリプタブル・オブジェクトのスクリプトを作成しましたら、今後は、それをアセットとして生成します。
Unityの左上のメニュー内の Assets => Create => MyScriptable => Create EnemyData の順番で選択してください。

 Project内に EnemyDataList という名前のスクリプタブル・オブジェクトが作成されます(アイコンの形が他と違うものです)

手順動画
https://gyazo.com/e55853aa57f0fe13f70845d221d6d9fc

 クリックしてインスペクターを確認してみてください。画像のような状態が表示されると思います。これで生成は無事に完了です。



4.スクリプタブル・オブジェクトに敵の情報(値)を登録する


 インスペクターを確認して頂くと、enemyDats の Size が 0 になっていると思います。これは enemyDatas というスクリプタブル・オブジェクトが管理しているListの数です。
つまり、登録している敵の情報数です。現在はまだ敵の情報がないため、Listも0の状態です。

 この値を出現させたい敵の数に設定してみてください(今回は3を設定しています)
画像のようにElementの情報が0〜2(指定したSize - 1)で追加されます。


 
 一番上にあるElement0の部分をクリックしてみてください。閉じられていた部分が開いて、情報を登録できる部分が開きます。
こちらに敵の情報を登録してください。
登録情報の1つであるDropItemNosは配列ですので、Size を指定し、その敵を倒した際にドロップするアイテムの番号を登録しておきます。
現在アイテムは3種類ありますので、0、1、2のいずれかの値を設定します。(複数のアイテムから抽選したい場合にはSizeを1より大きくして複数の番号をそれぞれに登録してください)



 ここではSlime、Skelton、Ghostを順番に登録しています。
Element0 Slimeの情報


Element1 Skeiton とElement2 Ghostの情報


 これでスクリプタブル・オブジェクトへの敵の情報は登録できました。変更も自由にできますので、適宜調整してください。
また敵の数を増減する場合には Size の値を変更してもらうと Element の値がそれに合わせて変化し、追加で登録出来るようになります。

5.スクリプタブル・オブジェクトを管理するDataBaseManagerスクリプトを作成する


 完成したスクリプタブル・オブジェクトは、いずれかのスクリプトで管理を行う必要があります(アセットの扱いですが、スクリプトに変数として宣言できます)

 設計としてましては「生成された敵が、自分のデータを確認しにいって、スクリプタブル・オブジェクトから情報をもらう」という処理にしたいと思います。

そこで、どの敵からでもアクセスしやすいスクリプトであった方が利便性が高くなります。
またこのようにアクセスするスクリプトを1つにしておくことで敵1体ずつにスクリプタブル・オブジェクトを登録する必要もなくなります。

 そのためスクリプタブル・オブジェクトを管理するDataBaseManagerスクリプトはシングルトンで作成するようにして、敵からのアクセスが容易な状態で作成を行います。

 C#スクリプトを新しく作成し、名前を DataBaseManager に変更します。

DataBaseManager.cs


 このDataBaseManagerは名前のごとく、ゲーム内に登録する情報を一元管理させるための役割を持っています。
現在は、敵の情報のリストであるスクリプタブル・オブジェクトと、敵を倒すと生成するアイテムのプレファブ情報を管理しています。

 スクリプトが完成しましたら、ヒエラルキー上で Create Empty を選択して、名前を DataBaseManager に変更します。
このゲームオブジェクトにDataBaseManagerスクリプトをアタッチしてください。インスペクターを確認して頂くと、次の画像のような状態になっていると思います。




 まずはスクリプタブル・オブジェクトをアサインしましょう。

スクリプタブル・オブジェクトのアサイン
https://gyazo.com/9bd44a06d297f232ff2b1a04e4d3174c

続いて、アイテムのプレファブ情報をアサインします。まずはSizeを0から3に変更して、Elementを用意します。


アイテムプレファブのアサイン
https://gyazo.com/e4a70587c3a5b389d70366585c32ef48


 完成すると、次のような画像の状態になります。


6.EnemyBaseを修正して、スクリプタブル・オブジェクトの情報を反映できるようにする


 スクリプタブル・オブジェクトを使用する準備が整いましたので、最後にEnemyBaseを修正していきます。
宣言フィールドの修正、Startメソッドの修正、DropItemメソッドの修正が主な項目です。(他にもありますので、全文掲載します)


EnemyBase.cs


 まず宣言フィールドでは、敵の情報をスクリプタブル・オブジェクトから取得する方法に変更したため、個別で設定を行う必要がなくなりました。
そのため、不要になった変数を削除しています。

 代わりにスクリプタブル・オブジェクトから敵の情報を照合するために、敵の通し番号を利用していますので、この番号を変数で用意し、インスペクターで登録しておきます。
スクリプタブル・オブジェクトに登録した番号で照合されますので、例えばSlimeの情報が欲しい場合に、スクリプタブル・オブジェクトの敵のNoが0の番号がSlimeである場合には、
ここには0を登録します。

 Startメソッドにて、DataBaseManagerのGetEnemyDataメソッドを呼び出して、自分の持つ番号を渡して、スクリプタブル・オブジェクトのデータと照合をしてもらいます。
その照合結果としてEmenyDataを戻してくれますので、これをそのまま敵の情報をして利用します。

 例えば0という情報を渡してメソッドを呼び出してあげると、Slimeというデータとして情報を戻してくれます。
この値がスクリプタブル・オブジェクトの登録されている情報ですので、正常に敵の情報が取得できれば、スクリプタブル・オブジェクトの利用が出来ています。

 また敵のドロップするアイテムについても、DataBaseManagerのGetDropItemPrefabDateメソッドを呼び出すことで、指定した番号のアイテムのプレファブ情報を戻してくれます。
こうすることで敵1体ずつにプレファブの情報をアサインする手続きがなくなります。プレファブの管理もDataBaseManagerを確認すれば済むようになりますので効率化が図れます。


実行動画
https://gyazo.com/e3512bbb4b2355cd31036173d78741c0

 EmenyBaseに用意してあるEnemyDataの値が正常に入っているのが分かりますでしょうか。
 
 あとは各敵のプレファブごとに、スクリプタブル・オブジェクトに登録した番号を設定してあげれば、すべての敵の情報をスクリプタブル・オブジェクトから取得することが出来ます。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

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

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

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

private



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

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