[Unity]インスペクタ内で編集できるシンプルなデータベース作成方法

Unity

ゲーム製作の際に、敵の種類やアイテムごとのパラメータをデータベースとして実装したい時がよくあります。方法は様々ですが、どれも難しそう、とっつきにくそうなイメージがあります。そのため今回は、スクリプトで実装可能かつUnityのインスペクタ側で編集可能なシンプルなデータベースの実装例を紹介していきます。

実装方法

スクリプトの準備

まず、入力の受け皿となるデータベースを作成していきます。新しいC#スクリプトを作成し以下のように記述しました。

データベース部分のソースコード

クラス定義の際に、 [CreateAssetMenu]という属性を追加しています。これにより、Unity上で新しいフォルダやマテリアルなどを作成する際と同じ手順で新規データベースを作成することができます。
また、継承先がMonoBehaviourではなく、 ScriptableObjectになっています。これは公式のドキュメントによると

スクリプトインスタンスから独立した大量の共有データを格納できるクラス

Unityのスクリプトレファレンスより引用

というものであり、メリットとして、独立して機能することによりスクリプトをオブジェクトに張り付ける必要がなく、アセットとして簡単に利用できることなどが挙げられるため、今回用いています。このScriptableObjectのもっと詳しい情報は、ScriptableObjectとは【Unity】【ScriptableObject】という記事が非常に参考になりました。

クラス内では、データベースの値を他のスクリプトから参照する為の実装を行っています。
publicのExampleはプロパティという、クラスの外から見ると変数のように振る舞い、 クラス内から見るとメソッドのように振舞うもの、つまり内外部のどちらでも値を参照可能で更新も可能というものです。このプロパティが「=>」記号を用いてexampleを指定することで、privateのexampleの値を取得しています。他のスクリプトでこの値を利用したい際は、このプロパティをメソッドとして呼ぶことにより値が取得可能です。
この部分に関しては、理解しずらく、少しとっつきにくいかと思います (正直自分もそれほど理解していないです) 。ここでは、単に他のスクリプトから値を利用したいだけなので、もちろん別の実装方法でも可能です。今回は簡潔に書けるという理由から、これを利用しました。

また11行目以降から、structを用いて構造体を定義しています。この構造体内の変数がデータベースにおけるデータの部分になります。また、構造体の定義時に[System.Serializable]を追加しています。これにより、インスペクタ上に構造体(またはクラス)を表示することができます。ちなみにExample構造体内のprivate変数には[SerializedField]を追加していますが、これは追加した変数を、 [System.Serializable]と同じくインスペクタ上に表示する機能があります。要するにインスペクタ上でパラメータを操作したい場合はシリアライズすればよい、というイメージです。

データベースアセットの作成と入力

スクリプトでデータベースの実装までが終わったので、Unity上でデータベース内に値を入力していきます。非常に簡単です。

まず新しいデータベースを作成します。プロジェクトのCreateから新しいExampleデータベースを作成し適当な名前を付けます。

作成したデータベースをクリックし、インスペクタ側で好きなように値を入力します。

そしてデータベースを参照する為に、”Resources”という名前でフォルダを作成し、先ほどのデータベースアセットを入れておきます。
これでデータベース自体の準備は完了です。

データベースから値を取得

最後にデータベース自体が完成したので実際に値を取得したいと思います。
今回の方法では、データベースのデータを個別IDから選択するマネージャークラス(DataBaseManagerスクリプト)と実際に値を取得するクラス(GetDataBaseValueスクリプト)の二つの実装を行います。

DataBaseManagerのソースコード

4行目のstatic readonlyは、基本的に読み取り専用の定数として扱うことを示しています。似たような修飾子にconstというものがありますが、こちらは参照型(intやfloat、bool等の基本的な型以外の型のこと)で利用することができないという制限があるため、基本的にはconstを用いずにstatic readonlyを使用します。

7行目ではDataBaseManagerのコンストラクタを作成し、Resources.Load()メソッドを使って、先ほど作成したデータベースアセットを読み込んでいます。
また10行目以降のGetExampleData()メソッドでは、データベースのidと引数を照らし合わせて、個別のデータベースを選択しています。

GetDataBaseValueのソースコード

最後に完成したDataBaseManagerにidを投げて、得られたデータベースからパラメータを取得してみます(取得した値をDebug.Log()でコンソール上にさせて確認しています)。

Startメソッド内で、DataBaseManagerクラスのGetExampleDataメソッドを呼びだしExample型の変数に代入します。
後は、データベース内の好きな値を8行目のように取得可能です。

Idが1のデータベースからNameを取得している

まとめ

ScriptableObjectを継承したスクリプトを利用することで、プロジェクト上に存在しなくても、参照可能な情報を用意することが可能になります。これによって実装したデータベースには、値を逐次更新することができないというデメリットがありますが、インスペクタ上で簡単にパラメータを編集できるので、ロジックが単純なゲームの製作の際には有用性が高いと思います。

コメント

タイトルとURLをコピーしました