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) – 튜토리얼 실 - 어제와 내일의 나 그 사이의 이야기