ECS - System concepts

System concepts

System의 역할

  • System은 컴포넌트 데이터를 읽고, 수정하여 프레임마다 업데이트하는 역할을 수행
  • OnUpdate()가 매 프레임 호출되며, Entity 데이터를 갱신함
  • SystemBase(관리형 시스템)와 ISystem(비관리형 시스템) 두 가지 유형이 있음

System의 유형

시스템 유형 설명
SystemBase C# 클래스 기반, 관리형 시스템 (GC 영향 있음)
ISystem 구조체 기반, 비관리형 시스템 (성능 최적화)
EntityCommandBufferSystem Entity 생성/삭제 등의 구조적 변경을 최적화하는 시스템
ComponentSystemGroup 여러 시스템을 그룹화하여 실행 순서 제어

System 실행 순서 (System Groups)

  • ECS는 시스템을 Auto Bootstrap하며, 기본적으로 3가지 그룹으로 실행됨. (Auto Bootstrap - 시스템을 자동으로 생성하고 실행하는 과정)
시스템 그룹 설명
InitializationSystemGroup 초기화 관련 시스템 실행 (프레임 시작 시)
SimulationSystemGroup 대부분의 게임 로직이 실행되는 기본 그룹
PresentationSystemGroup 렌더링과 관련된 시스템 실행 (프레임 마지막)
  • 특정 그룹에서 실행되도록 하려면 [UpdateInGroup(typeof(그룹))] 속성을 사용.

SystemBase 예제 (관리형 시스템)

csharp
using Unity.Burst;
using Unity.Entities;
using Unity.Transforms;
using Unity.Mathematics;
using UnityEngine;

// [UpdateInGroup(typeof(SimulationSystemGroup))]  // 특정 그룹에서 실행 가능
public partial class MoveSystem : SystemBase
{
    protected override void OnUpdate()
    {
        float deltaTime = SystemAPI.Time.DeltaTime; // 현재 프레임의 Delta Time

        Entities.ForEach((ref LocalTransform transform) =>
        {
            transform.Position += new float3(1, 0, 0) * deltaTime; // X축 이동
        }).ScheduleParallel();
    }
}

ISystem 예제 (비관리형 시스템)

csharp
using Unity.Burst;
using Unity.Entities;
using Unity.Transforms;
using Unity.Mathematics;

// 성능 최적화를 위해 [BurstCompile] 적용
[BurstCompile]
public partial struct MoveSystem_ISystem : ISystem
{
    public void OnCreate(ref SystemState state) { }  // 초기화

    public void OnDestroy(ref SystemState state) { } // 시스템 종료 시 실행

    public void OnUpdate(ref SystemState state)
    {
        float deltaTime = SystemAPI.Time.DeltaTime;

        foreach (var transform in SystemAPI.Query<RefRW<LocalTransform>>())
        {
            transform.ValueRW.Position += new float3(1, 0, 0) * deltaTime;
        }
    }
}

System 실행 순서 제어 (System Group 활용)

csharp
using Unity.Entities;

[UpdateInGroup(typeof(InitializationSystemGroup))] // 초기화 단계에서 실행
public partial class InitSystem : SystemBase
{
    protected override void OnUpdate()
    {
        UnityEngine.Debug.Log("초기화 시스템 실행됨!");
    }
}

Inspecting systems

시스템 창을 사용하여 각 세계의 시스템 업데이트 순서를 검사하고 시스템 그룹의 전체 계층을 볼 수 있습니다.

자세한 내용은 Systems window reference를 참조하세요.

에디터에서 Systems

편집기에서 다음 아이콘은 다양한 유형의 시스템을 나타냅니다.

Entities windows와 Inspectors를 사용하면 이를 확인할 수 있습니다.

Icon Represents
A system group
A system
OrderFirst 인수를 사용하여 시스템 그룹의 시작 시 실행되도록 설정된 Entity 명령 버퍼 시스템
OrderLast 인수를 사용하여 시스템 그룹의 끝에서 실행되도록 설정된 엔티티 명령 버퍼 시스템입니다.