リンドくん
たなべ先生、Unityでゲームを作ってるんですけど、敵キャラとかアイテムのパラメータをどう管理すればいいか迷ってます...
たなべ
そういう時はScriptableObjectを使うと便利なんだ。
データを外部に切り出して管理できるから、コードを変更しなくてもゲームバランスを調整できるようになるよ。
リンドくん
ScriptableObject...?聞いたことはあるんですけど、難しそうで...
たなべ
心配しないで!基本を理解すれば意外と簡単なんだ。
今日はデータ駆動設計という考え方と一緒に、ScriptableObjectの使い方をしっかり教えるね。
ゲーム開発を始めたばかりの方にとって、キャラクターやアイテムのデータ管理は意外と悩ましい問題ですよね。
「敵の体力を変更するたびにコードを書き換えるのは面倒...」「同じようなコードをいくつも書いてしまっている...」そんな経験はありませんか?
UnityにはScriptableObjectという強力な機能があり、これを使うことでデータ駆動設計(Data-Driven Design)という効率的な開発手法を実現できるのです。
この記事では、Unity初心者の方でも理解できるように、ScriptableObjectの基本概念から実践的な使い方まで、段階的に解説していきます。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
リンドくん
先生、そもそも「データ駆動設計」って何ですか?
たなべ
簡単に言うと、プログラムのロジック(処理)とデータ(設定値)を分離する考え方なんだ。
これができると、プログラマじゃない人でもゲームバランスを調整できるようになるんだよ。
データ駆動設計とは、プログラムの動作を決定する値(データ)を、プログラムのロジック(処理コード)から分離して管理する設計手法です。
従来の方法では、以下のようにコード内に直接値を書き込んでいたのではないでしょうか?
この方法には以下のような問題があります。
データ駆動設計では、これらの値を外部データとして管理します。
Unityでこれを実現するための最適な手段がScriptableObjectなのです。
ScriptableObjectは、Unityが提供するデータコンテナの一種で、以下のような特徴があります。
例えば、RPGゲームで「スライム」「ゴブリン」「ドラゴン」といった複数の敵キャラクターがいる場合、それぞれのデータをScriptableObjectとして作成することで、以下のようなメリットが得られます。
これこそが、データ駆動設計の真価なのです。
リンドくん
実際にScriptableObjectってどうやって作るんですか?
たなべ
とってもシンプルだよ!まずはデータの型を定義するスクリプトを作って、それをもとにアセットファイルを作成するんだ。順番に見ていこう。
まず、どんなデータを管理したいかを定義します。今回は敵キャラクターのデータを例に説明しますね。
このコードのポイントを解説します。
ScriptableObjectを継承 → これがScriptableObjectの基本形です[CreateAssetMenu]アトリビュート → Unityエディタのメニューから簡単にアセットを作成できるようにします[Header]アトリビュート → Inspectorでの見やすさ向上のため、セクション分けをします上記のスクリプトを保存したら、Unityエディタで以下の手順でアセットを作成します。
SlimeData)これで、データアセットが作成されました!
作成したアセットファイルを選択すると、Inspectorにデータ入力欄が表示されます。
ここで各パラメータを設定していきましょう。
例えば「スライム」のデータは以下のように設定します。
同様に、「ゴブリン」や「ドラゴン」など、必要な敵キャラクター分のデータアセットを作成していきます。
それでは、作成したデータを実際のゲームで使用する方法を見ていきましょう。
このコードのポイントは以下です。
enemyDataフィールド → Inspectorから使用したいデータアセットを設定しますenemyData.maxHpのようにドット記法でデータにアクセスしますEnemyスクリプトを、異なるデータアセットを設定することで使い回せますこれで、コードを一切変更せずに、データアセットを変更するだけで敵の性質を変えられるようになりました!
リンドくん
便利そうですけど、何か気をつけることはありますか?
たなべ
いくつか大事なポイントがあるんだ。特に実行時の変更については注意が必要だよ。
ScriptableObjectを使う際の最も重要な注意点は、実行中に値を変更すると、その変更がエディタ上のアセットに反映されてしまうということです。
この問題を解決するには、以下のような方法があります。
方法① 値をコピーして使用する
方法② Cloneを作成する
プロジェクトが大きくなってきたら、データアセットの整理が重要になります。
おすすめのフォルダ構成は以下です。
データアセットには一貫した命名規則を使用しましょう。
~Dataで終わる(例:EnemyData)~Data.assetで終わる(例:SlimeData.asset)Enemy1ではなくSlimeDataScriptableObjectはメモリ効率に優れていますが、以下の点に注意しましょう。
リンドくん
ScriptableObject、思ってたより簡単で便利ですね!早速使ってみます!
たなべ
その意気だね!最初は小さなデータから始めて、徐々に活用範囲を広げていくといいよ。
データとロジックの分離を意識することで、プログラミングスキルも確実に向上するからね。
今回は、UnityのScriptableObjectを使ったデータ駆動設計について解説してきました。
ScriptableObjectの主なメリットを整理してみましょう。
実装時の注意点は以下です。
データ駆動設計は、単なる便利な機能ではありません。
それはプロフェッショナルなゲーム開発の基本的な考え方なのです。この考え方を身につけることで、あなたのゲーム開発スキルは確実に次のレベルへと進むでしょう。
最初は小規模なプロジェクトで試してみて、徐々に活用範囲を広げていくことをおすすめします。
敵データ、武器データ、アイテムデータなど、様々な要素をScriptableObjectで管理することで、開発効率が劇的に向上します。