지금까지 내가 사용한 엔터티 구성 요소 시스템은 대부분 Java의 아르테 미처럼 작동했습니다.
- 구성 요소의 모든 데이터
- 상태 비 저장 독립 시스템 (적어도 초기화시 입력이 필요하지 않은 정도까지)은 특정 시스템이 관심있는 구성 요소 만 포함하는 각 엔티티를 반복합니다.
- 모든 시스템은 엔티티를 하나의 틱으로 처리 한 다음 전체를 다시 시작합니다.
이제 게임을 진행하기 전에 서로에 대해 정해진 순서로 발생해야하는 수많은 이벤트와 응답으로 턴 기반 게임에 이것을 처음으로 적용하려고합니다. 예를 들면 :
플레이어 A는 칼로 피해를받습니다. 이에 대응하여, A의 방어구는 공격을 받아 피해를 줄입니다. A의 이동 속도도 약해져서 낮아집니다.
- 받는 피해는 전체 상호 작용을 설정하는 것입니다
- 플레이어에게 데미지를 적용하기 전에 방어력을 계산하고 들어오는 데미지에 적용해야합니다
- 이동 속도 감소는 최종 피해량에 의존하기 때문에 실제로 피해가 처리 된 후에야 유닛에 적용 할 수 없습니다.
이벤트는 다른 이벤트를 트리거 할 수도 있습니다. 갑옷을 사용하여 검의 피해를 줄이면 검이 부서 질 수 있습니다 (손상이 완료되기 전에 이루어져야 함). 이에 따라 추가로 사건이 발생할 수 있습니다.
대체로 이것은 몇 가지 문제를 일으키는 것으로 보입니다.
- 많은 낭비되는 처리주기 : 대부분의 시스템 (렌더링과 같이 항상 실행되는 것들을 위해 저장)은 작동하기 위해 "그들의 차례"가 아닐 때해야 할 일이 없으며, 대부분의 시간이 게임이 들어 오기를 기다리는 데 소비합니다. 유효한 작업 상태. 이것은 게임에 더 많은 상태가 추가 될수록 크기가 계속 커지는 수표로 그러한 모든 시스템을 비산합니다.
- 시스템이 게임에 존재하는 엔티티를 처리 할 수 있는지 확인하려면, 관련없는 다른 엔티티 / 시스템 상태를 모니터 할 방법이 필요합니다 (손상을 담당하는 시스템은 갑옷의 적용 여부를 알아야합니다). 이로 인해 여러 가지 책임이있는 시스템이 혼란스러워 지거나 각 처리주기 후에 엔티티 콜렉션을 스캔하고 리스너 세트와 통신하여 작업을 수행 할 수있는 시간을 알려주는 것 외에 다른 목적이없는 추가 시스템이 필요합니다.
위의 두 지점은 시스템이 동일한 엔티티 세트에서 작동하고 구성 요소의 플래그를 사용하여 상태를 변경한다고 가정합니다.
이를 해결하는 또 다른 방법은 게임 상태를 진행하기 위해 단일 시스템 작업의 결과로 구성 요소를 추가 / 제거하거나 완전히 새로운 엔티티를 만드는 것입니다. 이는 시스템이 실제로 일치하는 엔티티를 가질 때마다 시스템이 처리 할 수 있음을 알고 있음을 의미합니다.
그러나 이로 인해 시스템이 후속 시스템을 트리거해야하므로 단일 시스템 상호 작용의 결과로 버그가 표시되지 않으므로 프로그램 동작에 대해 추론하기가 어렵습니다. 새로운 시스템을 추가하는 것은 다른 시스템에 어떤 영향을 미치는지 정확히 알지 못하고 구현할 수 없기 때문에 더 어려워집니다 (그리고 새로운 시스템이 관심있는 상태를 트리거하기 위해 이전 시스템을 수정해야 할 수도 있음). 단일 작업으로.
이것이 내가 살아야 할 것입니까? 내가 본 모든 ECS 예제는 실시간이었으며, 이러한 경우 게임당 루프가 어떻게 작동하는지 쉽게 알 수 있습니다. 그리고 렌더링에 여전히 필요합니다. 무언가가 발생할 때마다 대부분의 측면을 일시 중지시키는 시스템에는 적합하지 않은 것 같습니다.
게임 상태를 앞으로 나아갈 수있는 디자인 패턴이 있습니까? 아니면 모든 로직을 루프 밖으로 옮기고 필요할 때만 트리거해야합니까?