キャラクターの持ち物を管理するプログラムをUnityで作る

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

アイテムを番号で管理し、0だったらナイフの事でitem[0] = true;
等としてアイテムを持っているかどうか判断する事も出来ますが、アイテム数が増えてくると何番が何のアイテムだったか、わからなくなってきます。

多元配列にしてitem[アイテム名][持っているか持っていないか]
とする事も出来ます。

スポンサーリンク

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

しかし、もっと簡単な方法もあります。
それは、列挙型を使う方法です。
列挙型は

と宣言します。上から順番に0,1,2と対応していきます。

例えば

public var ItemFlag : boolean[];

というインスペクタでOn、Offを指定できるアイテムフラグを作成します。

アイテム1

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

ItemFlag[Item.Knife] = true;

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

アイテムを取得する場合、同じようなUIを使うと思いますが、そのUIを全部同じにして、public変数でアイテムの名前を指定し、アイテムを取得する処理のところで、

等とすればアイテム取得のスクリプトを量産する必要もなくなるので便利かもしれません。

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

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

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

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

以降は後で追記した部分なので、C#で記述しています。

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

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セットで表示するにはエディターの拡張機能で行うしかなさそうですね・・・・。

これでキャラクターの持ち物の管理が楽になるはずです。
小さな事ですが、視覚的にわかりやすいというのは非常に重要かもしれません。
ナイフを取ったはずが懐中電灯だったという単純なバグの発生を防ぐ事が出来ます。

ステータス画面でUIを使って持ち物を管理する方法がやりたいんですが、今のところ出来ていないです。
ちょっとはまってしまっているかもしれません・・・・(+_+)

なんとか出来たのが

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

になります。

参照してみてください。

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます