지난 시간엔 대충 장애물 회피를 구현했다.
이제 유닛 AI를 손대려고 하는데, 생각보다 막막했다.
일단 찾아본 바, AI를 만드는 방법은 여러 가지가 있다.
대충 후보는
1. 상태머신(유한상태머신FSM 이라고도 함)
2. 유틸리티
3. 행동트리
세 가지를 찾았는데, 각각 장단점이 있었다.
상태머신은 구현이 간단하고 직관적이고, 유틸리티는 평가함수를 사용해서 다음에 무슨 행동을 할지를 다각적으로 결정할 수 있다.
근데 걍 행동트리 쓰기로 했음.
모듈화가 잘돼서 관리가 편하다길래.
행동트리behavior tree(BT)는 노드로 이루어진 트리를 순회하면서 다음 행동을 결정한다.
가장 기본적인 형태의 BT는 조건condition과 행동action으로 이루어진 리프노드와, sequence, selelctor로 이루어진 컴포짓 노드로 구성된다.
각 노드는 하나의 메소드를 가지고, 메소드는 세 가지 상태 중 하나를 반환한다.
각 상태는 아래와 같음.
SUCCESS
RUNNING
FAILURE
sequence는 자식노드를 왼쪽부터 FAILURE나 RUNNING이 나올 때 까지 순회(메소드를 실행시킴)한다.
selector는 자식노드를 마찬가지로 왼쪽부터 SUCCESS나 RUNNING이 나올 때 까지 순회한다.
여기서 핵심은 '왼쪽' 부터 순회한다는 것이다.
즉, 각 노드간에는 우선순위가 있다.
구체적인 예를 들자면
sequence
condition 유닛이 살았는가?
action. 유닛은 이동한다.
이런 구조를 가지고 있다면, 유닛이 죽었는지를 먼저 검사하고, 죽었다면 순회가 멈춘다. 즉, 유닛은 이동한다 라는 노드의 메소드는 실행되지 않는 것이다.
반대로, 유닛이 살았다면, 유닛은 이동한다 라는 노드가 실행되고 유닛이 이동하게 되는 구조인 거임.
대충 감이 잡히는가?
즉, 먼저 체크해야 될 선행요소를 앞에 배치하고(예를 들어, 유닛이 죽었는지 체크), 그 후에 행동 노드를 배치하는 것이다.
: 방금 만든 간단한 AI
행동 로직은 다음과 같다.
1. 적을 공격한다.
1. 만약 적이 공격 사거리 바깥이라면, 다가간다.
2. 공격 사거리 이내라면 공격한다.
2. 만약 체력이 30% 미만이면, 도주한다.
이를 구현하기 위한 BT는 다음과 같다.
: 타겟 선정
: 행동 결정
: 그리고 이건 주기적으로 반복됨.
타겟 선정과 행동을 분리한 이유는 유닛을 직접 조종할 때를 위해서 미리 분리시켜 놓은 거임.
일단 여기까지 해서 기본적인 AI 제작 틀이 갖춰졌다.
나는 걍 대충 만들어보는 김에 내가 만들어서 썼는데, 님들은 걍 시각화 지원되는 에셋 쓰셈.
응애일지 끝
응애가 아닌 건 분명하다
이게 어째서 응애일지인것... 초고수일지추