본문 바로가기

Memorize: RECALL

Binary Tree를 이용한 콤보 시스템 구현

왜 Binary Tree인가?

 Memorize: RECALL의 특징 중 하나는 약 공격과 강 공격을 이용한 콤보 시스템이다. 또한 특정 콤보를 만족하면 일반적으로 실행되는 공격 대신 특수한 스킬이 실행된다. 이를 만족하는 구현을 위해 Binary Tree를 사용했다. 약 공격은 좌측 자식 노드, 강 공격은 우측 자식 노드로 가게 하면 설정해둔 Tree를 통해 적절한 Skill이 실행될 것이기 때문이다.

 

Binary Tree 설정

Skill Class 설정

 무기를 교체해도 콤보 진행은 유지되기에 Binary Tree는 Weapon에, Iterator는 Weapon Component에 존재한다. 우선 Weapon에 있는 Skill Class의 설정 코드를 보면, 우선 Data Table에 있는 Combo Height 변수를 사용해 Binary Tree를 표현할 배열의 크기를 설정한다. 그 후 루트 노드는 사용하지 않기에 메모리를 절약하기 위해 Dodge Skill을 설정하였다. 나머지 노드는 전부 Attack Class로 설정한 뒤, Override 된 노드가 있을 경우 덮어쓰는 작업을 통해 Skill Class를 초기화한다.

Weapon Data에 있는 Skill Class 관련 Data와 Skill Class 설정 코드

 

Skill Data 설정

 Skill Data는 전 포스팅에서 서술했듯, Weapon Key + Level + 규칙에 의해 생성된 Key가 Skill의 Key가 된다. 그렇다면 그 규칙은 무엇일까? 우선 처음은 Override 여부이다. 이는 Override 된 스킬일 경우 1, 아니면 0을 설정하게 된다. 이를 넣지 않을 경우, 그 뒤에 있는 Key가 충돌하기에 넣게 되었다.

  그 다음은 Override 된 Skill은 Skill의 Index, 아니면 Combo Height가 된다. 단, Dodge Skill은 무조건 0으로 설정한다. Combo Height는 수((Log2(Skill Index + 1) - 1) * 2 + 1)에 의해 계산된다.

Skill Key를 구하고 Data를 얻는 코드

 

Binary Tree 사용

 우선 Dodge Skill이 요청될 경우, 바로 0번째 스킬을 요청하면 된다. Attack Skill이 요청될 경우 우선 현재 Index가 255인지 확인한다. Index가 255라는 뜻은 콤보를 실행 중에 있지 않다는 뜻이다. Index가 255일 경우 0으로 설정하고, 아니라면 수((2 * Skill Index) + 2)을 통해 다음 Index를 계산한다. 마지막으로 강 공격이 요청되었을 경우, Index를 1 올리면 실행해야 할 Skill의 Index가 구해진다. 당연히 Dodge가 0번이기에 Index에 1을 더한 값으로 요청해야 한다.

Index 설정 후 공격 요청 코드

 

ToDo

 플레이어를 제작할 때는 문제가 없었다. 그러나 AI의 패턴을 만들 때 최대 양자택일의 패턴 밖에 할 수 없다는 한계가 존재했다. 추후 Iterator라는 공통 인터페이스를 구현해 Skill의 해석 방식을 다르게 하는 방식으로 해결할 것이다. 예를 들어 Binary Iterator는 기존의 이진 콤보 시스템으로, Random Access Iterator는 스킬 전체를 직접 접근하는 방식처럼 말이다. 이는 Binary Tree를 배열로 표현하였기에 가능한 방식이다.

배열을 통해 표현한 Skill Binary Tree