こんにちは、オーリーです。
今回は、Unityのゲーム開発で、 ScriptableObjectを使用したデータベースの作成により、多数のアイテムを気軽に、そして管理も簡単にできる機能を実装したので、その方法について解説していきます。
目次
・ ScriptableObject とは
・ItemDataBaseの作成
・Itemクラスの作成
・ItemDataBaseへの追加
・まとめ
まず、 ScriptableObjectはなんでしょうか? という所から
簡単に言えば、「データを格納することのできるクラス」です。
例えば、アクションゲームなどで大規模な人数の敵がいるとします。
もちろん敵なので、体力等のステータスがあると思います。
これらをEnemyGeneratorクラスとして敵を生成するスクリプトを記述し、特定の場所からポップさせるとします。
その際、敵は倒されれば消え、ステータス等を初期化して登場させる必要があります。
この初期化した状態のステータスを保持する機能を持ったものがScriptableObjectです。
今回は、この機能を使ってItemを管理するItemDataBaseを実装していきます。
ここではまず、Itemクラスと名前を付けたスクリプトを作成しておきます。中身については後程記述していきます。
理由としては、データベースの役割をするオブジェクトがエラーにより作成されないためです。
Itemクラスの作成が完了したら、ItemDataBaseクラスを作成します。
実際のコードがこちらです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "ItemDataBase", menuName = "CreateItemDataBase")]
public class ItemDataBase : ScriptableObject
{
public List<Item> items = new List<Item>();
}
ScriptableObjectを使用する際は、 ScriptableObject クラス(Unity側で用意されたクラスの一つ)を継承し使用します。
名前をitemsとし、Itemクラスの中身をリスト化しています。
また [CreateAssetMenu(fileName = “ItemDataBase”, menuName = “CreatItemDataBase”)] と記載がありますが、これはUnityの機能として用意されているもので、Unity内部のAssetフォルダにオブジェクトを生成します。
上記の場合は、fileNameが「ItemDataBase」のスクリプトで、「CreateItemDataBase」を作成するといった内容です。
Assetフォルダ内で右クリック -> Create -> 最上段に作成したオブジェクトの項目が出来ていますので、クリックします。
それにより生成されたものが、以下のオブジェクトです。
この生成されたものが、ItemDataBaseのデータファイルになります。
ここでは以後、これらをデータファイルとして呼称します。
この データファイルを開くと、以下のようになっています。
先ほどコードの中に「items」と名前を記述しましたが、その通りに設定されていると思います。
これがItemの情報を一括管理する、ItemDataBaseとして機能していきます。
ただ、Itemクラスを実装した際、こちらにアイテムを追加する必要があります。
そのために、Itemクラスの実装を行います。
Itemクラスの作成には、配列ではなく列挙型を使用します。
配列を使用した場合、アイテムが増えた時に追加が煩雑になるためです。
以下が実際のコードです。
ここでは、ItemDataBaseに登録するItemの種類、情報の2種を保持しています。
using System;
using UnityEngine;
[Serializable]
[CreateAssetMenu(fileName = "Item", menuName = "CreateItem")]
public class Item : ScriptableObject
{
public enum Type // 実装するItemの種類
{
UserItem,
CraftItem,
KeyItem,
}
public Type type; // 種類
public String infomation; // 情報
public Item(Item item)
{
this.type = item.type;
this.infomation = item.infomation;
}
}
列挙型を使用することで、アイテムに追加があった場合、アイテム名を追記するだけで追加が可能となるため、管理がとても楽になります。
ここでもItemDataBase同様、[CreateAssetMenu]を付与しデータファイルを作成できるようにします。
スクリプトの作成が完了したら一度Unityの画面へ戻り、今回追加したデータファイルを作成していきます。
追加を行うには、ItemDataBaseのデータファイル作成時と同様です。
※Assetフォルダ内で右クリック -> Create -> 最上段のCreateItem
今回の場合は、アイテムの種類と情報をここで保持するものを3種用意したため、データファイル3つ作成します。
UserItemを例にみると、以下のようにItemTypeとInfomationという項目が出来ていると思います。
KeyItem、CraftItemも同様となっているため、それぞれに必要な情報を付与していきます。
これでItemの準備は整いました。
今度はこれらをItemDataBaseへ登録していきます。
ItemDataBase、Itemの準備が完了し、あとは追加をするのみとなりました。
現状ItemDataBaseのリストは空となっているため、まずは追加する数を設定します。
まずは、Itemsの隣にある項目に、追加するアイテム数を入力します。
あとは、この「None(Item)」となっている項目に、Itemクラスの作成で追加したデータファイルを付与するのみで追加が完了します。
もし以下のようにItemの画像などを追加したい場合は、Itemクラスに追加要素を記述するだけで追加が可能です。
using System;
using UnityEngine;
[Serializable]
[CreateAssetMenu(fileName = "Item", menuName = "CreateItem")]
public class Item : ScriptableObject
{
public Type type; // 種類
public String infomation; // 情報
public Sprite sprite; // 画像(追加)
public enum Type
{
UserItem,
CraftItem,
KeyItem,
}
public Item(Item item)
{
this.type = item.type;
this.infomation = item.infomation;
this.sprite = item.sprite; // 画像(追加)
}
}
画像を追加する項目が増えていますね。
Itemクラスがアイテムの情報を保持しているため、アイテム情報の更新はItemクラスのみで済むため、管理が非常に楽になります。
これらを利用する場合は、ItemDataBaseからスクリプトなどで情報を取り出すことで活用が可能となります。
要点のまとめです。
・ScriptableObjectは、データを保持することのできるオブジェクト
・継承してクラスを作成することで、データベースの役割を持つデータスクリプトを作成できる
・作成したデータスクリプト内に [CreateAssetMenu] と記入することでオブジェクト(データファイル)として生成可能となり、ヒエラルキーにてデータの管理ができる
・Item情報の更新は、Itemクラスのスクリプトを書き換えるのみで可能
・ItemDataBaseには、Itemクラスで作成したデータファイルをアタッチするのみでデータベースとして活用が可能
今回は、簡単にアイテムデータベースの作成、管理を実装する方法を解説しました。
これを利用すれば、アクションゲームやシューターゲームなど、多様なゲームでアイテムやステータス管理が楽になると思います。
ぜひ利用してみてください。