1.01 ^ 365 = 37.78

유니티에 들어가는 Entitas를 구조화 하는 방법 ( How I build games with Entitas ) 본문

카테고리 없음

유니티에 들어가는 Entitas를 구조화 하는 방법 ( How I build games with Entitas )

Youngchangoon 2018. 3. 16. 00:57



글 요약
  • 유니티와 Entitas를 완벽히 분리할 수 있다!!!
    • 순수한 데이터들의 로직이므로 TDD 환경을 만들 수 있다.
    • Service - Entitas - View 정도로 나뉠수 있다.
  • 기능별 Service들을 추상화, DI(Dependency injection) 구현
    • IService (인터페이스)를 가진 각각의 컴포넌트로 instance를 만들어준다
    • MetaConetxt라는 그룹을 만들어 따로 관리
    • _contexts.meta.timeService.instance 이런식으로 호출가능 
    • 장점: 확장성이 용이
    • 단점: 서비스를 접근하기 위한 접근자가 너무 김..
    • 정말 서비스를 컴포넌트에 넣는것이 맞는가..? (https://github.com/sschmid/Entitas-CSharp/issues/609)
  • Evnet Attribute를 이용한 Listener구현!!
    • 기존 Component에는 ViewComponent { public GameObject view; } 이런식으로 유니티 ref들이 들어가서 XXViewSystem이런식으로 만들어야하는 불편함이 있었음.
    • Event Attribute를 추가하면, Listener Interface가 자동으로 generate가 되고, View단에선 필요한 데이터의 인터페이스를 받아 최신 데이터들로 Listen이 가능하다. 이것은 Position, Audio, Particle, Shader등 모든 유니티의 기능들이 Entitas와 섞이지 않고 분리된 상태에서 필요한 부분만 볼 수 있게된다. Logic과 View단 구현이 완벽히 분리된다!!
  • 결론
    • 유니티 ( View단 ) 와 Entitas ( Logic단 ) 이 완벽히 분리되고, Logic에서 
    • (1) 공용으로 자주 쓰이는 것들 
    • (2) 확장성의 필요성이 느껴지는곳들 ( Input, Log, Ai...)
    • 을 Service단으로 분리시켜준다. 😮
    • 우리는 이제 코드를 볼때 어느 Service의 문제인지, 어떤 Logic이 문제인지, 어떤 View의 문제인지 따로 분리해서 문제를 파악 할 수 있다!
    • 또한 수정도 좀 더 빠르고 정확하게 있어서 기획이 자주 바뀔때 빠른 대처가 가능함!
    • 예를들면
      • 기존 RandomService와 새로운 RandomService를 바꿔서 테스트하고 싶을때, 바꾸기 쉽다!
      • 써드파티를 사용할때, Logic단에 바로 호출하는것이 아니라 서비스단에서 호출하여 Entitas의 결합성을 느슨하게 해준다.
    • 결론적으로 Logic내엔 순수 데이터만 있으므로 TDD가능!