Unityでキャラクターのアイテムを管理するプログラムを作る

記事内に広告が含まれています。

今回はキャラクターの持ち物の管理方法を考えます。

ゲームではアイテムを取得したり使ったりといった事を行う事がしばしばあります。

そんな時の為にアイテムをスクリプトで管理する機能を作成していきます。

スポンサーリンク

アイテム管理機能

アイテムを番号で管理し、0だったらナイフの事で

等としてアイテムを持っているかどうか判断する事も出来ますが、アイテム数が増えてくると何番が何のアイテムだったか、わからなくなってきます。

持ち物管理をする為に列挙型を使う

先ほどの配列での管理ではアイテムの取得に配列番号を指定する必要がありますが、どのアイテムがどの番号か間違えなければいいですが、アイテム数が増えれば増えるほど間違いが発生します。

そんな時に列挙型を使うと番号ではなく列挙型を指定すればいいのでどのアイテムか判別するのにわかりやすくなります。

と宣言します。

上から順番に0、1、2のintの値と対応出来ます。

例えば

のようなフィールドを宣言し、インスペクタにアイテムフラグを表示出来るようにします。

アイテム1

Knifeが0番目に対応するので、ナイフを取得した場合は

とします。こうすれば0番目と指定しなくて済むので視覚的に何を取得したのかわかりやすくなります。

また他のスクリプトから特定のアイテムを持っているか?という情報がほしい場合も

というゲッター関数を用意しておき、呼び出し側で

と記述すれば、ナイフを持っているかどうかの情報を得る事が出来ます。

Dictionaryを使ってアイテムの数を管理をする

列挙型とboolの配列型でアイテムを持っているかどうかを判断する事が出来ますが、列挙型とDictionaryを組み合わせるとアイテムの数を管理する事も出来ます。

Dictionaryに関しては

C#のDictionaryを使ってみる
C#のDictionaryをUnity付属のMonoDevelopで使ってみます。

を参照してください。

DictionaryのキーとしてItemの列挙型を指定し、値はint型でアイテムの数を設定出来るようにします。

↑の例ではStartメソッドで列挙型をキーに指定し、値を設定しています。

Dictionaryの場合はSerializeFieldやアクセス修飾子をpublicにしてもインスペクタに表示出来ません。

Dictionaryの値をインスペクタに表示するアセットを利用する

Dictionaryの値を表示したい時はUnityのアセットストアに表示する為のアセットを公開している方がいるのでそちらを使います。

アセットストアの検索でSerializableDictionaryで検索すると出てきます。

使用する場合はまずSerializableDictionaryクラスを継承した自前のクラスを用意します。

↑のようにItem列挙型をキー、int型を値とするSerializableDictionaryクラスを継承しItemDictionaryクラスを定義しています。

次にアイテムを管理するスクリプトを作成します。

ItemDictionary型のシリアライズ可能なフィールドを宣言します。

itemDictionaryのプロパティのアクセサーを作成します。

Startメソッドではプロパティのアクセサーを介して値をセットしています。

これでインスペクタにキーと値が表示されるようになります。

Dictionaryをインスペクタに表示

キーと値を1セットで表示するにはエディターの拡張機能で行うしかなさそうですね・・・・。

これでキャラクターの持ち物の管理が楽になるはずです。

小さな事ですが、視覚的にわかりやすいというのは非常に重要かもしれません。

ナイフを取ったはずが懐中電灯だったという単純なバグの発生を防ぐ事が出来ます。

持ち物を管理する画面については

Unityでキャラクターの持ち物画面を作成する
Unityのゲームで持ち物画面を作成し、アイテムの情報を見る事が出来るようにします

を参照してみてください。

アイテム管理に関してはScriptableObjectを使うとより簡単にアイテムの管理が出来るかもしれません。

UnityでScriptableObjectを使ってアイテムデータベースを作成する
UnityでScriptableObjectを使ってアイテムデータベースを作成し、そこからアイテム情報を引き出せるようにします。
タイトルとURLをコピーしました