🐡

ScriptableObjectで快適データ管理!多数キャラ&スキルを一括管理するテクニック

2024/12/18に公開

ScriptableObjectで快適データ管理!多数キャラ&スキルを一括管理するテクニック

Unityで多数のキャラクターやスキルを扱うとき、データ管理が複雑になりがちです。そこでぜひ活用したいのがScriptableObject。本記事では、ScriptableObjectを使ってキャラクターやスキルをわかりやすく管理する方法をご紹介します。

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

Unity初心者でも簡単!敵ステータスのデータベースを構築!? 「ScriptableObject」で管理する方法とは
https://zenn.dev/ryuryu_game/articles/fb4dacb67cd3b9

どうしてScriptableObjectが便利なのか

スクリプトだけでは管理しきれないデータを直感的に扱える

普通のC#クラスでデータを扱うと、コードを修正するたびに再コンパイルが必要です。対してScriptableObjectは、Projectビューに「独立したアセット」として存在するため、Inspectorで値を変更するだけでOK。開発者やデザイナーが**「直接数値を編集」**できるので、反復調整がはるかに楽になります。

  • : 攻撃力やレベル上限などをInspector上でいじるだけで反映
  • チーム開発: コードに触れずにデザイナーがバランス調整可能

プログラム内で参照が簡単

public MasterData masterData;のような変数を用意して、ProjectビューでMasterData(ScriptableObject)をアサインすれば、スクリプトからいつでもキャラ情報を参照できます。配列やリストを扱うよりも視覚的に管理しやすく、拡張が容易です。

基本的なデータ構造の例

CharacterData ScriptableObject

1体のキャラクター用データをまとめるScriptableObjectです。キャラクター名や最大レベル、使用するスキルデータへの参照などを持たせるのが基本的な設計。たとえば次のようなコードを用意します:

[CreateAssetMenu(fileName="CharacterData", menuName="CharacterData")]
public class CharacterData : ScriptableObject {
    public string characterName;       // キャラクター名
    public int maxLevel;               // 最大レベル
    public Sprite characterSprite;     // キャラクターの画像
    public SkillData skill;            // キャラクター固有のスキル参照
}

Inspector上でcharacterNameなどを埋めるだけで、新たなキャラクター設定アセットを作成できます。たとえば「Warrior」「Mage」「Pikachu」など様々なキャラが増えても個別のScriptableObjectファイルとしてProjectビューに並ぶので、一覧しやすいです。

SkillData ScriptableObject

キャラクターが使うスキルを、別のScriptableObjectとして切り出します。ここではスキル名やアニメーション、エフェクトPrefabなどを持たせる例を示します。

[CreateAssetMenu(fileName="SkillData", menuName="SkillData")]
public class SkillData : ScriptableObject {
    public string skillName;             // スキル名
    public AnimationClip skillAnimation; // スキル発動時アニメ
    public GameObject skillEffectPrefab; // スキル発動時のエフェクト
}

たとえば「FireBall」「ThunderShock」「Heal」といったスキルを個々のScriptableObjectとして保存し、キャラごとのskill参照が紐づく形を取ります。こうすると、デザイナーがスキル名やアニメーションをGUI上で編集でき、プログラマーはSkillDataを通して実行時の処理を行うだけで済むようになります。

MasterData ScriptableObject

多くのキャラクターを扱うときは、全キャラ情報をひとつのScriptableObject(MasterData)にリストとしてまとめると便利です。

[CreateAssetMenu(fileName="MasterData", menuName="MasterData")]
public class MasterData : ScriptableObject {
    public List<CharacterData> characters;
}

ProjectビューでMasterDataを1つ作り、charactersリストに複数のCharacterDataをドラッグ&ドロップで登録すれば、ワンストップで全キャラを閲覧できるようになります。

ScriptableObjectを使う開発フロー

1. スキルデータを作る

1つ1つのスキル(SkillData)を作成し、Inspectorでスキル名やエフェクトのPrefabを設定。

  • 例: 「FireBall」「IceSpike」「Heal」など

2. キャラクターデータを作る

キャラクターのCharacterDataを作り、キャラ名、スプライト、そして使うSkillDataをInspectorで割り当て。

  • 例: 「Mage」にはIceSpikeスキルを、「Warrior」にはPowerSlashスキルを参照

3. MasterDataをまとめる

最後にMasterDataを作り、charactersリストへ上記で作成したキャラを一括登録。こうするとスクリプト内でmasterData.charactersと書くだけで全キャラ情報を扱えるようになります。

このようにScriptableObject同士で参照し合う設計をすることで、コードをいちいち書き換えなくてもInspectorで設定を変えられる点が大きな強みです。

キャラクター情報を取得するサンプルコード

シンプルな検索例

public class CharacterDatabase : MonoBehaviour {
    public MasterData masterData; // Inspectorでアサイン

    public CharacterData GetCharacterByName(string name) {
        foreach (var character in masterData.characters) {
            if (character.characterName == name) {
                return character;
            }
        }
        return null; // 見つからなかった場合nullを返す
    }
}

ゲーム内で「Pikachu」という名前のキャラ情報を得たいときは、以下のように呼び出します:

CharacterData pikachuData = characterDatabase.GetCharacterByName("Pikachu");
if (pikachuData != null)
{
    Debug.Log("Max Level: " + pikachuData.maxLevel);
    // ほかの情報を参照可能
}

こうしてMasterDataの中から必要なキャラを取り出し、スキルやスプライトなど関連する情報を一気に使用できます。

どうしてScriptableObjectでラクになるの?

  • Inspectorから直感的に編集
    複数のキャラデータがHierarchy上にあると雑多になりがちですが、ScriptableObjectはProjectビューにアセットとして存在。テキストや数値を自由に編集でき、コード側をいじらなくてもOKなので反復調整が早いです。

  • 拡張性が高い
    新しいステータス項目を追加したいときも、CharacterDataクラスにプロパティを生やし、Inspectorを見ながら必要データを登録していくだけ。将来的に「必殺技2つめ」などが増えても柔軟に対応しやすい。

  • チーム開発に向いている
    ScriptableObjectファイルをGitや他のバージョン管理に乗せても、テキスト形式で差分を管理しやすく、デザイナー・プログラマー間で役割分担しやすい。

  • メモリ効率面でもメリット
    データをScriptableObjectに持たせると、同じデータを複数オブジェクトが共有でき、重複データを減らせるケースもあります。

まとめ

大量のキャラクターやスキルを一括管理したい場合、ScriptableObjectを活用するのがとても有効です。

  • CharacterDataSkillDataMasterDataのようにデータ単位でScriptableObjectを細分化
  • Inspectorで直感的に編集&参照できる
  • コードの肥大化を防ぎ、チームメンバー(プログラマー以外)も調整しやすい

これらのメリットを活かすと、Unityプロジェクトでの開発効率や保守性が大幅に向上します。ぜひ「スプライトやスキル」をScriptableObjectに分けて管理し、快適なデータ運用を実現してみてください。

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

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

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

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

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

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a

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

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

Discordサーバー参加はこちら

https://discord.gg/5FwuKCacNy

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

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

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

https://coconala.com/users/1772507

Discussion