250330

lililllilillll·2025년 3월 30일

개발 일지

목록 보기
126/350

🛠️ R&D


ECS

  • Entities.graphics 패키지를 설치해야함
  • subscene을 만들고 거기에 오브젝트를 넣고 저장까지 해야 ECS 적용 가능.
[GameObject] ← (MonoBehaviour: MoveAuthoring)
    ↓
[Baker]가 작동해서
    ↓
[Entity(Entity ID)] 생성
    + [MoveSpeed] 컴포넌트 추가
    + [LocalTransform], [RenderMesh] 등 자동 추가
    ↓
[World(DefaultWorld)] 안에 등록됨

MoveSpeed Component

public struct MoveSpeed : IComponentData
{
    public float Value;
}
  • component라고 꼭 변동되는 값이어야 하는 건 아님

Move System

using Unity.Burst;
using Unity.Entities;
using Unity.Transforms;
using Unity.Mathematics;

[BurstCompile]
public partial struct MoveSystem : ISystem
{
    public void OnUpdate(ref SystemState state)
    {
        float dt = SystemAPI.Time.DeltaTime;

        foreach (var (transform, speed) in SystemAPI.Query<RefRW<LocalTransform>, RefRO<MoveSpeed>>())
        {
            transform.ValueRW.Position.x += speed.ValueRO.Value * dt;
        }
    }
}
  • [BurstCompile]
    • 벡터 연산, 루프, 수치 계산 등이 훨씬 빨라짐
    • IJobParalleFor (배열을 인덱스 별로 나눠서 병렬 실행) 같은 병렬 처리 구조에서 효과 극대화
    • 붙일 수 있는 코드가 c 같은 코드로 제한됨
    • 제한이유
      🔒 No class, no object, no reference typesGC 없이 빠르게 돌리기 위해
      🔒 No Debug.Log()콘솔 IO는 컴파일 불가
      🔒 No UnityEngine API (ex: transform, GameObject, Camera, AudioSource)Unity 객체는 메인 스레드 전용이기 때문
      🔒 No virtual function / dynamic dispatch성능 일관성 보장 불가
  • OnUpdate() : DOTS에서의 Update문
  • transform 등 일부 기본 컴포넌트는 subscene에 있는 오브젝트면 자동으로 ECS 전용 컴포넌트로 변환
  • SystemState : ISystem은 struct라 변수를 저장해둘 수 없으니 대신 변수를 저장해놓는 곳
  • RefRW<T> 해당 컴포넌트의 읽기/쓰기 가능 버전
  • RefRO<T> 해당 컴포넌트의 읽기 전용 버전

Entity Generation

using Unity.Entities;
using UnityEngine;

public class MoveAuthoring : MonoBehaviour
{
    public float speed = 1f;

    class Baker : Baker<MoveAuthoring>
    {
        public override void Bake(MoveAuthoring authoring)
        {
            var entity = GetEntity(TransformUsageFlags.Dynamic);
            AddComponent(entity, new MoveSpeed { Value = authoring.speed });
        }
    }
}
  • Baker : Unity가 Editor에서 이 GameObject를 Entity로 바꿀 때 호출하는 클래스
  • Bake() : GameObject를 Entity로 바꾸기 전에 컴포넌트를 어떻게 붙일지 정의함
  • GetEntity() : 해당 스크립트가 붙은 GameObject가 변환될 Entity
  • TransformUsageFlags : Entity 변환 시,
    Transform 계열 컴포넌트를 어떻게 붙일지 선택하는 플래그
public enum TransformUsageFlags
{
    None,
    ManualOverride,
    WorldSpace,
    Renderable,
    Dynamic
}


profile
너 정말 **핵심**을 찔렀어

0개의 댓글