前書き
Unityのゲーム開発において、データの管理やコードの整理整頓は非常に重要です。その中でも、ScriptableObjectはデータの管理に便利な機能の一つになります。本記事では、ScriptableObjectの基本的な使い方と実際にどのように使用できるかを紹介していこうと思います。
ScriptableObjectとは?
そもそもScriptableObjectとは何か?というと
Unityにおけるデータコンテナの一種となります。PrefabやSceneとは異なり、ScriptableObjectはゲームオブジェクトなどの通常のUnityコンポーネントとは異なるデータ形式として存在します。これによりゲームデータや設定を効率的に管理することができます。
特徴として以下の内容があげられます
- データの再利用: 一度作成したデータを複数の場所で使用可能。
- シリアライズ: データの保存とロードが簡単。
- 軽量: メモリに優しく、パフォーマンスに影響を与えにくい。
UnityのScriptableObjectのマニュアルは以下になります。
![](https://unity3d.com/files/images/ogimg.jpg)
ScriptableObjectのメリット
ScriptableObjectを使うことでどんなメリットがあるの?ということに対しては(個人的に)以下の観点があげられるかなと思います。
- データの再利用:
→一度作成したデータは複数のシーンやゲームオブジェクトで共有可能です。
そのため管理がしやすく同じようなデータを作るのが簡単(個人的に一番重要) - データの分離:
→ゲームロジックとデータを分離することができます。ScriptableObjectを使うときは
「アイテム」などの特定のオブジェクトを作成するときに使います。
ScriptableObjectの基本的な使い方
ScriptableObjectのメリットなどを簡単に説明したので、ここからはScriptableObjectの基本的な作成方法と使用方法などを説明していこうと思います。
# 今回は私が作っているゲームのScriptableObjectを元に説明していこうと思います。
スクリプトの作成
ScriptableObjectを作るためにはまずScriptableObjectを作るためのスクリプトが必要になってきます。
以下はいま作成しているゲームで使用しているLevelUpBonusDataのScriptableObjectのソースコードになります。TopDownEngineで使用するクラスもありますが適宜読み替えて参考にしてください。
[CreateAssetMenu(fileName = "NewLevelUpBonus", menuName = "LevelUp/Bonus")]
public class LevelUpBonusData : ScriptableObject
{
public Sprite icon; // アイコン
public string title; // タイトル
public string description; // 説明
public LevelUpBonusAction action; // ボタンが実行するアクション
public InventoryWeapon inventoryWeapon; // 取得する武器
public BaseItem baseItem; // 取得するベースアイテム
public int Quantity; // 取得するベースアイテム
public int rank; // ボーナスのランク(低いほど出やすい)
public int maxUses = 3; // ボーナスが取得可能な最大回数
[ReadOnly]
public int currentUses = 0; // 現在の取得回数
[ReadOnly]
public bool isUsed; // ボーナスが使用済みかどうか
}
例えば以下のような画面(左)を作りたい場合、ScriptableObject(右)で設定されたIconやTitleを用いてアイコンやテキストを設定しています。
![BonusAttackの詳細](https://aquaregia31.com/wp-content/uploads/2024/06/image-26.png)
インスタンスの作成
ソースコードの記述にfilenameとmenuNameを設定していたかと思います。
fileName = “NewLevelUpBonus”, menuName = “LevelUp/Bonus”
UnityEditorで上記を選択することで、ScriptableObjectが作成できます。
具体的に言うとProjectウィンドウ中で右クリックを行い、
Create->LevelUp->Bonus
# ここのLevel->Bonusはソースコード上で記載した内容になるので適宜読み替えてください。
で、先ほど作成したスクリプトからScriptableObjectを作成することができます。作成するとfileNameで設定した「NewLevelUpBonus」が作成できているはずです。
![ScriptableObjectの作り方](https://aquaregia31.com/wp-content/uploads/2024/06/image-27.png)
![](https://aquaregia31.com/wp-content/uploads/2024/06/image-28.png)
ScriptableObjectの使用例
私の場合ですと以下のようにレベルアップボーナス画面を表示するときにScriptableObjectを使用しています。「同じようなデータ形式でいろいろ作りたい」っといったときにScriptableObjectを使用するが多いかなと思います。以下の例で言うとアイコンやテキスト、ボタンアクションの内容が違うだけで他の構成は全く一緒のオブジェクトになっています。1つ1つのオブジェクトを作成するよりはScriptableObjectの設定を変えてオブジェクトを作成するほうが断然作業量的には楽になります。
![レベルアップボーナス画面](https://aquaregia31.com/wp-content/uploads/2024/06/image-29.png)
実装的な話になると以下のような形でLevelUpBonusCardオブジェクトを作っておき、先ほど作成したLevelUpBonusDataのScriptableObjectを設定してそれぞれのレベルアップボーナスを作成している形になります。
![レベルアップボーナスのテンプレートCanvas](https://aquaregia31.com/wp-content/uploads/2024/06/image-30.png)
まとめ
今回はScriptableObjectついて紹介しました。
ScriptableObjectは、Unityにおけるデータ管理を効率化し、プロジェクトの整理を助ける強力な機能になっています。データの再利用や保守性の向上に役立ち、ゲーム開発の様々なシーンで活用できるため、ぜひ、ScriptableObjectを活用してより効率的なゲーム開発をやってみてください。
コメント