コンテンツにスキップ

Type Object

オブジェクトのタイプをクラスではなくデータとしてモデル化し、データ追加で拡張を行うパターンです。

  • 武器やモンスタータイプをコード修正なしで増やしたいとき
  • バランス値を企画データとして管理したいとき
  • Type Data: ScriptableObject / テーブル
  • Runtime Instance: タイプ参照オブジェクト
  • Registry: タイプ検索

以下のコードは、上で説明した状況を Unity プロジェクトの文脈で単純化した例です。

using UnityEngine;
[CreateAssetMenu(menuName = "Game/Weapon Type Data")]
public sealed class WeaponTypeData : ScriptableObject
{
public string weaponId;
public int attackPower;
public float cooldownSeconds;
}
public sealed class WeaponRuntime
{
private readonly WeaponTypeData weaponTypeData;
public WeaponRuntime(WeaponTypeData weaponTypeData)
{
this.weaponTypeData = weaponTypeData;
}
public int AttackPower => weaponTypeData.attackPower;
}
  • ScriptableObject などのデータ追加だけで新しいタイプを増やせます。
  • 企画やバランス調整をコード配布から切り離せるため、反復速度が上がります。
  • データスキーマが頻繁に変わると、マイグレーションや互換性管理コストが大きくなります。
  • ランタイム参照漏れは、エディタでは静かでも実ビルドで壊れることがあります。

インスタンスがタイプデータ(ScriptableObject)を参照して振る舞いを決める流れです。

Type Object の流れ