본문 바로가기

블루프린팅/9. 인공지능

[09인공지능] AI 컨트롤러에서의 비헤이비어 트리 실행

AIController클래스에는 Run Behavior Tree라는 기능이 있다. 비헤이비어 트리 에셋을 파라미터로 받는다. BT_EnmeyBehavior Behavior Tree를 실행하기 위한 부모 클래스로 AIController를 사용하여 

BP_EnemyController블루프린트를 만들었다. 비헤이비어 트리를 실행하는 절차는 다음과 같다.

1. BP_EnemyController 블루프린트를 연다.

2. 이벤트그래프에서 BeginPlay 이벤트의 흰색 실행핀에서와이어를 끌어 실행 Run Behavior Tree를 추가한다.

3. BTAsset의 입력 파라미터로 BT_EnemyBehavior를 세팅한다.

4. 블루프린트를 컴파일해서 저장한다.

 

비헤이비어 트리로 인공지능이 걷도록 가르치기

비헤이비어트리는 캐릭터의 행동을 모델링하는 데 사용되는 도구이다. 여기에는 흐름제어 노드및 태스크노드가 있다.

사용하는 2개의 주용 흐름제어 노드는 Selector와 Sequence이다. 셀렉터 노드는 그 아래에 연결돼 있는 노드(자식노드)를 왼쪽에서 오른쪽으로 각각 실행하지만, 한 자식이 정상적으로 실행되면 즉각 실행이 중지된다. 시퀀스 노드는 정반대이다. 모든 하위 노드가 성공할 경우에만 시퀀스 노드가 성공한다. 첫번째 자식이 실패하면 시퀀스 전체가 실패하고 실행이 종료되고 시퀀스가 중단된다.

 

1. 콘텐츠 브라우저에서 BT_EnemyBehavior에셋을 더블클릭해서 에디터를 연다.

2. 디테일 패널에서 BehaviorTree카테고리를 클릭하고 Blackboard Asset으로 BB_EnemyBlackboard를 선택한다.

BB_EnemyBlackboard의 키 드롭다운이 하단에 있는 블랙보드 패널에 나타난다.

3. 비헤이비어 트리 그래프를 확인한다. 로직트리의 최상위 레벨은 항상 ROOT노드가 된다. ROOT노드는 단순히 로직 플로우의 시작위치를 나타내는 역할을 한다. 비헤이비어 트리 노드 하단에 있는 진한 선은 노드 간의 접속 포인트이다.

4. ROOT노드 하단의 어두운 영역에서 와이어를 클릭해서 끌어 빈 그래프 공간에 놓으면 선택 메뉴팝업이 열린다. Sequence옵션을 선택한다. 디테일 패널에서 이름을 MoveToPatrol로 변경한다.

5. MoveToPatrol노드에서 와이어를 아래로 끌어 MoveTo노드를 추가한다. 이노드는 보라색이면 맨 아래 노드가 된다. 더이상 연결지점이 없다는 걸 뜻한다.

6. MoveTo노드의 디테일패널에서 블랙보드키를 CurrentPatrolPoint로 변경한다. 블랙보드키는  Actor를 이동할 위치를 결정한다.

7. MoveToPatrol 시퀀스에서 Wait노드를 자식으로 추가한다. 디테일 패널에서 대기시간을 3.0초로한다.  랜덤편차를 1초로 하면 2~4초의 랜던한 대기시간이 발생된다.

8. 비헤이비어 트리를 저장한다. 게임을 실행할 때 비헤이비어 트리는 적이 대상에 도달할 때까지 MoveTo 태스크노드를 실행한다. 이때 Wait태스크노드가 실행된다.

 

 BP_EnemyCharacter 인스턴스의 순찰 지점 선택

레벨에디터에서 세팅하기 위해 BP_EnemyCharacter에서 PatrolPoint1변수와 PatrolPoint2변수를 인스턴스 편집가능으로 작성했다. 다음은 순찰지점을 선택하는 단계이다.

1. 레벨 에디터에서 레벨에 배치한 BP_EnemyCharacter 인스턴스를 선택한다.

2. 디테엘 패널에서 디폴트 카테고리로 이동해서 PatrolPoint1과 PatrolPoint2 인스턴스를 세팅한다.

3. 레벨을 저장하고 플레이 버튼을 클릭해서 테스트한다.

4. 게임을 시작하면 첫 번째 위치로 이동하는것을 확인할 수 있다. 포인트에 도달하면 일시정지후 다른 포인트로 달려가기 시작한고 반복한다. 순찰기능을 마무리 되었고 이제 추적할 수 있는 설정을 하겠다.