캐릭터 하나 만들고 버프 스킬을 추가하기로 계획했는데 생각보다 쉽지 않았음.

지금까지는 구체 콜리전 추가하고 충돌한 대상을 리스트에 추가한 뒤에

매 프레임마다 for문 돌아서 조건 체크 후 스킬을 쓰게 만들었는데

유닛과 오토 캐스팅 스킬이 늘어나면 비효율적이라는 생각이 들었음.



처음에는 이벤트를 활용했음

오토 캐스팅 스킬을 가진 유닛은 주변 유닛의 이벤트를 구독하고 

유닛들은 무언가 행동할 때마다 이벤트를 호출하는 방식이었음.

매 프레임마다 검사하지 않게 됐지만 메모리 부담은 더 커진 듯.



다음에는 맵을 격자 모양으로 분할하고 같은 구역의 유닛들과 상호작용하게 만들었음.

1. 맵을 분할한 뒤에 각 구역의 이벤트들을 담당하는 객체를 생성

2. 각 유닛은 구역에서 나가거나 입장할 때 스킬의 조건에 부합한 구역 담당 객체의 이벤트를 구독

(예: 공격 받음, 공격 함, 스킬 사용)

3. 구역 안의 유닛은 행동 시 구역 담당 객체에게 행동 정보 전송

4. 구역 담당 객체는 받은 정보를 바탕으로 이벤트 호출


유닛들이 서로의 이벤트를 구독하지 않고, 매 프레임마다 for문을 돌 필요도 없게 됐지만

바로 코앞에 있어도 서로 다른 지역이면 서로 상호작용할 수 없게 됐음.

인접한 구역의 이벤트도 구독한다면 플레이어 입장에서 유닛의 감지 범위가 이상하게 느껴지거나

근처에 조건을 충족한 대상이 있지만 다른 지역에서 이벤트가 먼저 호출되어 출장(?)을 가게 될 수도 있었음



마지막에는 그룹을 만들고 서로 상호작용하게 만들었음.

(AI퍼셉션에서 비슷한 기능을 본 것 같은데 쓰기엔 적합하지 않은 것 같아요.)

1. 모든 유닛은 생성될 때 자신만 포함된 그룹과 다른 유닛을 감지하는 범위를 가짐

2. 다른 유닛을 감지한 경우 두 유닛의 그룹은 합쳐짐. 범위를 벗어나면 그룹은 분리됨

3. 그룹에 속한 모든 유닛은 그룹에 자신의 정보와 필요한 이벤트를 구독함

4. 유닛은 행동할 때마다 정보를 그룹에 제공하고, 그룹은 정보에 알맞은 이벤트를 호출함


아마도 장점은

1. 매 프레임마다 조건을 체크하지 않음.

2. 그룹 내 모든 유닛이 이벤트를 공유하니 메모리 부담도 덜함.

3. 그룹에서 벗어나도 이벤트는 한 번만 구독 해체하면 됨.

4. 자신의 감지 범위에 따라 구역이 정해져서 이벤트 호출로 먼 길을 떠나지 않아도 됨.


단점은

1. 유닛이 감지 범위를 벗어났을 때 두 그룹 이상으로 분리할 수 있는 실질적인 단절점이 안 될 수도 있음.


2. 같은 그룹의 유닛들이 범위를 벗어나지 않고 이동하면 맵 한쪽 끝에서 다른 쪽 끝으로 출장 갈 수도 있음.

줄줄이 소시지처럼 연결돼 있으면 그룹 하나에 유닛들이 다 포함됐을 테니 가능


3. 감지 범위가 매우 넓은 유닛의 경우 분리돼야 할 그룹들을 하나로 합칠 우려가 있음.

예시에 해당하는 유닛으로는 스타크래프트2의 드라켄 레이저 천공기가 있어요. 맵 전체가 사거리 안에 드는데

그렇다고 어떤 그룹에도 포함시키지 않으면 상호작용을 못하게 될 수도 있음.



결국 마땅한 방법을 못 찾았고 워크래프트3 에디터를 가지고 실험해서 정보를 얻기로 결정



주제 1. 오토 캐스팅 유닛들은 매 프레임이나 고정된 시각에 for문을 돌아서 주변 유닛들을 검사할까?

내 추측이 맞다면 오토 캐스팅 스킬을 사용하기 위해 검사를 해야 하니 cpu 사용률이 증가할 것임.


(중앙의 샤먼은 블러드러스트가 오토 캐스팅 상태임.)


cpu 사용률은 변함 없음. 역시 이런 방법을 사용할 리가 없음.

적당한 순간이 되면 샤먼이 블러드러스트를 사용하는 듯함.



주제 2. 샤먼이 블러드러스트를 쓸 때 주변 유닛의 이벤트를 구독할까 아니면 지원 요청을 받을까?



(모든 유닛에게 일꾼 AI를 부여해서 서로 공격하지 않음.)


피언이 자동으로 트롤 헤드헌터를 때리게 설정했을 때는 샤먼이 버프를 안 줬으나

처음 상태에서 트롤 헤드헌터로 중립 피언을 공격했을 때는 버프를 줌.

이 실험으로 알게 된 사실은 

샤먼이 어떤 방식이든 매 프레임 아닌 일정 시간마다 조건을 체크하고 블러드러스트를 씀.


아무리 생각해도 상대의 데이터를 알려면 어딘가 이벤트 구독 비슷한 작업을 해야 한다고 생각했고

모든 유닛에게 개방된 어떤 공간에 존재하는 이벤트를 구독한 뒤에 유닛들이 행동할 때마다 정보를 넘기면 

시스템이 정보에 맞는 이벤트를 호출한다고 추측했음.

이런 생각을 하면서 이벤트를 구독한 순서대로 호출된다면 사거리가 멀리 떨어져도 있어도 

먼저 구독한 샤먼이 스킬을 쓰리라 생각하면서 다음 실험을 준비함.



주제 3. 전투 중인 유닛과 가장 가까운 샤먼이 블러드러스트를 쓸까?



트롤 헤드헌터 근처의 샤먼이 먼저 생성됐고 블러드러스트를 오토 캐스팅으로 바꿨음.

먼저 생성된 샤먼이 멀리 떨어져 있었음에도 불구하고 먼저 스킬을 썼음.

왼쪽에서 온 샤먼이 스킬을 먼저 쓴 것 같이 보이지만 방향을 보면 먼저 생성된 샤먼한테 스킬을 씀.

스킬을 쓰려고 했으나 이미 트롤 헤드헌터한테 블러드러스트가 걸려 있으니까 다른 전투원한테 스킬을 쓴 것임.

(버프 제공도 전투로 간주되는 듯함.)


추측이 맞다면 이것은 분명 스킬 순서가 정해져 있다는 뜻임.

즉, 

공용 공간에 존재하는 이벤트를 먼저 이벤트를 구독했고, 

전투 중인 유닛이 자신의 감지 범위 안에 있으며,

가장 가까운 유닛의 스킬이 먼저 실행되는 것임.


이 구조가 맞다면 실험이 하나 더 남았음



주제 4. 이벤트를 구독한 유닛이 많아도 버프가 이미 걸려있으면 cpu 사용률이 변함 없어야 함.


(샤먼한테 마법 면역 부여해서 버프를 못 주게 한 뒤 실험했음. 모든 유닛은 일꾼AI를 가지고 있어서 선공하지 않음)


이전 실험처럼 트롤 헤드헌터를 수동으로 공격하게 했음.

cpu 사용률은 변함 없는 듯함. 그러나 샤먼이 단체로 피언을 공격해서 잠시 상승했음.

만약 버프가 있어서 이벤트가 실행되지 않는다면 샤먼이 굳이 반응할 일이 없을 텐데?


아마도 시스템 구조는

1. 트롤 헤드헌터가 공격.

2. 이벤트 관리 객체한테 공격 정보 전송됨.

3. 이벤트가 호출되어 모든 블러드러스트 스킬이 점사를 시작함.

4. 첫 번째 샤먼이 버프를 주고 나머지는 스킬이 작동하지 않음.

5. 오토 캐스팅 스킬이 내부적으로 조건 체크 후 (스킬 사용과 관계 없이)  공격 명령을 명령 큐에 추가.



이외에도 체력이 없는 아군 유닛이 멀리 있을 때 아군 프리스트가 힐을 주나 실험해봤는데 따라와서 주는 것을 보면

스킬 사용 범위와 감지 범위는 다른 것 같음



결론

오토 캐스팅 스킬은 

공용 공간에 존재하는 이벤트를 먼저 이벤트를 구독했고, 

전투 중인 유닛이 자신의 감지 범위 안에 있으며,

가장 가까운 유닛의 스킬이 먼저 실행됨


구독이 늘거나 정보가 전달될 때마다 이벤트를 호출해야 할 듯