[BurstCompile]
public partial struct MySystem : ISystem
{
[BurstCompile]
public void OnCreate(ref SystemState state)
{
}
[BurstCompile]
public void OnDestory(ref SystemState state)
{
}
[BurstCompile]
public void OnUpdate(ref SystemState state)
{
}
}
[UpdateBefore(typeof(FooSystem))]
[UpdateAfter(typeof(BarSystem))]
public class MySystem : ISystem
{
}
public class MySystemGroup : ComponentSystemGroup
{
protected override void OnUpdate()
{
base.OnUpdate(); // update every child in sorted order
}
}
위의 System Editor Window는 정렬된 업데이트 순서의 Hierachy 를 보여줍니다. 3개의 기본 시스템 그룹은 위 사진에서 주황 박스로 테두리 친 그룹입니다. 이 세 그룹은 유니티 메인 루프 자체에서 업데이트됩니다. Initalization 시스템 그룹은 셋업 작업에 사용되고, Simulation 시스템 그룹은 코어 게임 로직에 사용되며, Presentation 시스템 그룹은 렌더링에 사용됩니다.
그룹의 OnUpdate를 오버라이드하면, 원하는 자식만 실행시키거나, 한 프레임에 여러 번 실행시킬 수 있습니다. Fixed Step Simulation 시스템 그룹을 예로들면 MonoBehaviour의 FixedUpdate와 같이 고정된 프레임 레이트로 업데이트합니다.
GetEntityQuery()
GetComponentTypeHandles<T.>()
System 안에서는 EntityManager가 아닌 SystemState를 통해 쿼리와 컴포넌트를 다룰 것
컴포넌트 타입을 시스템을 통해서 Register 하기 때문
예를들면 SystemState의 GetEntityQuery를 통해 Foo, Bar를 소유하고 있는 Entity를 Query할 때, Foo, Bar 컴포넌트를 시스템을 통해 Register 함
EntityManager를 통해 위와 동일한 것을 실행할 경우 Register되지 않음
접근하는 시스템에서 Register를 하는 것이 중요한 이유는 depedency 프로퍼티 때문
System에서 필요한 Job Dependency를 명확히하는 것에 목적이 있음
모든 Job은 직간접적으로 Dependency가 업데이트 되어야함
시스템 업데이트가 반환되기 전에, Dependency가 할당될 수 있어야함
위의 사진으로 예를들면, 업데이트 메소드에서는 Dependency 프로퍼티를 할당받은 핸들에 의존하는 두 개의 잡을 스케줄합니다. 그리고 업데이트가 반환되기 전에 이 두 핸들을 하나로 결합하고 이를 Dependency 프로퍼티에 할당됩니다.
이 코드에서는 dependency에 마지막의 handle만 포함되었지만 두 코드가 동일하게 작동합니다. 작동하는 이유는 첫 번째 잡 핸들이 두 번째 잡 핸들에 포함되었기에, 두 번째 잡 핸들만을 디펜던시에 포함시켜도 첫번째 잡 핸들이 간접적으로 포함되었기 때문입니다.