DOTS – TransformUsageFlags

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 – TransformUsageFlags”에 대한 1개의 생각

  1. 핑백: DOTS 정리 (4) – 튜토리얼 실 - 어제와 내일의 나 그 사이의 이야기

댓글 달기

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

위로 스크롤