슬더스나 크로노아크, 와일드 프로스트와 같은 게임들을 참고하며 턴제 전략 게임을 만들어보고 있습니다.

이 게임들의 공통점이 플레이어나 적이 행동을 하면 [특정 행동] > [일어난 사건에 대한 트리거들 발동]이 과정이 동시에 일어나는 것이 아닌 순차적으로 하나씩 애니메이션이 재생되던데 이게 구경할 땐 별 생각 없었는데 막상 구현하려니 상당히 어렵더라고요.
예시로 적과 아군 유닛이 각각 있고적은 피격 시, 자신의 체력 n을 회복아군은 공격 적중 시, 한 번 더 공격.이 상황에서 아군이 적을 공격하는 행동을 시전합니다.그럼 흐름은메인 행동 : 아군이 적을 공격메인 행동에 대한 트리거들 : 아군의 '공격 적중 시' 트리거가 발동되어 '공격 행동'을 큐에 담습니다. > 적의 '피격 시' 트리거가 발동되어 '체력 회복 행동'을 큐에 담습니다
이후 큐의 사이즈가 0이 될 때까지 하나씩 꺼내어 행동을 순차적으로 실행합니다.

언뜻보기엔 문제가 없어보였는데 위의 흐름은 문제가 생깁니다. 아군은 정상적으로 총 2번을 때리게 되지만 적의 회복 효과는 조건이 '피격 시'인데도 2번을 맞고 난 이후에야 발동하게 됩니다. 처음엔 그냥 각 행동에 우선순위가 있어야 하나? 생각하며 이 밖에도 수많은 시뮬을 굴려봤는데 문제의 뿌리가 뽑히진 않았습니다. 그래서 계속해서 고민하다 내린 결론은 '추가 공격'이란 행동은 트리거로서 생각하는 것이 아닌 메인 행동으로서 생각해야 한다는 것입니다.


즉 기존은 메인 행동 1개에 대해 연쇄되는 트리거들을 큐로서 관리한다. 가 전부였다면,

이젠 행동 큐와 트리거 큐를 2개 관리하고 1개의 행동 큐를 꺼내서 실행한 후 이 과정에서 일어난 트리거들을 트리거 큐에 담아서 트리거 큐를 다 털어낸 다음, 다시 행동큐 하나 꺼내고...

이를 반복하는 큐가 중첩 되어있는 구조입니다.



모든 행동 및 트리거들 로직 함수와 애니메이션 함수를 코루틴으로 만들고 큐에 이 코루틴들을 쌓아두고 하나씩 꺼내 실행하며

yield return StartCoroutine() << 를 통해 애니메이션 시간을 보장받으며 순차적으로 하나씩 재생되도록 만들었습니다.

이 작업은 매니저 스크립트에서 굴러갑니다.


여기까지가 제가 생각한 설계인데 아무래도 자료도 많이 없고 혼자서 끙끙대며 만든 거다 보니 솔직히 잘 만든 건지 모르겠어 고수님들의 피드백을 받고싶습니다.

읽어주셔서 감사합니다.