導入
ゲームが大きくなると、これまで学んだ設計の知識(SOLID・パターン)がUnityでもそのままC#の武器になります。特にUnity特有のScriptableObjectは「データをアセットとして分離する」ための強力な仕組みです。
図解
flowchart TB
SO["ScriptableObject<br/>EnemyData(HP・攻撃力・名前)<br/>=データをアセット化"]
SO --> E1["スライム.asset<br/>HP10 / 攻撃2"]
SO --> E2["ドラゴン.asset<br/>HP500 / 攻撃80"]
E1 --> USE["Enemyスクリプトが参照して動く"]
E2 --> USE
style SO fill:#e8f5e9
サンプル(Unity C# ― 読み物)
using UnityEngine;
// ScriptableObject: ロジックを持たない「データの入れ物」をアセットとして作れる
// ( record 的な役割を、Unityのアセットとして実現)
[CreateAssetMenu(menuName = "Game/EnemyData")]
public class EnemyData : ScriptableObject
{
public string enemyName;
public int maxHp;
public int attack;
}
// データ(EnemyData)とロジック(Enemy)を分離する=単一責任の原則
public class Enemy : MonoBehaviour
{
public EnemyData data; // Inspectorでスライムやドラゴンの.assetを差し込む
void Start()
{
Debug.Log($"{data.enemyName} 出現(HP {data.maxHp})");
}
}
- ScriptableObjectはデータをアセット化する仕組み(値の設定をコードから分離)
- データ(
EnemyData)とロジック(Enemy)を分けるのは単一責任の原則そのもの - イベント・Strategy・DIもUnityでそのまま有効
- 「Unityだから特別」ではなく、これまでのC#設計知識が土台になる
Unityで試す
EnemyDataスクリプトを作り、メニューから「スライム」「ドラゴン」の.assetを2つ作成するEnemyスクリプトのdataにそれぞれを割り当て、出現ログが変わることを確認- 「1つのデータを複数の敵が共有する」設計の利点(バランス調整が1か所で済む)を体感する
まとめ
- ScriptableObjectはデータをアセットとして分離する仕組み
- データとロジックの分離=SOLID(単一責任)の実践
- これまでのC#設計知識(SOLID・パターン・DI)がUnityでも武器になる