Unityでのアイテム管理のやり方とアセットのおすすめ
Unityのゲーム制作ではほぼ確実にアイテム管理を行う必要がある。やり方は色々あるが、今回はScriptableObjectを使った方法を紹介していく。
ScriptableObjectの基本的な使い方がわからない場合は以下の記事を確認してみてほしい。
ステータス管理
また、アイテム管理に役立つアセットもあるので紹介していく。
Unityでのアイテム管理おすすめ目次
enumの使い方&データコンテナ作成データベース作成
Dictionaryの基本
Dictionaryを使ってデータベース使用
アイテム管理に役立つアセット
目次にもどる
enumの使い方&データコンテナ作成
まずはScriptableObjectを使って各アイテム自体の情報を格納できるデータコンテナを作成する。以下のitemdataのスクリプトを作成しよう。ひとまず今回はアイテムのステータスとして、Itemname(名前)、Itemtype(タイプ)、Itemicon(アイコン)、Itemexplanation(説明)、Itemlimit(持てる最大個数)を設定することにした。
「Itemname」と「Itemlimit」はintで変数を宣言。
「Itemexplanation」はstringで変数を宣言。
「Itemtype」はenumを使った列挙型で変数を宣言している。今回は以下のようにenumを使っている。
enumは以上のように複数の定数(変更できない変数)をひとつにまとめておくことができる型だ。今回はSword、rod、clothes、armor、recovery、nomal、importantを変更できない変数として宣言し一つにまとめている。enumを使えばアイテムのタイプなど変えることのない変数をわかりやすく記述できるので便利だ。
アイテムのアイコンについては画像を指定するため、Spriteを使って変数の宣言を行っている。
作った5つの変数には[SerializeField]でシリアライズ(シリアル化)しており、インスペクターでの記述を可能としてある。
後半は以下のように記述してある。
itemdataクラスで保持している変数を返すための物だ。
最初の方で以下のように記述してある。
よってプロジェクトビューで右クリック→Create→Data→Create ItemDataと選択することでItemDataのAssetファイルを作成可能
今回は以下の3ファイルを作成している。
例えばPortionはインスペクターで以下のように記述している。
以上のようにひとまず3ファイル程度でいいので適当に作成しよう。
目次にもどる
データベース作成
ScriptableObjectを使って各アイテムのデータをまとめるデータベースを作成する。以下のようにitemdatabaseのスクリプトを記述しよう。リストの使い方についてよくわからない場合は以下の記事で紹介している。
レベルアップシステム
今回は以下のように先ほど作成したitemdataを型としてリストを作成している。
[SerializeField]と記述しシリアライズを行っている。
後半には以下のように記述している。
これは作成したitemListsを返すために作成している。
最初の方で以下のように記述してある。
よってプロジェクトビューで右クリック→Create→Data→Create ItemDataBaseと選択することでItemDatabaseのAssetファイルを作成可能
作ったファイルを選択してインスペクターを出す。+マークで項目そこにドラッグ&ドロップで先ほど制作したItemDataのAssetファイルを3つ放り込む。
これでアイテム管理用のデータベースが完成した。
目次にもどる
Dictionaryの基本
作ったデータベースを使用するためのスクリプトを書くのにDictionaryを使うので、ここで説明する。DictionaryはListと同じく変数を複数まとめて扱うことができる変数である。異なるのはキーと値がセットになっている点。キーについてはユニーク(重複しない値)である必要がある。キーを使って値を追加したり取得したりすることが可能だ。
Dictionaryの宣言方法は以下の通り。
目次にもどる
Dictionaryを使ってデータベース使用
Dictionaryを使って各アイテムの初期化処理を行っていく(最初に持っているアイテムの数を決める・・など)。以下のようにitemsyokiのスクリプトを記述し空のゲームオブジェクトにアタッチしよう。シリアライズを行っているので、インスペクターではitemdatabaseのAssetファイルを指定しておく。
以下のように記述してDictionaryの宣言を行っている。
今回は各アイテムの数を管理するためにDictionaryを使っていく。
Dictionaryの変数名はPlayerItem、キーはitemdata、値はintである。
Startメソッドの最初では以下のように記述している。
for文がわからない&忘れた人は以下を確認してほしい。
for文について
今回はループするための変数としてiに0を代入し、ループ時の処理をi++としているのでループのためにiに1が加算されていく。
ループさせる条件はi < itemDataBase.GetItemLists().Count。GetItemLists()のメソッドでitemListsを返してもらっている(返す処理は先ほど作成したitemdatabaseに記述してある)。itemDataBase.GetItemLists().CountのようにCountをつけることでリストの要素数がわかる。リストの要素数がiを上回っている間はループし、iを1加算して処理が繰り返し行われることになる。
中身の処理は以下の通り。
DictionaryにitemDataBase.GetItemLists()[i]をキーにして値0を追加していく。先述したようにfor文でループしてiの値が増えていくので、キーが0、1、2、3・・と続きキー全てに0が代入される。
続いて以下のように記述している。
添え字を使ってitemDataBaseのItemListsの要素1に2を代入して上書きを行っている。つまり今回の場合はポーションのアイテム個数を2にしている。
この後はテストとして以下のように記述している。
itemDataBaseのItemListsの各アイテムを添え字としてキーにして値を出している。
ログを出すとa=は0、bは2、Cは0が入っていることがわかる。先ほど全てのitemkazuの値を0にしたものの、ポーションについては後からアイテム個数を2に上書きしたのが反映されているのが確認できる。
最後のテストとして以下のように記述している。
itemDataBaseのItemListsの要素1のItemtypeを取得してdに代入している。要素1はポーションであり、ItemtypeはRecoveryなので、ログのdにはRecoveryが入る。
目次にもどる
アイテム管理に役立つアセット
アイテム管理を行う場合、最低でもアイテムのアイコン画像については確実に用意する必要がある。アイテム管理に役立つおすすめの商品を紹介していくので確認してみてほしい。3700 Fantasy RPG Icons Pack
3700ものアイコンが入った巨大アセット。
剣・杖・槍・弓といった武器アイコン、様々な色の液体が入ったアイコン(ポーションなどの回復アイテムとして使えそう)の他、アクセサリーや鍵などのアイコンもある。
これだけ量があればアイテムを作っても当てはまる画像がないといった事態を避けることができる。
特におすすめの商品なので、ぜひ確認してみてほしい。
Ultimate Inventory System
本格的なアイテム管理システムを実装できるアセット。
各アイテムごとに効果などをわかりやすく設定できる。
それだけでなくインベントリにアイテムを収納したり、購入・売却システムやクラフトシステムを実装可能。装備システムもある。
値段は高め。だが、自力で作ろうと思えば膨大な時間がかかってしまう様々なシステムをまとめて実装できてしまう恐るべき商品だ。ぜひ確認してみてほしい。
Fantasy Inventory System
低価格ながら、アイテム管理システムを実装できるアセット。
アイテムを装備したり、購入・売却できるシステムも搭載されている。
コスパがいいおすすめ商品なので、ぜひ確認してみてほしい。
おすすめアセットまとめへ
続きの記事は以下。
インベントリ作成