슬더스나 크로노아크, 와일드 프로스트와 같은 게임들을 참고하며 턴제 전략 게임을 만들어보고 있습니다.
이 게임들의 공통점이 플레이어나 적이 행동을 하면 [특정 행동] > [일어난 사건에 대한 트리거들 발동]이 과정이 동시에 일어나는 것이 아닌 순차적으로 하나씩 애니메이션이 재생되던데 이게 구경할 땐 별 생각 없었는데 막상 구현하려니 상당히 어렵더라고요.예시로 적과 아군 유닛이 각각 있고적은 피격 시, 자신의 체력 n을 회복아군은 공격 적중 시, 한 번 더 공격.이 상황에서 아군이 적을 공격하는 행동을 시전합니다.그럼 흐름은메인 행동 : 아군이 적을 공격메인 행동에 대한 트리거들 : 아군의 '공격 적중 시' 트리거가 발동되어 '공격 행동'을 큐에 담습니다. > 적의 '피격 시' 트리거가 발동되어 '체력 회복 행동'을 큐에 담습니다
이후 큐의 사이즈가 0이 될 때까지 하나씩 꺼내어 행동을 순차적으로 실행합니다.
언뜻보기엔 문제가 없어보였는데 위의 흐름은 문제가 생깁니다. 아군은 정상적으로 총 2번을 때리게 되지만 적의 회복 효과는 조건이 '피격 시'인데도 2번을 맞고 난 이후에야 발동하게 됩니다. 처음엔 그냥 각 행동에 우선순위가 있어야 하나? 생각하며 이 밖에도 수많은 시뮬을 굴려봤는데 문제의 뿌리가 뽑히진 않았습니다. 그래서 계속해서 고민하다 내린 결론은 '추가 공격'이란 행동은 트리거로서 생각하는 것이 아닌 메인 행동으로서 생각해야 한다는 것입니다.
즉 기존은 메인 행동 1개에 대해 연쇄되는 트리거들을 큐로서 관리한다. 가 전부였다면,
이젠 행동 큐와 트리거 큐를 2개 관리하고 1개의 행동 큐를 꺼내서 실행한 후 이 과정에서 일어난 트리거들을 트리거 큐에 담아서 트리거 큐를 다 털어낸 다음, 다시 행동큐 하나 꺼내고...
이를 반복하는 큐가 중첩 되어있는 구조입니다.
모든 행동 및 트리거들 로직 함수와 애니메이션 함수를 코루틴으로 만들고 큐에 이 코루틴들을 쌓아두고 하나씩 꺼내 실행하며
yield return StartCoroutine() << 를 통해 애니메이션 시간을 보장받으며 순차적으로 하나씩 재생되도록 만들었습니다.
이 작업은 매니저 스크립트에서 굴러갑니다.
여기까지가 제가 생각한 설계인데 아무래도 자료도 많이 없고 혼자서 끙끙대며 만든 거다 보니 솔직히 잘 만든 건지 모르겠어 고수님들의 피드백을 받고싶습니다.
읽어주셔서 감사합니다.
혹시 행동에 우선순위 부여하면서 우선순위 큐를 썼음에도 잘 안된거임?
메인 여러개 중 하나만 삽입 -> 나머지 트리거 행동 삽입 -> 다음 메인 삽입 이 구조면 우선순위 큐 가능한데 메인 행동 모두 삽입 -> 메인을 시행하면 트리거 발동 -> 트리거 모두 수행하면 다음 메인 이 구조면 큐 두개가 맞는듯
이벤트를 더 나눠 아니면 우선순위를 주던지 큐 사용하는것도 잘 모르겠다 그냥 흐름을 따라가면 되는데
나도 덱빌딩 로그라이크 만들고 있는데 전투에 발동되는 메인 이벤트만 21개 있음 공격 => 공격 시작 이벤트 => 피해량 처리 전 이벤트 => 피해량 처리 => 피해량 처리 후 이벤트 => 공격 종료 이벤트 이런식으로 졸라게 나눠서 피격시 발동하는건 피해량 처리 후 또는 전에 발동되고 추가 공격은 공격 종료 이벤트에서 발동하고 하는식으로 하면 됨
연쇄되는 트리거들을 큐로 관리하는것도 복잡하게 큐를 2개 쓰고 비우고 뭐 하고 할 필요도 없어 그냥 효과 따라서 이벤트 구독하고 흐름대로 이벤트 발행하고 이벤트 처리하고 하면 됨 아군 유닛 - 공격 종료 이벤트 구독 적 - 피해량 처리 후 이벤트 구독
공격버튼 클릭 => 공격 => 공격 시작 이벤트(구독중인거 없으니까 바로 종료) => 피해량 처리 전 이벤트(구독중인거 없으니까 바로 종료) => 피해량 처리 => 피해량 처리후 이벤트 => 구독된 적 피해량 처리 이벤트 시작 => 자신의 체력 회복 => 기존 흐름으로 돌아가서 공격 종료 이벤트 => 구독된 공격 종료 이벤트 시작 => 추가공격 => 공격 => 공격 시작 이벤트 => ... => 구독된 공격 종료 이벤트 시작 => 이미 한번 공격 했으니까 스킵 => 기존 흐름으로 돌아가서 공격 종료 best practice는 아닐 수 있지만 나는 이런식으로 돌리고 있음
https://theliquidfire.com/2017/08/21/make-a-ccg-intro/
이
글 참고해보세요. 저도 그 구조 문제 때문에 거의 몇 개월 썼는데 ECS(유니티 DOTS 말하는거 아님) 구조로 바꾸면 다 해결됩니다. 진짜 3개월 걸린거 한 달만에 구현함