원본:
https://blog.unity.com/technology/enter-play-mode-faster-in-unity-2019-3
Baking을 통해 데이터 변환
Baking은 Editor(데이터 작성: authoring data)의 GameObject 데이터를 Entity Scenes(런타임 데이터: runtime data)에 기록된 엔티티로 변환하는 시스템을 제공합니다.
Baking은 여러 단계로 나뉘지만, 그 핵심에는 두 가지 핵심 단계가 있습니다: Baker와 Baking Systems.
점진적 Baking(Incremental Baking)은 Sub Scene이 열려 있고 작성 개체(authoring objects)를 편집할 때도 발생합니다. ECS는 사용자가 변경한 내용을 감지하고 이 변경으로 인해 다시 실행해야 하는 베이커의 최소량을 식별합니다. 이 결과는 편집 모드 및 재생 모드 중에 편집기의 엔티티 월드에 패치됩니다.
Baker 클래스
Baker 클래스를 사용해서 컴퍼넌트 작성(authoring components)과 같이 Unity 개체와 직접 상호작용 할 수 있습니다. Baker들은 또한 의존성이 암묵적으로 또는 명시적으로 파일화(혹은 점유? Captured)되는 곳이며, 베이커가 다시 실행될 경우 추가된 모든 구성 요소가 자동으로 되돌아갈 수 있습니다. Baker는 Baking 중인 기본 엔티티와 자체적으로 생성된 추가 엔터티에만 컴퍼넌트를 추가할 수 있습니다.
예:
public class MyMonoBehaviour : MonoBehaviour
{
public float value;
}
public class MyBaker : Baker<MyMonoBehaviour>
{
public override void Bake(MyMonoBehaviour authoring)
{
AddComponent(new MyComponent {Value = authoring.value} );
}
}
Baker에서 다른 데이터 소스에 접근하기
점진적 Baking(Incremental Baking)이 계속 작동하려면 Baker에서 GameObject를 변환하는 데 사용되는 데이터를 추적해야 합니다. 작성 컴퍼넌트(authoring component)의 모든 필드가 자동으로 추적되고 해당 데이터가 변경되면 베이커가 다시 실행됩니다.
다른 작성 컴퍼넌트(authoring component)의 정보는 자동으로 추적되지 않으므로 추적하려면 해당 구성요소에 종속성을 추가해야 합니다. 이렇게 하려면 게임 오브젝트에서 제공하는 기능 대신 Baker가 제공하는 기능을 사용하여 다른 구성 요소에 액세스 해야 합니다:
public struct MyComponent : IComponentData
{
public float Value;
}
public class MyMonoBehaviour : MonoBehaviour
{
public GameObject otherGO;
}
public class MyBaker : Baker<MyMonoBehaviour>
{
public override void Bake(MyMonoBehaviour authoring)
{
var transform = GetComponent<Transform>(authoring.otherGO);
AddComponent(new MyComponent {Value = transform.position.x} );
}
}
마찬가지로 에셋(asset)에서 데이터에 액세스하는 경우 해당 자산에 대한 종속성을 생성해야 하므로 에셋(asset)이 변경되면 Baker가 다시 실행됩니다.
public struct MyComponent : IComponentData
{
public int Value;
}
public class MyMonoBehaviour : MonoBehaviour
{
public Mesh mesh;
}
public class MyBaker : Baker<MyMonoBehaviour>
{
public override void Bake(MyMonoBehaviour authoring)
{
// We want to rebake if anything changes in the mesh itself
DependsOn(authoring.mesh);
AddComponent(new MyComponent { Value = authoring.mesh.vertexCount } );
}
}
Baker 안의 프리팹(Prefabs)
Prefabs를 선언하고 변환시키려면, Baker 안에 GetEntity를 부르면 됩니다:
public struct MyComponent : IComponentData
{
public Entity Prefab;
}
public class MyMonoBehaviour : MonoBehaviour
{
public GameObject prefab;
}
public class MyBaker : Baker<MyMonoBehaviour>
{
public override void Bake(MyMonoBehaviour authoring)
{
AddComponent(new MyComponent { Prefab = GetEntity(authoring.prefab) } );
}
}
GetEntity는 엔티티 Prefab을 만드는 데 사용된 엔티티를 반환하지만 이 시점에서는 변환되지 않았습니다. 이것은 나중에 별도의 패스에서 발생합니다.
Baking 시스템
Baking 시스템은 베이커가 생산하는 결과를 처리하는 정규 systems 입니다. 예를 들어 결과를 결합하는 등. 즉, Baking 시스템은 엔티티 데이터로만 작동해야 하며 게임 오브젝트 및 컴퍼넌트와 같이 관리되는 작성 유형(authoring types)으로는 작동하지 않아야 합니다. 이는 Baking 시스템이 Burst 및 Jobs을 사용하여 데이터를 처리할 수 있음을 의미하기도 합니다.
Baking 시스템을 만들려면 [WorldSystemFilter(WorldSystemFilterFlags.BakingSystem)] 특성을 표시합니다. 이것은 Baking이 그것들을 발견하고 Baking 월드에 그것들을 추가할 수 있게 해줍니다. Baking 시스템은 모든 Baking 패스에서 업데이트됩니다.
[WorldSystemFilter(WorldSystemFilterFlags.BakingSystem)]
partial class BakingOnlyEntityAuthoringBakingSystem : SystemBase
{
protected override void OnUpdate()
{
// … Your code here …
}
}
Bakers는 일반적으로 필요하지만, Baking 시스템은 선택 사항이며 고급 사용 사례에만 필요합니다.