見出し画像

Unityで敵のステータスのデータベースを構築!? 「ScriptableObject」で管理する方法とは。

はじめに

閲覧ありがとうございます。はじめまして、ゲーム開発所RYURYUの"りゅうや"と申します。

❏ ゲーム開発ランキング【 1位 】実績多数
❏ ココナラ総販売【 180件達成 】
❏ GC甲子園2022・東京ゲームショウ2023など出展経験あり

【ゲーム開発所RYURYUとは】
Unityを駆使した先進的な「ゲーム・VR・メタバース開発」や「オンライン教育サービス」を展開するゲームスタジオです。

❏ ScriptableObjectは、Unityでデータを管理するための非常に便利なツールです。特にゲーム開発では、プレイヤーや敵キャラクターのステータスを扱う際に効率的な管理が求められます。

この記事では、敵のステータスをScriptableObjectで管理する方法について詳しく説明します。


▼ ScriptableObjectとは? ▼

❏ ScriptableObject = データベース です!

ScriptableObjectは、Unityでデータを保持するための特殊なオブジェクトです。メモリ効率が良く、インスペクタを使ってデータを簡単に設定でき、プレハブやシーンに依存せず、再利用可能なデータを作成することができます。敵キャラクターのステータスやアイテムデータなど、複数のインスタンスで共通のデータを共有したいときに非常に便利です。


▼ ScriptableObjectのメリット ▼

データの分離: ゲームロジックとデータを分離でき、コードの管理がしやすくなります。
再利用可能: 同じデータを複数のオブジェクト間で再利用できるため、データの冗長性を減らせます。
パフォーマンス向上: ScriptableObjectはメモリ効率が高く、パフォーマンスへの影響が少ないです。

▼ ScriptableObjectの書き方 ▼

まず、基本的なScriptableObjectのテンプレートを紹介します。これを元に様々な用途に応じたScriptableObjectを作成できます。

using UnityEngine;

[CreateAssetMenu(fileName = "ファイル名", menuName = "メニュー名", order = 1)]
public class NewData : ScriptableObject
{
    //...変数を列挙...//
}

❏ fileNameは、ScriptableObjectアセットを作成した際のデフォルトのファイル名を指定します。

❏ menuNameは、Unityエディタの右クリックメニューや「Assets > Create」に表示される項目の名前や階層を指定します。これにより、エディタ内でのアセット作成が容易になります。


❏ 敵ステータスの管理とスキルの構造について

ScritableObjectについて実践的に、学ぶために、敵キャラクターのステータスとスキルのデータベースの具体例を通して、解説します!

ここからは、EnemyStatusとSkillの2つのScriptableObject(データベース)について解説します。

❏ EnemyStatus
6つの変数を持つEnemyStatusをScriptableObjectとして定義しています。

❏ Skill
さらに、敵が持つスキルもScriptableObjectとして定義されており、スキルの追加や変更を柔軟に行うことが可能です。

1|EnemyStatsクラスについて

EnemyStats というScriptableObjectでは、以下の6つの変数が設定されています。

using UnityEngine;

[CreateAssetMenu(fileName = "NewEnemyStats", menuName = "ScriptableObjects/EnemyStats", order = 1)]
public class EnemyStats : ScriptableObject
{
    public string enemyName;  // 敵の名前
    public int health;        // 体力
    public int attackPower;   // 攻撃力
    public float speed;       // 移動速度
    public Sprite enemySprite; // 敵の見た目
    public Skill[] skills;    // 敵が持つスキルの配列
}

❏ enemyName (敵の名前)
• 敵キャラクターの名前を文字列として設定します。例えば、「Goblin」や「Orc」などの敵の名前を管理するために使用します。

❏ health (体力)
• 敵のHP(ヒットポイント、体力)を管理します。この値が0になると敵は倒されます。数値が大きいほど耐久力が高い敵となります。

❏ attackPower (攻撃力)
• 敵がプレイヤーに与えるダメージを管理します。敵の攻撃が成功した際に、この数値がプレイヤーに対して与えるダメージ量として反映されます。

]❏ speed (移動速度)
• 敵が移動する際の速さを表します。値を調整することで、素早い敵やゆっくりとした動きの敵を作成できます。

❏ enemySprite (敵の見た目)
• 敵キャラクターのビジュアルを設定します。Sprite型を使用して、2Dゲームの場合に敵の画像を指定できます。

❏ skills (スキル)
• 敵が持つスキルの配列です。複数のスキルを持つことができ、各スキルはScriptableObjectとして定義されており、柔軟に変更・追加が可能です。


2|Skillクラスについて

敵のスキル自体も、Skill というScriptableObjectとして別に定義されており、以下のような要素を持っています。

using UnityEngine;

[CreateAssetMenu(fileName = "NewSkill", menuName = "ScriptableObjects/Skill", order = 2)]
public class Skill : ScriptableObject
{
    public string skillName;  // スキル名
    public string description; // スキルの説明
    public int damage;         // スキルのダメージ
    public float cooldown;     // スキルのクールダウン時間
}

❏ skillName (スキル名)
• スキルの名前です。例えば、「ファイアボール」や「サンダーストライク」など、スキルを識別するための名前を設定します。

❏ description (スキルの説明)
• スキルの詳細な説明を文字列で設定します。ゲーム内の説明やスキルの効果を記述して、プレイヤーにそのスキルの内容を伝える際に使います。

❏ damage (ダメージ)
• スキルが発動した際に与えるダメージ量です。この数値によって、敵のスキルがどれだけのダメージをプレイヤーや他の敵に与えるかが決まります。

❏ cooldown (クールダウン)
• スキルを使用した後、再度使用できるまでの待機時間を設定します。例えば、強力なスキルはクールダウン時間が長く設定されることが一般的です。

3|データベースの作り方

1. Assetsフォルダで右クリック
エディタのAssetsフォルダ内で右クリックします。
2. Create > ScriptableObjects > NewDataを選択
右クリックメニューから「Create > ScriptableObjects > NewData」を選びます。
3. アセットが生成される
Assetsフォルダに「NewData」という名前のアセットが作成されます。このアセットを選択すると、インスペクタでデータを設定できるようになります。
4.最後にデータベースにデータを記入して完了

4|データベースの使い方

1. EnemyStatsの作成
引き続き、Unityエディタの「Create > ScriptableObjects > EnemyStats」から複数の敵キャラクターを作成し、それぞれに名前、ステータス、スキルを設定します。

2. EnemyManagerの設定
シーンに新しい空のゲームオブジェクトを追加し、EnemyManagerスクリプトをアタッチします。インスペクタで、EnemyDatabaseフィールドに作成したEnemyStatsアセットをドラッグ&ドロップして割り当てます。

3. ゲームの実行
ゲームを実行すると、EnemyManagerスクリプトのStart()メソッドが実行され、enemyDatabaseに登録された敵キャラクターのデータがConsoleに表示されます。

using UnityEngine;

public class EnemyManager : MonoBehaviour
{
    public EnemyStats[] enemyDatabase;  // 敵データベース (複数の敵を格納する)

    void Start()
    {
        // データベース内の全ての敵を出力する
        foreach (EnemyStats enemy in enemyDatabase)
        {
            Debug.Log("敵の名前: " + enemy.enemyName);
            Debug.Log("体力: " + enemy.health);
            Debug.Log("攻撃力: " + enemy.attackPower);
            Debug.Log("移動速度: " + enemy.speed);

            // スキルを持っている場合、そのスキルも出力する
            if (enemy.skills != null && enemy.skills.Length > 0)
            {
                foreach (Skill skill in enemy.skills)
                {
                    Debug.Log("スキル名: " + skill.skillName);
                    Debug.Log("ダメージ: " + skill.damage);
                }
            }
            else
            {
                Debug.Log("スキルがありません。");
            }
        }
    }
}


おわりに

この記事では、Unityで`ScriptableObject`を使って敵キャラクターのステータスやスキルを効率的に管理する方法について詳しく解説しました。

`ScriptableObject`は、メモリ効率が良く、再利用可能なデータベースを作成できる便利なツールです。これを活用することで、ゲーム内のデータ管理が簡単になり、よりスムーズな開発が可能になります。

EnemyStatsSkillのようなデータを`ScriptableObject`で管理することにより、データの再利用が可能になり、キャラクターやアイテムの追加・変更を柔軟に行えます。また、複数のインスタンスでデータを共有することで、開発者やデザイナーがチームで作業を分担しやすくなります。


もし、ScriptableObjectの管理方法やUnityでのゲーム開発に関してご不明点がございましたら、ぜひ私たちのテキストサポートサービスをご利用ください。専門的な技術サポートを通じて、貴社のゲーム開発を効率的に進めるお手伝いをいたします。詳細については、お気軽にお問い合わせください!

▼ サービスはコチラからご購入いただけます! ▼


TOP記事


よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!by ゲーム開発所RYURYU