Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when working in a Unity project that uses Entities (DOTS) or when a task needs thousands of simulated objects - when ECS is worth it, components/bakers/ISystem with IJobEntity and Burst, entity command buffers for structural changes, native memory rules, and testing systems in a test World.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
Unity's Entities package stores data in tightly packed chunks and runs Burst-compiled jobs over it in parallel. It scales to tens of thousands of entities where GameObjects choke — and it makes simple gameplay code more verbose. Use it where the scale needs it, follow the project's existing split between GameObjects and entities, and never introduce DOTS into a GameObject project on your own initiative.
Core principle: Components are plain data, systems are Burst-compiled ISystems scheduling jobs, and structural changes go through an entity command buffer.
| Situation | Use |
|---|---|
| Thousands of similar units, projectiles, boids, crowd agents | ECS (or Jobs + Burst over native arrays first) |
| Heavy simulation with little per-object uniqueness | ECS |
| UI, menus, a handful of characters, bespoke scripted moments | GameObjects |
| Mixed game | Hybrid: entities for the swarm, GameObjects for the player, UI and cameras |
// Data: unmanaged structs
public struct Speed : IComponentData { public float Value; }
public struct Target : IComponentData { public float3 Position; }
// Authoring + baking: designers edit a MonoBehaviour in a subscene; the baker turns it into components
public sealed class SpeedAuthoring : MonoBehaviour {
public float value = 5f;
sealed class Baker : Baker<SpeedAuthoring> {
public override void Bake(SpeedAuthoring a) {
var e = GetEntity(TransformUsageFlags.Dynamic);
AddComponent(e, new Speed { Value = a.value });
}
}
}
// Behaviour: a Burst-compiled ISystem scheduling a parallel IJobEntity
[BurstCompile]
public partial struct SeekSystem : ISystem {
[BurstCompile] public void OnCreate(ref SystemState state) => state.RequireForUpdate<Speed>();
[BurstCompile] public void OnUpdate(ref SystemState state) {
new SeekJob { Dt = SystemAPI.Time.DeltaTime }.ScheduleParallel();
}
}
[BurstCompile]
partial struct SeekJob : IJobEntity {
public float Dt;
void Execute(ref LocalTransform transform, in Speed speed, in Target target) {
var to = target.Position - transform.Position;
var dist = math.length(to);
if (dist > 0.01f) transform.Position += to / dist * math.min(speed.Value * Dt, dist);
}
}
ISystem with [BurstCompile] over SystemBase for new systems; SystemBase only where managed objects are unavoidable.List<T>) in components or jobs that should be Burst-compiled; use FixedString, NativeArray, DynamicBuffer.in for read-only, ref for written components in Execute — it drives the dependency system and parallelism.var ecb = SystemAPI.GetSingleton<EndSimulationEntityCommandBufferSystem.Singleton>()
.CreateCommandBuffer(state.WorldUnmanaged).AsParallelWriter();
new ExpireJob { Ecb = ecb, Now = (float)SystemAPI.Time.ElapsedTime }.ScheduleParallel();
// in the job: void Execute([ChunkIndexInQuery] int key, Entity e, in Lifetime l) { if (Now > l.EndsAt) Ecb.DestroyEntity(key, e); }
IEnableableComponent) instead of add/remove, which moves the entity between chunks.NativeArray/NativeList is disposed — Allocator.Temp inside a frame, TempJob within four frames, Persistent in OnDestroy. Leak warnings are bugs.IAspect) are deprecated in recent Entities releases — use explicit component parameters and queries instead of adding new ones.Update system.public class SeekSystemTests {
World _world; EntityManager _em;
[SetUp] public void SetUp() { _world = new World("Test"); _em = _world.EntityManager; }
[TearDown] public void TearDown() => _world.Dispose();
[Test] public void Update_EntityWithSpeed_MovesTowardTarget() {
var e = _em.CreateEntity(typeof(LocalTransform), typeof(Speed), typeof(Target));
_em.SetComponentData(e, LocalTransform.FromPosition(float3.zero));
_em.SetComponentData(e, new Speed { Value = 2f });
_em.SetComponentData(e, new Target { Position = new float3(10, 0, 0) });
var system = _world.CreateSystem<SeekSystem>();
_world.SetTime(new TimeData(elapsedTime: 0.5, deltaTime: 0.5f));
system.Update(_world.Unmanaged);
_em.CompleteAllTrackedJobs();
Assert.That(_em.GetComponentData<LocalTransform>(e).Position.x, Is.EqualTo(1f).Within(1e-4));
}
}
World per test, disposed in teardown; create only the systems under test.Ghost components replicate state; prediction runs in the predicted simulation group; input travels as IInputComponentData. Server-authority rules from game-networking still apply — validate input on the server world.
EntityManager calls in a hot loop on the main thread.RequireForUpdate, so a system runs (and throws) before its data exists.SystemBase + Entities.ForEach in new code (legacy API).Dispose.아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when the diff adds or changes an endpoint, resolver, RPC, job or query that takes an object id, a role check, a request binding or a tenant filter - BOLA/IDOR, function-level authorization, mass assignment and tenant scoping
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use on every UI change - semantic HTML, labels for controls, keyboard-navigable dialogs/menus, visible focus, and never color as the only signal
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when a task changes any screen, form, dialog, menu or control - Lighthouse/axe scan of the changed screens, a keyboard walk, and the thresholds that fail a task
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
How to work a task returned with review, QA or UAT findings. Use when a task is in need_revision or PR review comments are in your context.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when the repository keeps its alerting in code, or a person asks for alerts outside TaskTrooper - PrometheusRule YAML, a Cloud Monitoring alert policy in Terraform, a Datadog monitor, each routed to TaskTrooper's alert ingest URL so it opens an incident here
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.