敵や装備みたいな、バリエーションがたくさんあるものは、どうやって作ればいいの??
本記事の内容
・データベースとはなにか?
・データベースScriptableObjectを使おう
データベースを作ろう!
データベースってなに?
ゲームを作っていると、敵・アイテム・装備・スキルなど、同じような機能を持ったパラメータ違いのオブジェクトが複数必要になることがあります。
プログラムの基本的な考え方として、似たようなオブジェクトは抽象化して、共通化する、というものがあります。具体的な例でみてみましょう。
たとえば、「モンスターボール」・「スーパーボール」・「きずぐすり」・「まんたんのくすり」、というアイテムをゲームに実装するとします。
これらのアイテムを抽象化して、同じ括りでまとめてみましょう。
- アイテムのアイコン
- アイテムの種類(ボール or 回復)
- アイテムの名前
- アイテムの説明
- 効果値(例えばモンスターボールなら50%、スーパーボールなら70%、きずぐすりなら20、まんたんのくすりなら999)
つぎにこの括りに合わせて、各アイテムを当てはめてみます。画像は公式に怒られたくないので、適当なアイコンを入れています。
アイコン画像 | 種類 | 名前 | 説明 | 効果値 | |
モンスターボール | ボール | モンスターボール | 低確率で捕まえる | 50 | |
スーパーボール | ボール | スーパーボール | 中確率で捕まえる | 70 | |
きずぐすり | 回復 | きずぐすり | HPを20回復する | 20 | |
まんたんのくすり | 回復 | まんたんのくすり | HPを満タンまで回復する | 999 |
この表こそがデータベースです。
アイテム1つ1つをそれぞれ管理するよりも、アイテムデータベースとして一元化すると利点がたくさんあります。
- ゲーム内にアイテムを追加したい時に、データベースを更新するだけでアイテムを増やすことができます
- 処理の高速化
- バグ発生確率の低下(エラー起きたときに1つ1つを修正するのではなく、データベースを修正するだけでよくなる)
- エクセルやメモ帳などの外部ファイルをデータベースに読み込ませることで、テキストベースで管理が可能。つまり、プロジェクト内の誰でも更新作業が行える。
同じ属性で複数の種類がある、といったものは必ずデータベース化するのがよいでしょう。
Unityにおけるデータベース
ここまでがデータベースの概念についてでした。次に、このデータベースを実際に実装するにはどうしたらいいか、を見てみましょう。
Unityでは、先程のデータベースの表のヘッダ(1行目)に必要な列の内容をScriptable Objectで行います。
作るには以下の手順を行います。
※以下では、ChatGPTを使用しています。使い方はこちらの記事を参照してください。
今回は、必要な属性は以下の通りでしたね。
- アイテムのアイコン
- アイテムの種類(ボール or 回復)
- アイテムの名前
- アイテムの説明
- 効果値(例えばモンスターボールなら50%、スーパーボールなら70%、きずぐすりなら20、まんたんのくすりなら999)
ではこの内容で、ChatGPTに以下の通りお願いしてみましょう。
返ってきたスクリプトはこちらです。
using UnityEngine;
// アイテムの種類を表す列挙型
public enum ItemType
{
Ball, // ボール
Heal // 回復
}
[CreateAssetMenu(fileName = "NewItem", menuName = "Inventory/Item")]
public class Item : ScriptableObject
{
[Header("Item Properties")]
public Sprite icon; // アイテムのアイコン画像
public ItemType itemType; // アイテムの種類
public string itemName; // アイテムの名前
[TextArea]
public string description; // アイテムの説明
public int effectValue; // 効果値
// ここに必要に応じてメソッドや追加のプロパティを定義できます
}
では、ChatGPTの生成したスクリプトを、ゲームエンジンUnityで作ってみましょう。
まずは、プロジェクトウィンドウで右クリックして、[C#スクリプトを作成]をします。
次に、作成したスクリプトに、AIの生成したコードを貼り付けて保存します。
これで、データベースの定義は完成です。
次に、データベースの中身を入れていきます。
プロジェクトウィンドウに戻って、また右クリック→[作成]→[Inventory]→[Item]を選択します。
この階層は、先程貼り付けた[CreateAssetMenu(fileName = "NewItem", menuName = "Inventory/Item")]
という内容によって変化します。AIによっては名前が違うと思うのでご留意ください。
作成すると、青い箱のマークのオブジェクトが作成されたと思います。これをインスペクタウィンドウで見てみましょう。
先程のデータベースの表のヘッダ部にあたる内容が表示されていますね。これをクリックして各アイテムの内容をセットしていきます。今回はアイテムを4つ作るので、4つのScriptable Objectがあればよい、ということですね。
きずぐすりなら、こんな感じに設定すればよいですね。
これでデータベースの作成が完了です!簡単ですね!
このデータベースを最初に作った上で、実際にアイテムを回復する処理や、ボールを投げる処理を作るときに、このデーベースから対象のアイテムを検索し、効果値を取得して処理を行うことができます。
たとえば、「きずぐすり」というアイテムをプレイヤーが使用する処理を行うときに、「きずぐすり」に該当するアイテムデーベースを検索し、効果値20を取得→プレイヤーのHPを20回復する、という流れになります。
実際にHPの処理を作成する場合は、このデータベースの内容をAIに伝えた上でスクリプトを生成してもらうと、より精度の高いコードを返してくれます。
まとめ
ScriptableObjectを使うと、カンタンにデータベースを作ることが出来ます!ぜひ沢山の要素をゲームに登場させて、ゲームを充実させましょう!
それでは素敵なゲーム制作ライフを!
コメント