본문 바로가기
개발/Unity

[Unity][DOTS] ECS System에서 기존(Non-ECS) Component 제어하기

by 가리봉맨 2019. 9. 17.
반응형

기존 방식으로 만든 파티클 오브젝트가 ECS로 만든 Entity를 따라다니도록 구현할 이슈가 생겼다.

당연한 이야기지만 ECS에서 'S'에 해당하는 System은 'C'에 해당하는 Component를 제어한다. 변환 API를 사용하면 기존(이하 Non-ECS) Component가 ECS Component로 자동 변환된다. 하지만 아직 변환을 지원하는 Component의 종류가 많지 않다. 직접 변환 기능을 만들면 좋겠지만 쉬운 일이 아니다.

그런데 Non-ECS Component를 ECS System에서 처리하게 만드는 방법이 있다. ECS Entity 생성 시 Non-ECS Component를 추가하고 ECS System에서 이를 불러들이는 것이다. 다만 이렇게 하면 ECS의 성능 향상 효과를 제대로 볼 수 없다. 차선책이라 하겠다. 코드는 다음과 같다.

이미지가 좀 뭉개진 것 같아서 직접 타이핑한 버전도 준비했다. 포스트 분량을 늘리려는 수작이 '절대' 아니다.

public class TroopEffectDustSystem : ComponentSystem
{
       protected override void OnUpdate()
       {
              Entities.WithAllReadOnly<MoveTo>().ForEach(
                      (ParticleSystem _particleDust, ref Translation _position) =>
                      {
                             _particleDust.transform.position = _position.Value;
                      }
              );
       }
}

여기서 ParticleSystem은 이름에 System이 붙어서 헷갈릴 수 있지만 ECS와 상관없는 Non-ECS Component다. Entity 생성 시 AddComponentObject() 메서드로 Entity에 추가했다. 해당 메서드에 대한 상세한 내용은 아래 API 문서에서 확인할 수 있다.

https://docs.unity3d.com/Packages/com.unity.entities@0.0/api/Unity.Entities.EntityManager.html#methods

 

Class EntityManager | Package Manager UI website

Class EntityManager The EntityManager manages entities and components in a World. Inheritance System.Object EntityManager Assembly : solution.dll Syntax public sealed class EntityManager : EntityManagerBaseInterfaceForObsolete Properties Debug An object pr

docs.unity3d.com

Translation은 Entity의 위치 값을 갖는 ECS Component다. TroopEffectDustSystem 클래스의 로직은 아주 간단하다. 매 프레임, 파티클 오브젝트의 위치 값(position)을 Translation 값으로 갱신한다. 그러면 Entity가 움직일 때마다 파티클의 위치 값이 갱신되면서 함께 움직이는 것처럼 보인다.

끝.

반응형

댓글