Unity DOTS について
Unity 6以降でECS、Job System、Burstを使うためのDOTS開発スキルです。モダンなAPIを中心に、authoringからbaking、system、query、jobまでを案内し、DOTS導入の判断材料も示します。
主な機能
- 01authoringからbakingまでのワークフロー
- 02モダンな`ISystem`と`SystemAPI.Query`のパターン
- 03`IJobEntity`によるエンティティの並列処理
- 04Burstとコンポーネントの利用指針
- 05DOTS導入の判断ガイド
- 06トラブルシューティングとメモリ管理
活用シーン
- 01Unity 6以降でのECSワークフロー構築
- 02GameObjectのデータをbakingでエンティティ化
- 03エンティティの並列処理の実装
- 04baking、query、Burstの問題調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ juliankerignard/ unity-skills --skill unity-dotsインストール後、Claude Code で/unity-dotsを入力して読み込まれたか確認します。
同梱ファイルreferences/ecs-patterns.mdreferences/ecs-advanced.md
詳細
Unity DOTS — Data-Oriented Technology Stack
このスキルでできること
Unity 6 以降での DOTS(Entity Component System + Job System + Burst Compiler)の実装を案内します。高パフォーマンスが求められるシナリオ(数千のエンティティ)向けに、authoring -> baking -> system -> query -> job の完全なワークフローを網羅します。最新の API(ISystem、SystemAPI.Query、IJobEntity)に焦点を当てています。非推奨の API(Entities.ForEach、デフォルトの選択肢としての SystemBase)は推奨しません。
前提条件
必須パッケージ(Package Manager または manifest.json 経由):
com.unity.entities(Unity 6 用に >= 1.3.x)com.unity.burst(>= 1.8.x)com.unity.collections(>= 2.4.x)
オプション:
com.unity.entities.graphics— DOTS のレンダリング(Entities Graphics / Hybrid Renderer)com.unity.physics— DOTS の物理演算(エンティティ向けに従来の PhysX を置き換えます)com.unity.transforms— entities に含まれ、LocalTransform を管理します
必要な知識:authoring -> baking への移行を理解するための、MonoBehaviour の基礎知識。
クイックスタート
- Package Manager で DOTS パッケージをインストールします
- authoring MonoBehaviour と IComponentData(struct)を作成します
- authoring -> entity の変換用に Baker を作成します
- GameObject を SubScene に配置します(baking に必須)
- SystemAPI.Query を使った ISystem を作成し、ロジックを実装します
- system と job に
[BurstCompile]を追加します
判断基準
DOTS が常に必要とは限りません。採用前に評価してください:
Mon projet a-t-il besoin de DOTS ?
|
+-- Prototype / petit jeu (< 100 entites dynamiques) ?
| --> NON. MonoBehaviour est plus simple et suffisant
|
+-- Jeu moyen (100-1000 entites) ?
| --> PROBABLEMENT NON. Optimiser les MonoBehaviours d'abord
|
+-- Simulation massive (1000+ entites similaires) ?
| --> OUI. DOTS brille ici (foules, particules custom, voxels, RTS)
|
+-- Besoin de calcul CPU intensif (pathfinding, IA, physique custom) ?
| --> Job System + Burst SANS ECS. On peut utiliser les jobs seuls
|
+-- Migration d'un projet existant ?
| --> Hybride : garder MonoBehaviours + ajouter DOTS pour les systemes critiques
|
+-- Nouveau projet from scratch avec beaucoup d'entites ?
--> Full DOTS avec authoring/baking
ECS ロードマップ(Unity 6.4 以降)
- Unity 6.4:
com.unity.entitiesパッケージはコアパッケージへ移行します(エディターに統合され、手動でのインストールが不要になります) - Unity 6.5(予定):
Entity型の構造に変更があります(64-bit ID に移行)。影響:カスタムシリアル化やNativeContainer内でのEntityの保存に影響する可能性があります。生のEntityを永続化せず、代わりに業務用の識別子を使用してください。
これらの変更によって Unity 6.0~6.3 の既存コードが壊れることはありませんが、長期的なアーキテクチャの判断において重要です。
ステップバイステップガイド
Step 1:Component(データのみ)
// IComponentData = struct pure, pas de logique, juste des donnees
public struct MoveSpeed : IComponentData
{
public float Value;
}
public struct RotationSpeed : IComponentData
{
public float RadiansPerSecond;
}
ルール:managed 型(string、class、List)や複雑なメソッドは使用しません。1 つの component は、エンティティの 1 つの側面を表します。
Step 2:Authoring + Baker
public class MoveSpeedAuthoring : MonoBehaviour
{
public float Speed = 5f;
}
public class MoveSpeedBaker : Baker<MoveSpeedAuthoring>
{
public override void Bake(MoveSpeedAuthoring authoring)
{
var entity = GetEntity(TransformUsageFlags.Dynamic);
AddComponent(entity, new MoveSpeed { Value = authoring.Speed });
}
}
authoring MonoBehaviour は、SubScene 内の GameObject にアタッチします。Baker は bake 時にデータを entity に変換します。
Step 3:System(ロジック)
[BurstCompile]
public partial struct MoveForwardSystem : ISystem
{
[BurstCompile]
public void OnUpdate(ref SystemState state)
{
float dt = SystemAPI.Time.DeltaTime;
foreach (var (transform, speed) in
SystemAPI.Query<RefRW<LocalTransform>, RefRO<MoveSpeed>>())
{
transform.ValueRW.Position +=
transform.ValueRO.Forward() * speed.ValueRO.Value * dt;
}
}
}
Step 4:並列 Job(オプション、さらなるパフォーマンス向上に)
[BurstCompile]
public partial struct MoveJob : IJobEntity
{
public float DeltaTime;
void Execute(ref LocalTransform transform, in MoveSpeed speed)
{
transform.Position += transform.Forward() * speed.Value * DeltaTime;
}
}
// Dans le system :
[BurstCompile]
public void OnUpdate(ref SystemState state)
{
new MoveJob { DeltaTime = SystemAPI.Time.DeltaTime }
.ScheduleParallel();
}
厳守するルール
必ず:
SystemBase(class)ではなくISystem(struct)を使用します — Burst と互換性があります- ISystem と job に
[BurstCompile]を追加します SystemAPI.Queryを使用します(非推奨のEntities.ForEachは使いません)- component へのアクセスには
RefRO<T>(読み取り)/RefRW<T>(書き込み)を使用します - authoring GameObject を SubScene に配置します
- NativeContainer を破棄します(Allocator.Temp を除く)
- エンティティの並列処理には
IJobEntityを優先します - 動的な追加/削除より enableable component(
IEnableableComponent)を優先します
決して行わないこと:
- IComponentData 内での managed 型(string、class、List、arrays)の使用
- job からのメインスレッドへのアクセス(Debug.Log や従来の Unity API の使用など)
- Dispose しないまま NativeContainer を使用すること(メモリーリーク)
Entities.ForEachの使用(Unity 6 以降では非推奨)- デフォルトの選択肢として
SystemBaseを使用すること(managed 型が必要な場合を除く)
トラブルシューティング
| 問題 | 解決方法 |
|---|---|
| "Burst compilation failed" | Burst コードで管理型を使用しています。string の代わりに FixedString、List の代わりに NativeArray を使用してください |
| Entity が作成されない | Baker がないか、authoring が SubScene にありません |
| System が実行されない | World を確認してください。必要に応じて [UpdateInGroup(typeof(...))] を追加してください |
| パフォーマンスが向上しない | [BurstCompile] が付いていることを確認してください。Burst Inspector でプロファイリングしてください |
| NativeArray のリーク警告 | 必ず OnDestroy で Dispose() を呼び出すか、Allocator.Temp を使用してください |
| Query が 0 件の結果を返す | Baker で component が正しく追加されていることを確認してください |
| Job 内で "InvalidOperationException" が発生する | 同時アクセスが原因です。[NativeDisableParallelForRestriction] を使用するか、設計を見直してください |
| SubScene が bake されない | SubScene を再インポートする(右クリック > Reimport)か、エディターを再起動してください |
関連スキル
/perf-audit— ユースケースに DOTS が適しているかを評価します/unity-code-gen— authoring/baker のボイラープレートを生成します/unity-animation— DOTS アニメーション(Entities Graphics animation)
参考資料
- 基本的なパターン(authoring、baking、queries、jobs)については
references/ecs-patterns.mdを参照してください - 高度なパターン(Burst、NativeContainers、ハイブリッド、Aspects、DynamicBuffer)については
references/ecs-advanced.mdを参照してください - Unity DOTS の公式ドキュメント
- Unity DOTS のサンプル