Unityに関連する記事です

 アイテムのデータをマスターデータより直接利用する以外に、必要なアイテムのデータごとに事前に抽出しておいて、その中から検索を出来るようにします。

手順20 −マスターデータの抽出方法−
35.DataBaseManager スクリプトを修正する


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

 ・String.IsNullOrEmpty メソッド
 ・Enum.GetNames メソッド



35.DataBaseManager スクリプトを修正する

1.設計


 ItemDataSO スクリプタブル・オブジェクトにはすべての種類のアイテムを登録します。
そのため、登録する順番などは関係なく、いろいろな種類のアイテムのデータが混在しています。

 これはマスターデータとしては問題ありませんが、実際にゲームの中で利用するには煩雑すぎます。
ゲーム内で利用しやすいように、アイテムの種類ごとなどに分類して、そのデータ群を管理して運用していく方法が実用的な運用方法になります。



 例えば、ItemDataSO スクリプタブル・オブジェクトに、ItemType が Equip のデータが3種類、 Sale のデータが4種類、Use のデータが2種類あったとします。
このデータを利用とする場合、これらのデータ9種類すべてを毎回精査し、対象となるデータを見つける所から始める必要があります。

 そうではなく、この9種類のデータをゲーム開始と同時に、Equip のデータだけを管理する List、Sale のデータだけを管理する List、というように
マスターデータをさらに用途ごとに絞って List に抽出しておくようにします。このように事前にマスターデータのデータが分類に応じて List 化されていることで
Equip の種類の List 内には、Sale や Use の種類のアイテムのデータは存在してないことになりますから、アイテムのデータ検索が行いやすくなります。

 この方法を覚えることにより、武器だけの情報がある List を作成しておいて武器屋に並べるアイテムをこの List 内から選択できるように出来ますし、
今はまだありませんが、ItemData にレアリティなどの情報を持たせることにより、レアリティ別の List を作成しておいて、宝箱の中身をレアリティ別に用意したりする、という
ゲーム内に応用可能な処理が実装出来るようになります。


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


 この方式に則り、DataBaseManager スクリプトには、各アイテムの種類に応じたデータが入るための List を4種類用意します。これは、アイテムの種類が4種類であるためです。
同じように、アイテムの名前についても、アイテムの種類に応じて4種類の List に分類するようにします。そのため、くさりかたびら、という名前は Equip に分類される、というように分類しておきます。
 
 同じように文字列の List も4種類用意し、合計で8種類の List を作成し、アイテムの種類ごとに分類して作成を行うようにします。
アイテムの情報を検索する場合には、これらの List を活用し、ItemDataSO スクリプタブル・オブジェクトを直接は利用しないで済むような設計にしておきます。

 メソッドは Create 〜 という名称で始まるメソッドが2つ、Get 〜 という名称で始まるメソッドが3つ作成します。

 Create 〜 のメソッドは、DataBaseManager スクリプトの Awake メソッド内で実行されて、アイテムの種類毎の List と、
アイテムの種類からアイテムの名前を参照した List をそれぞれ作成する処理を実行します。 

 Get 〜 のメソッドは外部のスクリプトから実行されるメソッドです。
これらは引数で受け取った情報を元に List 内を検索して必要な情報を取得して戻すゲッターメソッドになります。

 この処理には複数のメソッドを複合的に利用して処理を実装していますので、しっかりと処理を読み解いていく必要があります。


DataBaseManager.cs

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


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



 DataBaseManager ゲームオブジェクトを選択してインスペクターを確認します。
新しく SerializeField 属性で宣言した各 List の変数が表示されていれば問題ありません。


インスペクター画像



3.<String.IsNullOrEmpty メソッド>

 
 IsNullOrEmpty メソッドは String クラスが持つ機能の1つです。利用するためには、using System の宣言が必要になります。

 引数内に指定された文字列が null 、あるいは空の文字列 ("") であるかどうかを判定して真偽値を戻します。
null、あるいは空の文字列 ("") である場合には true文字列が null でない場合には false を戻します。

 値があるか、ではなく、値がないかに主を置いた判定ですので、真偽値の使い方を間違えないようにしましょう。

 つまり、文字列が入っていることを期待するのであれば、false であることを判定値に使う必要があります

  if (!string.IsNullOrEmpty(value.FirstOrDefault(x => x == itemData.itemName.ToString()))) {

 今回のケースの場合、引数として指定されているのは、【value.FirstOrDefault(x => x == itemData.itemName.ToString())】の部分であり、この戻り値が判定の対象です。
string 型の value 配列に対して実行されている FirstOrDefault メソッドの処理の結果が string 型になって戻ってきますので、
その値が null なのか、あるいは値があるのかを判定して、真偽値を戻す処理になっています。


参考サイト
MicroSoft C# ドキュメント
String.IsNullOrEmpty(String) メソッド
@IT 様
文字列がnull(Nothing)か空文字列かを簡単に判定するには?


4.<Enum.GetNames メソッド>


 指定した列挙体(enum)に含まれている定数の名前の配列を string 型にて取得します。
このメソッドを利用するためには using に System の宣言が必要になります。宣言しないで利用する場合には、Enum.GetNames のメソッドの実行時に宣言を行います。

  using System;

  string[] values = Enum.GetNames(typeof(ItemName));           // using の宣言あり

 string[] values = System.Enum.GetNames(typeof(ItemName));    // using の宣言なし

 このケースの場合、ItemName 型の enum に登録されている列挙子の名前を文字列(string)型として取得します。
そのため、values 配列変数の値は、薬草、くさりかたびら、といった、ItemName に登録されている情報が文字列になって格納されます。


参考サイト
MisroSoft C# ドキュメント
Enum.GetNames メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system...
JOHOBASE 様
enum(列挙型)の値と名前を取得する(GetValues/GetNames)[C#]
https://johobase.com/enum-getvalues-getnames-cshar...


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


 ゲームを実行すると、DataBaseManager スクリプトの Awake メソッドにて各 List に ItemDataSO スクリプタブル・オブジェクト内のデータを
自動的分類して、対象となる ItemData の情報のみが格納されている List が完成すれば制御成功です。


インスペクター画像



インスペクター画像



 マスターデータを各アイテムの種類ごとに分類して List 化することができました。


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

 次は 手順21 −スクリプタブル・オブジェクトのインスペクター表示の変更− です。



コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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