🎉

アクション・RPG・脱出ゲームで使えるアイテム一覧の作り方:データベースを構築!? 「ScriptableObject」で管理する方法とは。

に公開

自己紹介

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

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

Unityの基本操作からC#スクリプトの基礎まで、やさしく学べる入門チュートリアルはこちら
https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

ScriptableObjectとは?

ScriptableObjectはUnityでデータ管理を効率化するための特殊なオブジェクトです。データベースのようにデータを管理・格納するための仕組みとして利用されます。そのため、ScriptableObjectを活用してデータベース的な役割を果たすことが可能です。

主なメリット

  • データとロジックの分離
    データをコードから切り離し、管理しやすくなります。
  • 再利用性の向上
    同じデータを複数のオブジェクト間で使い回すことで冗長性を削減できます。
  • パフォーマンスの向上
    メモリ効率が良く、ゲームの負荷を軽減します。

ScriptableObjectのテンプレート

以下は基本的なテンプレートです。これを元に様々なデータを管理できます。

変数の補足
• fileName: 作成されるアセットのデフォルト名
• menuName: エディタで右クリックメニューに表示される名前

using UnityEngine;

[CreateAssetMenu(fileName = "ファイル名", menuName = "メニュー名", order = 1)]
public class NewData : ScriptableObject
{
    // ここに変数を定義します
}

データベースの構築

ここでは、ScriptableObjectを使って、敵キャラクターのステータスとスキルを管理するデータベースを作成します。

まずは、敵のステータスを管理するデータベースを作成します。

敵キャラクターのステータス (EnemyStats)
・敵の名前
・体力
・攻撃力
・速度
・画像
・スキルの配列 (スキルのデータベース)

敵のスキル (Skill)
・スキルの名前
・スキルの詳細説明
・ダメージ量
・クールダウン

実際のコードで理解する

敵キャラクターのステータス (EnemyStats)

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;     // 敵が持つスキルの配列
}

敵のスキル (Skill)

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;     // スキルのクールダウン時間
}

データの作成方法

1.Assetsフォルダで右クリック

エディタのAssetsフォルダ内で右クリックします。

2.Create > ScriptableObjects > NewDataを選択

右クリックメニューから「Create > ScriptableObjects > NewData」を選びます。

3.アセットが生成される

Assetsフォルダに「NewData」という名前のアセットが作成されます。このアセットを選択すると、インスペクタでデータを設定できるようになります。

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を活用することで、複雑なゲームシステムも効率的に管理可能です。
ゲーム開発におけるデータ管理の改善にぜひお役立てください!

この記事を読んでもっと実践したいと感じたあなたへ

Unity開発を効率よく進めるためには、実践的なスキルと仲間との交流が欠かせません。
そんな方におすすめのステップが、下記の3つです。

1. 有料教材「どこでもUnity教室」でゲーム制作を短期マスター

  • 5日でシンプルなFPS完成:初心者向けに要点を押さえたカリキュラム
  • C#や最新のInputSystem、FPS実装まで網羅:つまずきやすいポイントを先回りで解説
  • 購入特典:Discord招待+サンプルプロジェクトDLで、疑問や実装例を即確認

Unity初心者でも最短5日で3D FPSが完成!今すぐ始める入門チュートリアルはこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP

  • 初心者~中級者までOK:学習進度に合わせて質問や情報共有
  • 質問サポートが充実:わからないことを仲間や講師に即相談
  • 学習仲間と切磋琢磨:一緒に学ぶから続けやすい

Discordサーバー参加はこちら

https://discord.gg/5FwuKCacNy

3. 実績豊富な“ゲーム開発所RYURYU”があなたをトータルサポート

  • コナラ総販売200件超:さまざまなUnity開発の依頼を対応
  • VR/AR/AIなど最新技術にも精通:幅広いノウハウを活かして開発支援
  • ゲームクリエイター甲子園や東京ゲームショウなど出展実績多数

ご相談・お問い合わせはこちら

https://coconala.com/users/1772507

Discussion