원래는 오늘 Trigger System을 만들려고 했어오
슈팅 게임하면 피탄 점과 아이템을 먹는 영역을 같이 두는 경우가 많은데
대충 위와 같은 느낌으로!
작은 피탄 점을 가진 Trigger 영역과, 아이템을 먹을 수 있는 Trigger 영역이 있어야 한당
기존에는 어떻게 만들었냐?
위처럼 간단하게 콜라이더가 있는 자식 오브젝트를 붙이기만 하면 해결!!
이라고 생각했으나...
ECS에서는 이게 안된다.
ECS도 물론 부모-자식 계층 시스템이 있는데,
Physics 관련 오브젝트가 붙으면, 계층이 깨져버리는 상황이 발생한다
캐릭터는 움직여도, 피탄 점에 해당하는 영역은 꼼짝도 하지 않는 상황..
그냥 간단하게 부모를 따라가는 System을 만들어야 하나 싶었는데
매번 업데이트해야 하는 점이 마음에 안들었다.
그러다가 Authoring 컴포넌트 중에 Linked Entity Group 이라는 컴포넌트가 존재하는걸 발견하였다.
해당 컴포넌트는 버퍼 형태로 자식들과 연결 되는 방식으로 제공되는 컴포넌트인데
위의 문제가 발생하여 서로 찢어져도 연결은 그대로 되어있다는 점을 발견하였다.
그리하여! 플레이어 생성 코드를 다음처럼 수정하였다.
Linked Entity Group 내에서 자식들을 찾아서, 강제로 부모-자식 관계로 만들어주었다.
근데.. 동작은 문제 없는데 계속 Structual Change 에러를 내뱉는거 때문에 스트레스를 엄청 받았다.
이거는.. 공부하고나서 기억속에서 완전히 잊고있던건데
Dynamic Buffer를 사용할 때, 내부를 조정하면 SystemState 의 Dependancy가 깨진다는 점이다.
해결법은 간단히 버퍼를 다시 초기화 시키는 거다.
linkedEntityGroup = state.EntityManager.GetBuffer<LinkedEntityGroup>(prefab);
한줄로 해당 문제까지 해결하였당
이 문제는 커맨드 버퍼로도 해결할 수 없어서 골치아팠는데..
그래도 해결 되었으니 만족
정 상 화
덤으로, 슬로우 모드에서만 피탄 점이 보일 수 있게
간단한 쉐이더를 추가했다.
일지 끝
다음엔 꼭 트리거 시스템을 만들거다!
작년에 dots에서 아직 rigidbody 대신 physics body를 쓸 때 부모 자식에 동시에 물리 바디가 있으면 경고문이 출력 됐었음. 근데 부모랑 자식이 동시에 rigidbody를 가지는 상황은 ecs만이 아니라 그냥 monobehaviour에서도 권장하지 않는 구현임. 그리고 아이템을 먹을 수 있는 영역은 굳이 rigidbody 없어도 될 거 같아 보임. collision은 어차피 충돌 당사자 둘 중 하나가 rigidbody를 가지면 되니까, 아이템한테 rigidbody를 주면 해결됨. 혹은 dots의 성능을 살려서 아예 collider 없이 아이템과 플레이어 위치를 실시간으로 재서 범위에 들어왔는지 확인하는 것도 좋은 방법일거임
으아앙 그러면 오늘 한게 없는거잖아
그런건 아님. 다른 부모 자식 관계는 아니더라도 다른 엔티티 참조가 필요할 때는 많아서 나중에 쓸 일이 꼭 있음