본문 바로가기

3D 게임 개발이 처음이어도 언리얼 블루프린트로 쉽게 배우는 3D 게임

본 캠프 1일차 (BehaviorTree에 따른 AI캐릭터의 구성, 내비게이션 시스템)

3D 게임 개발이 처음이어도 언리얼 블루프린트로 쉽게 배우는 3D 게임 개발 강의 4-1

BehaviorTree에 따른 AI캐릭터의 구성

Root : 행동의 시작점을 의미함.

Selector : 조건에 따라 어떤 행동을 할지 선택한다.

Sequence : 전 행동이 끝나면 다음 행동을 진행 시킨다.

Parellel : 여러 행동들을 동시에 진행 시킨다.

Task : 실제로 움직인다.(행동을 한다.)

Decorator : 조건을 추가한다.(어떠한 상황에서 이걸 실행하지 않겠다, 어떠한걸 추가하겠다.)

Service : 일정 시간마다 실행된다는 특성이 있다. 그렇기에 데이터를 갱신하는데 자주 사용된다.

BehaviorTree 예시

 

실습

AI의 인심 범위 안에 캐릭터(유저)가 들어왔을 때 AI가 캐릭터를 쫓도록 구현하자.

 

콘텐츠 브라우저에서 우클릭 하여 인공지능 - 비헤이비어 트리를 생성한다.

Selector 노드와 Move To 노드를 추가한다.

비헤이비어 트리에서는 데이터를 저장하고, 내보내는 역할을 하는 블랙보드 에셋을 만들어야 한다.

콘텐츠 브라우저에서 우클릭 - 인공지능 - 블랙보드 생성한다.

생성 후 비헤이비어 트리를 가서 디테일 - Behavior Tree를 보면 블랙보드 에셋을 설정하는 창이 나온다.

생성한 블랙보드를 넣고 오른쪽 위 블랙보드를 누른다.

새 키를 눌러 벡터 자료형을 추가하고 이름을 TargetPosition으로 변경한다.

SelfActor는 이 비헤이비어트리를 가진 액터(본인)을 뜻한다.

다시 오른쪽 위의 비헤이비어 트리를 누르고 Move To 노드를 추가하고 디테일 창에서 블랙보드 키를 TargetPosition으로 바꾼다.

조건을 만족할 때 행동을 실행하기 위해 왼쪽 위의 새 데코레이터 - BTDecorator_BlueprintBase를 생성한다.

데코레이터를 생성한 후 비헤이비어 트리에서 Move To 노드에 우클릭을 하면 데코레이터 추가에서 만들어 둔 데코레이터를 추가할 수 있다.

Move To노드에서 데코레이터(파란 부분)를 더블 클릭 하면 데코레이터 블루프린트가 실행된다.

데코레이터 블루프린트에서 함수 - 오버라이드 - Perform Condition Check를 생성한다.

PerformConditionCheck 함수는 결과 값이 True일 때 실행시키는 함수이다.

AI의 인식 범위를 구(Sphere) 형태로 만들기 위해 Sphere Overlap Actors 노드를 생성한다.

구의 중심점은 AI캐릭터가 돼야하므로 Sphere Pos에 Owner Actor 의 get Actor Location를 연결한다.

Sphere Radius는 구의 반경이다.(인식 범위 거리)

Pawn의 오브젝트 타입만 인식하도록 Object Types에 Make Array노드를 생성하여 Pawn으로 설정하여 연결한다.

Sphere Overlap Actors의 Out Actors에는 인식범위 안에있는 Pawn의 값이 들어오는데 이것이 플레이어의 폰인지 판단해야한다.

Find Item노드의 찾지 못했을 때 -1을 반환하는것을 이용하여 판단이 가능하다.

Find Item의 값이 -1이면(인식 범위안에 플레이어를 찾지 못했으면) 결과값이 False, 값이 -1이 아니면(찾았으면) 결과 값이 True로 되어 쫓아가게 된다.

플레이어 캐릭터가 인식범위 안에 있을 때 TargetPosition 값(플레이어 캐릭터 위치) 저장하기.

Get Blackboard 노드 생성하고 Set Value as Vector 노드를 연결한다.

KeyName은 TargetPosition, Vector Value에는 플레이어 폰의 위치를 연결한다.

위 까지 로직이 데코레이터의 결과 값이 True일 때 TargetPosition으로 이동하도록 구현한 것이다.

캐릭터가 인식범위에 없을 때 랜덤한 위치로 돌아다니기.

비헤이비어 트리에서 왼쪽 위 새 서비스를 눌러서 생성한다.

Move To 노드에 만든 서비스를 추가 한다.

생성된 서비스의 블루프린트에서 함수 오버라이드 - Receive Activation을 생성한다.

서비스가 활성화 될 때 TargetPosition 값을 랜덤하게 저장하여 AI가 움직이게 해야하는데 이때 필요한 게 내비게이션 시스템이다.

내비게이션 시스템은 지정된 범위에서 길을 찾을 때 어느 경로로 가야 최적의 경로인지를 찾아주는 시스템이다.
장애물이 있으면 피해서 가는 역할도 한다.

내비게이션 시스템을 사용하기 위해 레벨에서 내비메시 바운드 볼륨 액터를 생성한다.

P를 누르면 AI 내비게이션 시스템이 움직일 수 있는 영역이 표시된다.

녹색으로 표시 된 사각 범위.

크기를 키우려면 스케일 값을 키우거나 브러시 세팅 값을 키우면 된다.

X 30000, Y 30000으로 변경하여 전 범위로 설정했다.

다시 비헤이비어의 서비스로 돌아와서 GetRandomLocationNavigableRadius 노드를 생성하고 연결한다.

위 노드는 내비게이션 시스템 안에 있어야만 정상적으로 동작이 가능하다.

GetRandomLocationNavigableRadius 노드의 Return Value는 아예 갈 수 없는 영역일 경우 False가 출력된다.

Branch 노드를 이용하여 Return Value 값이 참일 때(갈수 있는 영역일 때) 블랙보의 벡터 값을 랜덤한 벡터값으로 설정해준다.

실행이 됐을 때 랜덤한 포지션으로 가도록 구현한 것이다.(한번 실행)

하지만 랜덤한 포지션으로 이동한 후 또 랜덤한 포지션으로 이동하도록 해야한다.

 

함수 오버라이드 - Receive Tick을 생성하고 AI가 랜덤한 포지션으로 도착 했는지 판단한다.

블랙보드의 TargetPosition과 Actor Location의 거리가 10 미만인지 판단하는 것이다.

거리가 10 미만이면 다시 랜덤한 포지션으로 이동하도록 구현한다.(위에서 구현해놓은 노드를 복사하면됨.)

비헤이비어 트리의 BTD_IsNearPlayer(플레이어 캐릭터가 AI의 인식 범위안에 있는지)가 참이면 왼쪽이 실행(플레이어를 쫓아감), 거짓이면 오른쪽이 실행(AI가 랜덤한 포지션을 설정하여 이동함)이 된다. 실행 완료 후 다시 Root부터 실행된다.

셀렉터는 왼쪽에서부터 실행이 되어 왼쪽의 데코레이터가 참이면 왼쪽이 실행, 거짓이면 오른쪽이 실행하게 된다.