ECS – System concepts

ECS – System concepts

https://docs.unity3d.com/Packages/com.unity.entities@1.3/manual/concepts-systems.html

System concepts

System의 역할

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

System의 유형

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

System 실행 순서 (System Groups)

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

SystemBase 예제 (관리형 시스템)

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 예제 (비관리형 시스템)

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 활용)

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를 사용하면 이를 확인할 수 있습니다.

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

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤