🛠️ 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 types | GC 없이 빠르게 돌리기 위해 |
🔒 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
}