[unrealengine4]

2023-07-07 언리얼(AI(비헤이비어 트리))

롤링페이퍼 2023. 7. 11. 08:33

AI 만들어 보기

 

비헤이비어 트리

비헤이비어 트리 생성 방법

 

Root

 

비헤이비어 트리 내부에는 Root 노드 하나가 기본적으로 있다.

이름 그대로 트리 구조의 형태를 띄우고 있으며, 그 밑의 자식 수에 관한 제한은 없다.

비헤이비어 트리에서 우클릭 시 Composites와 Tasks가 있다.


Composites(조합/합성)

Tasks를 자식 노드로 묶어놓을 수 있으며 다음 루트로 넘어가는 것은 무조건 Composites로 거처 넘어가게 된다.

 

기본으로 Selector / Sequence / Simple parallel 3가지가 있다.

 

Selector 

- 자식 노드가 왼쪽에서 오른쪽 순으로 실행이 된다.

- 모든 자식 노드 중 하나라도 성공한다면 Selector도 성공으로 인식한다.(OR : 성공 즉시 돌아온다)

- 실행 중인 자식노드가 실패하면 다음 노드로 넘어가게 된다.

- 만약 현재 자식 노드가 성공하면 나머지 노드들은 실행하지 않는다.

 

Sequence 

- 현재 실행 중인 자식노드 성공 시, 다음 노드를 실행한다.

- 현재 실행 중인 자식노드 실패 시, 다음 노드들은 실행하지 않고 끝낸다.

- 모든 자식노드가 성공을 해야 Sequence도 성공으로 간주한다.(AND : 실패 즉시 돌아온다)

 

Simple parallel(평행/병렬)

- 자식노드 두 개를 붙일 수 있다(보라색 : Main task / 검은색 : Sub task)

- FinishMode : Main task 종료 이후의 행동한다. (Immediate : 즉시 종료 / Delayed : Sub task 기다림)


Tasks(작업/업무)

Wait : 지정한 시간만큼 대기를 한다 (Wait TIme : 대기 시간 / Random Deviation : 랜덤 편차)

 

Play Animation

- Animation to Play : 재생하고자 하는 애니메이션 지정

- 해당 애니메이션의 재생이 끝나고 다음으로 노드로 넘어간다.

 

Move to

- 목적지를 정해주어야 한다.

- Acceptable Radius : 도착 좌표의 반경 지정값 이내로 들어오면 성공한다.

- Blackboard Key : 블랙보드 키를 지정한다. (기본 SelfActor)


비헤이비어 트리 사용해 보기

비헤이비어 트리 순서 특징

각 노드 우측 상단에 보면 숫자들이 있을 것이다. 이 것은 노드의 실행 순서를 나타내는 것이다.

비헤이비어 트리는 전위순회 방식으로 실행이 되며 노드의 위치에 따라 순서가 바꿔질 수 있다.

-1 표시된 노드는 연결이 되어있지 않기에 실행되지 않는 것을 의미하는 뜻이다.

 


Play Animation 사용해 보기

 

Play Animation 비헤이비어 트리

Sequence를 통해 Wait - Play Animation 순으로 실행이 계속 반복될 것이며, Wait에서 2.5초 +- 0.5초 있다가 PlayAnimation에서 attack_1 애니메이션 시퀀스를 재생하게 될 것이다.

 

이후 BP_Enemy의 이벤트 그래프에서 BT_Example(비헤이비어 트리)를 적용해 본다.

시작 시 바로 실행시킬 수 있게 BeginPlay이벤트에서 AiController를 받아와 Run Behavior Tree 노드로 특정 비헤이비어 트리를 재생시키도록 한다.

따라서 Behavior Tree 변수를 만든 뒤, 기본값으로 BT_Example을 넣고 Run Behavior Tree에 연결시켜 주면 된다.

BP_Enemy의 이벤트그래프 BeginPlay이벤트


블랙보드 데이터 에셋(Black Board)

 

비헤이비어 트리에서 Move To task에 목적지를 주기 위해서 블랙보드를 사용하게 된다.

블랙보드 클릭 후 적용할 BT_Example(비헤이비어 트리) 선택 후 이름을 BB_Example로 변경해 저장하도록 한다.

저장하면 블랙보드 기능이 활성화되는 것 을 확인할 수 있다.

블랙보드 탭의 화면

기본으로 SelfActor 변수가 만들어져 있으며, 이 변수는 비헤이비어 트리를 실행하게 되는 Pawn을 말하게 된다.

 

새 키를 클릭해 Vector 변수를 추가해 주자.

이름은 Destination으로 사용하고 목적지를 담을 변수로 사용할 것이다.

새로 만든 Destination의 디테일을 보면 Entry Name(이름), Entry Description(주석), Key Type(유형)이 있다.

- Instance Synced : 이 블랙보드를 사용하는 모든 대상이 해당 키를 사용할 수 있다.

- Parent : 이미 만들어져 있는 블랙보드를 현재 블랙보드가 상속받는다.


서비스 노드 블루프린트

이제 Ai들을 랜덤으로 이동시켜 보자

 

이번엔 블랙보드의 Destination 키에 값을 넣어주기 위해 서비스를 사용해 보자.

새 서비스를 생성한다.(이름은 : BTS_SetDestination)

서비스 노드를 새로 만들면 클래스 디폴트에 기본으로 뭐가 있는지 확인한다.

서비스 노드의 클래스 디폴트

- Interval : 이 서비스를 수행할 간격

- Random deviation : 랜덤 편차

 

오버라이드 가능한 함수들이 여러 개 있다.

크게 Activation / Deactivation / Search Start / Tick 4가지로 나누어져 있으며, 여기서 BP_Enemy에 활용할 것 이기 때문에 AI문구가 추가되어 있는 것 을 사용하면 된다.

BTS_SetDestination의 오버라이드 가능한 함수

오버라이브로 Receive Activation Ai 이벤트를 추가한다.


이후 비헤이비어 트리로 돌아가 Move To의 서비스 추가를 들어가면 방금 추가한 BTS Set Destination(서비스 노드 블루프린트)를 확인할 수 있다.

노드를 추가한 뒤 Destination의 키값을 Destination으로 선택한다.

그 후 실행순서를 보면 BTS가 2번째로 실행하며 그 후 Move To가 3번째로 실행하는 것을 확인할 수 있다.

 

BTS_GetDestination에 변수 추가

이후 BTS_SetDestination로 돌아가 생성되어 있는 변수 DestinationKey를 인스턴스 편집가능을 true로 한 후 get으로 가져와 set Blackboard Value as Vector노드의 키로 추가한다.

value x, y, z을 핀 분할 시켜 Random Float in Range노드를 추가해 Min : -1000 / Max : 1000으로 설정 후 x, y에 연결한다.

value z는 100으로 지정한다.

 

Min : -1000 / Max : 1000 인 이유는 사용하는 map크기가 -1000~1000이기 때문이다.


- Owner Controller : 해당 소유의 컨트롤러

- Controlled Pawn : Owner Controller의 의해 제어될 오브젝트

 


이후 First에서 액터 배치로 - 볼륨 - 내비 메시 바운드 볼륨을 화면에 배치 후 

스케일 값을 조정한다

내비 메시 바운드 볼륨의 스케일

네비 메시 바운드 볼륨을 클릭 후 'p'키를 누르면 지정된 영역을 알려준다.

이후 Ai들은 이 지정된 영역기준으로 움직이게 될 것이다.


과제 : AI가 목표 지점까지 도착 후 백스탭 하도록 만들어보기

추가한 BTT_dodge의 이벤트그래프에

이벤트 Receive Execute Ai 이벤트를 추가 후 Dodge를 메시지로 추가한 뒤 Finish Execute로 마무리하도록 한다.

성공 시 boolen은 참으로 설정.

이후 비헤이비어 트리에서 Move to 다음으로 BTT_dodge로 연결시킨다.

 

과제하다 확인한 것 인데 캐릭터인터페이스에서 dodge 함수를 dadge라고 설정한거 같다. 차후에 수정...