기존 방식으로 만든 파티클 오브젝트가 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 문서에서 확인할 수 있다.
Translation은 Entity의 위치 값을 갖는 ECS Component다. TroopEffectDustSystem 클래스의 로직은 아주 간단하다. 매 프레임, 파티클 오브젝트의 위치 값(position)을 Translation 값으로 갱신한다. 그러면 Entity가 움직일 때마다 파티클의 위치 값이 갱신되면서 함께 움직이는 것처럼 보인다.
끝.
'개발 > Unity' 카테고리의 다른 글
[Unity][DOTS] Unity.Mathematics 라이브러리 사용하기 (6) | 2020.01.28 |
---|---|
[Unity][DOTS] System에서 Entity 데이터에 접근하는 다양한 방법 (2) | 2019.10.24 |
[Unity] NGUI + Spine 연동 (2) | 2019.08.30 |
[Unity][DOTS] 계층 구조의 GameObject를 ECS Entity로 변환하기 (0) | 2019.08.23 |
[Unity] Mac에 유니티 캐쉬 서버 설치하기 (0) | 2019.07.19 |
댓글