TransformUsageFlags는 Unity의 ECS(Entity Component System)에서 엔티티의 변환 관련 컴포넌트 사용 방식을 지정하는 데 사용됩니다.
각 플래그는 엔티티가 특정 시나리오에서 어떻게 변환 데이터를 처리할지를 결정합니다.
엔티티의 렌더링, 이동, 공간 배치, 스케일링 등을 효율적으로 제어하기위하여 존재하는 enum
플래그 | 설명 | 비고 |
---|---|---|
None | 엔티티가 변환 컴포넌트를 필요로 하지 않음을 나타냅니다. | 계층 구조의 일부가 아니며, 변환 관련 컴포넌트가 없습니다. |
Renderable | 엔티티가 렌더링에 필요한 변환 컴포넌트를 요구하지만, 런타임에 이동하는 변환 컴포넌트는 필요하지 않음을 나타냅니다. | 부모가 Dynamic이 아니면, 월드 공간에 배치됩니다. |
Dynamic | 엔티티가 런타임에 이동할 수 있는 변환 컴포넌트를 요구합니다. | Dynamic 엔티티의 자식은 Dynamic으로 처리되며, Renderable을 포함합니다. |
WorldSpace | 엔티티가 부모가 Dynamic이어도 월드 공간에 있어야 함을 나타냅니다. | Parent 컴포넌트가 없으며, 모든 변환 데이터가 월드 공간에서 베이킹됩니다. |
NonUniformScale | 엔티티가 비균일 스케일을 나타내는 변환 컴포넌트를 필요로 함을 나타냅니다. | Dynamic 엔티티의 경우, 스케일 정보는 PostTransformMatrix 에 저장됩니다. |
ManualOverride | 엔티티의 변환을 완전히 수동으로 제어하려는 경우를 나타냅니다. | 이 플래그가 설정되면 다른 모든 플래그가 무시되며, 변환 관련 컴포넌트를 추가하지 않습니다. |
만약 Transform을 position과 scale을 전부 제어한다면
public class TransformAuthoring : MonoBehaviour { public GameObject targetObject; class Baker : Baker<TransformAuthoring> { public override void Bake(TransformAuthoring authoring) { Entity entity = GetEntity(authoring.targetObject, TransformUsageFlags.Dynamic | TransformUsageFlags.NonUniformScale); AddComponent(entity, new TransformComponent { Position = authoring.transform.position, Scale = authoring.transform.localScale }); } } } public struct TransformComponent : IComponentData { public float3 Position; public float3 Scale; }
TransformUsageFlags.cs
public enum TransformUsageFlags : int { /// <summary> /// 엔티티가 변환 컴포넌트를 필요로 하지 않음을 나타냅니다. /// </summary> /// <remarks> /// 다른 플래그가 요청되지 않는 한, 이 엔티티는 변환 관련 컴포넌트가 없으며 계층 구조의 일부가 아닙니다. /// /// 이것은 소스 GameObject 계층 구조를 기반으로 생성될 수 있는 <see cref="LinkedEntityGroup"/> 컴포넌트의 멤버십에 영향을 미치지 않습니다. /// </remarks> None = 0, /// <summary> /// 엔티티가 렌더링에 필요한 변환 컴포넌트(<see cref="Unity.Transforms.LocalToWorld"/>)를 요구하지만, /// 런타임에 엔티티를 이동시키는 데 필요한 변환 컴포넌트를 필요로 하지 않음을 나타냅니다. /// </summary> /// <remarks> /// 계층 구조의 부모가 Dynamic이 아닌 경우, 렌더링 가능한 엔티티는 WorldSpace에 배치됩니다. /// </remarks> Renderable = 1, /// <summary> /// 엔티티가 런타임에 이동할 수 있는 변환 컴포넌트(<see cref="Unity.Transforms.LocalTransform"/>, <see cref="Unity.Transforms.LocalToWorld"/>)를 /// 요구함을 나타냅니다. /// </summary> /// <remarks> /// Dynamic 엔티티의 렌더링 가능한 자식도 Dynamic으로 처리되며 <see cref="Unity.Transforms.Parent"/> 컴포넌트를 받습니다. /// Dynamic 사용은 Renderable을 포함하므로, Dynamic 엔티티가 Renderable임을 나타낼 필요는 없습니다. /// </remarks> Dynamic = 1 << 1, /// <summary> /// 엔티티가 Dynamic 엔티티를 부모로 가지고 있어도 월드 공간에 있어야 함을 나타냅니다. /// </summary> /// <remarks> /// 이는 엔티티가 <see cref="Unity.Transforms.Parent"/> 컴포넌트를 가지지 않으며 모든 변환 컴포넌트 데이터가 월드 공간에서 베이킹됨을 의미합니다. /// WorldSpace 사용은 Renderable을 포함하지만 Dynamic은 포함하지 않으며, Dynamic과 함께 사용할 수 있습니다. /// </remarks> WorldSpace = 1 << 2, /// <summary> /// 엔티티가 비균일 스케일(non-uniform scale)을 나타내는 변환 컴포넌트를 필요로 함을 나타냅니다. /// </summary> /// <remarks> /// Dynamic 엔티티의 경우, 모든 스케일 정보는 <see cref="Unity.Transforms.PostTransformMatrix"/> 컴포넌트에 저장됩니다. /// Renderable 전용 엔티티의 경우, 스케일 정보는 <see cref="Unity.Transforms.LocalToWorld"/> 컴포넌트에 결합됩니다. /// GameObject가 비균일 스케일을 포함하는 경우, 이 플래그는 Renderable 및 Dynamic 엔티티에 대해 암시적으로 고려됩니다. /// </remarks> NonUniformScale = 1 << 3, /// <summary> /// 엔티티의 변환 변환을 완전히 수동으로 제어하려는 경우를 나타냅니다. /// </summary> /// <remarks> /// 이 플래그는 오버라이드 플래그로, 설정되면 다른 모든 플래그가 무시됩니다. 베이킹은 엔티티에 변환 관련 컴포넌트를 추가하지 않습니다. /// 엔티티는 부모를 가지지 않으며, 자식도 붙어 있지 않습니다. /// </remarks> ManualOverride = 1 << 4, }
핑백: DOTS 정리 (4) – 튜토리얼 실 - 어제와 내일의 나 그 사이의 이야기