Unity Engine

[Unity]ECS

Aostols 2023. 12. 5. 08:33
반응형

ECS 가 최근에 정식으로 출시 되었습니다.

DOTS 의 핵심중 하나인데요

DOTS 는 3가지 큰 주제로 구성되고 있습니다.

1. ECS Component

2. Burst Compiler

3. Job System

 

여기서 ECS 가 가장 늦게 정식버전이 되었는데요 Package Manager에서 찾아볼 수 있습니다.

 

 

이제 DOTS를 활용하여 데이터 지향 프로그래밍을 할 수 있습니다.

 

ECS의 샘플 프로젝트 주소 입니다.

https://github.com/keijiro/ECS-Strawman

 

GitHub - keijiro/ECS-Strawman: The simplest Unity ECS/DOTS example.

The simplest Unity ECS/DOTS example. Contribute to keijiro/ECS-Strawman development by creating an account on GitHub.

github.com

 

관련된 강의도 유투브에 같이 공개되어 있습니다.

강의 내용을 요약하면 다음과 같습니다.

 

ECS는 기존의 Hierachy와 다른 구성을 쓰기 떄문에 SubScene이라는 개념을 쓰게 되고 기본적으로는 Hierachy에서 보이지 않고 사용자가 편집하기 쉽도록 SubScene에서 표시된 체크박스를 체크하면 우리가 익히 아는 구조로 보이게 됩니다.

하지만 이것은 직접 쓰이지 않고 사용자가 편집하기 쉽도록 지원해 주는 것 입니다.

 

SubScene 내부에 객체를 선택하면 Inspector상에 하단에 Entity Baking Preview 라는 화면이 추가됩니다.

이는 위에서 이야기 했던 ECS구조가 사용하는 컴퍼넌트 들이고 사용자가 편집해서 넣게되면 자동으로 해당 컴퍼넌트들로 전환 될 것입니다.

 

using Unity.Entities;
using UnityEngine;

public struct Walker : IComponentData
{
    public float ForwardSpeed;
    public float AngularSpeed;
}

public class WalkerAuthoring : MonoBehaviour
{
    public float _forwardSpeed = 1;
    public float _angularSpeed = 1;

    class Baker : Baker<WalkerAuthoring>
    {
        public override void Bake(WalkerAuthoring src)
        {
            var data = new Walker()
            {
                ForwardSpeed = src._forwardSpeed,
                AngularSpeed = src._angularSpeed
            };
            AddComponent(GetEntity(TransformUsageFlags.Dynamic), data);
            
        }
    }
}

 

사용된 WalkerAuthoring.cs 입니다.

ECS 는 IComponentData 를 Bake 하여 System에서 사용한다는 큰 구조를 가지고 있습니다.

여기서 Walker:IComponentData가 보이고 이 데이터를 아래 표시될 System에서 사용하는 것 입니다.

위의 사진을 보게 되더라도 Walker라는 컴퍼넌트가 등록 되어 있음을 알 수 있습니다.

 

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

public partial struct WalkerSystem : ISystem
{
    public void OnUpdate(ref SystemState state)
    {
        var dt = SystemAPI.Time.DeltaTime;

        foreach (var (walker, xform) in
                 SystemAPI.Query<RefRO<Walker>,
                                 RefRW<LocalTransform>>())
        {
            var rot = quaternion.RotateY(walker.ValueRO.AngularSpeed * dt);
            var fwd = math.mul(rot, xform.ValueRO.Forward());
            xform.ValueRW.Position += fwd * walker.ValueRO.ForwardSpeed * dt;
            xform.ValueRW.Rotation = quaternion.LookRotation(fwd, xform.ValueRO.Up());
        }
    }
}

 

이제 System을 보게 되면 ISystem을 구현해서 OnUpdate마다 할 일을 정해 주게 됩니다.

단순히 회전하는 모습으로 영상에서는 3개의 객체를 만들게 됩니다.

 

여기서 핵심적으로 알아야 할것은

IComponentData를 Bake 하고 System에서 사용한다 는 것만 기억하면 될 것 같습니다.

반응형

'Unity Engine' 카테고리의 다른 글

[Unity]ECS - BurstCompile  (1) 2023.12.21
[Unity]ECS - 2  (0) 2023.12.19
[Unity] Animation Controller  (0) 2023.04.23
[Unity] ScriptableObject + Reflection  (0) 2023.03.28
[Unity]Job System + String  (0) 2023.03.03