초보 코린이의 성장 일지

UE4 AI, 비헤이비어 트리(Behavior Tree) 본문

언리얼

UE4 AI, 비헤이비어 트리(Behavior Tree)

코오린이 2023. 2. 20. 12:49

이제 비헤이비어를 통해 Enemy를 다뤄보게 될 것이다. 

 

1. BP_Enemy 자손 블루프린트로 BP_Enemy_AI를 생성해준다.

 

1. Enemy가 공통적으로 가져야 할 Weapon, Moving 를 추가해준다.

2. 변수 BehaviorTree를 생성하고 변수유형 또 한 비헤이비어 트리로 바꿔준다.

1. AI를 선택하여 또 자손 블루프린트 클래스를 생성해준다.

2. Basic로 이름 설정

 

1. 실직적인 관리를 해줄 Controller를 생성해준다.

2. 이건 처음에 사용 방법을 배우는 용도로 사용해 볼 것이다.

 

BP_AIController_Basic

1. On Possess 빙의 되었을때 콜이 되는 이벤트

2. 비헤이비어 트리를 넣어놓은 Enemy_AI 로 형변환을 해주고, 저장해 놓는다.

3. Behavior Tree안에 Run Behavior Tree를 콜해주면 이 함수가 비헤이비어를 실행시켜주는 함수이다.

 

1. 만들어 놓은 Controller를 선택해준다.

2. Possess AI는 AI를 언제 빙의 시킬껀지를 설저해주는 설정란이다. Placed in World로 선택

 

Disabled = 사용자가 원할때 빙의 시킨다.

Placed in World = 월드에 배치되었을때

Spawned = 스판 되었을때

Placed in World or Spawned = 배치되었거나, 스판되었을때 둘중 하나

 

1. 이제 비헤이비어 트리를 생성해준다.

 

1. 생성해준 비헤이비어 트리 지정해준다.

BT_Basic

Selector = 성공하는 순간 끝이나서 리턴된다.

Sequence = 성공하면 계속 넘어가고 다음으로 넘어간다. 실패하면 다음으로 넘어가지 않는다.

Simple Parallel = 뭔가의 행동을 2가지를 사용해야 할 때 사용한다. ex) 움직이면서 누군가를 추적할때 

 

BT_Basic Sequence 실험

1. Wait는 무조건 성공이 뜬다.

2. 시퀀스로 연결되었기 때문에 3개의 Wait가 다 돌고 끝이나면 위로 올라가 리턴후 다시 재실행 반복

 

BT_Basic Selector 실험

1. 첫번째 Wait에서 무조건 실행이 되므로, 성공했기 때문에 바로 종료 후 리턴 된다.

BT_Basic 섞어서 사용

1. 내려오다가 Sequence 3개의 Wait 다 실행되서 성공 후

2. 옆에 Selector로 넘어가서 Wait 진입하면 성공 후 끝이난다.

 

BT_Basic 섞어서 사용

1. 만약 Selector로 실행 시킨다면, 오른쪽 Selector은 들어가지 못한다.

2. Sequence만 다 돌고 성공이므로, 올라가서 리턴 후 반복, 오른쪽 Selector은 들어가지 못한다.

 

BT_Basic 3개 섞어서 사용

1. 왼쪽 Sequence 3개 Wait를 다 돌고 리턴 후, Selector로 넘어간다

2. Selector에서 첫번째에서 성공이므로, 위로 올라가고 리턴 후 다시 오른쪽 Sequence로 이동

3. Sequence에서 2개 Wait를 돌면 위로 올라가서 리턴

4. 무조건 결과는 위로 다 올라간 후 넘겨주는 방법으로 돌아간다.

 

BT_Basic Simple Parallel 사용

1. Simple Parallel를 잘 보면은 행동이 2개 섞이게 된다.

2. 여기서 중요한건 시간을 정해준 걸 각자 보면 Simple Parallel 왼쪽 노드는 4초 오른쪽 시퀀스를 통한 노드는 1초, 1초이다

3. 이렇게 실행이 된다면, 2가지 동작을 실행하게 되므로, 4초가 진행되는 동안 시퀀스에 Wait가 각 1초씩 돌아서 2초를 사용하고 올라가서 결과 리턴 다시 내려와서 Wait 각 1초씩 또 돌고 2초 사용 후 올라가서 리턴하고 4초를 다 사용하고 끝이난다.

4. 만일 3초라고 가정하면 오른쪽 Wait 1초씩 2초 사용 후 올라가서 리턴하고 다시 내려와서 왼쪽 Wait 1초만 실행하고 끝이난다. 3초를 소모했기 때문

 

1. 컴포넌트 AIPerception을 추가해준다.

2. 비헤이비어 트리와 함께 AIPerception 또한 엄청 많은 중요한 기능들을 수행한다.

3. 지정해준 방향이나 범위 등등으로 객체를 감지 해준다. 

 

AI Damage sense config = 데미지를 받았을때 준 객체를 감지한다.

AI Hearing config = 사운드는 사용자한테 들린다. AI는 노이즈를 감지하여 객체를 찾아낸다.

AI Prediction sense config = 가다가 충돌체끼리 충돌되었을때 감지한다.

AI Sight config = 시야에 들어왔을때 감지

AI Team sense config = 팀끼리 감지하는것, 아군인지 적군인지 

AI Touch config = AI Prediction sense config과 너무 비슷해서 정확히 표현하기가 예매하다. 하지만 정의를 내려보자 Prediction은 블록끼리 연산이고, Touch은 오버랩 연산이라고 생각하면 편하다.

 

1. 시야로 감지하기 위해 Sight로 설정

2. Detect Enemies, Detect Friendlies 는 블루프린트 언리얼에서는 사용이 불가능하다. c++ 언리얼에서 다룰 수 있으며, 팀을 나눌때 사용된다. 중립으로 둘지 적으로 둘지를 결정하는데 여기선 사용할 일이 없으므로, 중립으로 체크한다.

3. 나중에 설정을 할수 있게 된다면, 중립은 표시가 안뜬다. 만약 적과 아군으로 설정을 했다면, 아군한테는 녹색, 적한테는 빨간색이 뜨게 된다.

 

Sight Radius = 감지 범위

Lose Sight Radius = 이 범위 넘어가면 감지 기능을 상실

PeripheralVisionHalfAngleDegrees = 시야 각도의 반, 45를 주면 90도 감지를 한다는 의미

Detect Neutrals = 중립만 감지

최대 수명 = 감지기능을 점차 상실해 갈때까지에 시간, 상실해서 넘어가도 5초 동안은 아직 감지를 하게된다.

Statrs Enabled = 처음부터 감지를 하게 만들지 선택

 

1. 눈으로 확인해 볼 수 있다. 우선 키보드 키 세미콜론 옆에 ' 키를 눌르면 디버깅 모드가 나온다.

2. 그리고 키보드 오른쪽에 있는 숫자 키패드 4번을 누르면, 범위 지정이 뜨고, 들어가면 AI가 감지하는 상태를 볼 수 있다.

3. 녹색이 감지를 하는 범위이고, 그 바로 또 둘러싸고 있는 핑크색 범위가 감지 기능을 상실하는 범위이며, Enemy가 바라보는 각도가 감지 범위를 나타낸다.

 

1. 블랙 보드를 생성해준다. 

2. 비헤이비어 트리만 사용하는 변수 목록이 따로있고 비헤이비어 트리가 목록 하나를 가지게 된다.

3. 그래서 앞으로 AI가 사용할 변수목록이다.

4. 모든 오브젝트들은 Object로 부터 상속받으므로, 플레이어를 찾을 Actor이 없어서 Object로 찾아준다.

5. 오른쪽 설정란에서 이름을 변경해주고, Key Type를 선택해준다. Key가 선택되지 않으면 사용할 수 없다.

6. 블랙보드를 공용으로 사용하게 되면, 하나의 객체가 감지하거나 동작을 해도 다른 공유하고 있는 다를 객체 또한 똑같이 감지하여 움직이는걸 볼 수 있다.

Move To 설정
Blackboard based 설정

1. 시퀀스를 생성

2. Move To를 보면 Radius가 있는데 이 반경안에 들어가 있으면, 그 곳까지 갔다고 간주하는 범위이다. (Allow Strafe는 옆걸음질을 할때 나중에 사용한다.)

3. 갈수 있으면 성공, 없으면 실패를 나타낸다.

4. 시퀀스를 눌러서 데코레이터를 추가해 줄 수 있는데, 그 많은 조건 중 Blackboard를 선택해준다.

5. 데코레이터는 조건을 줘서 조건이 맞지 않다면 아에 실행조차 안하도록 조건을 제어하는 역할을 해준다.

6. Blackboard Key에 Target로 Target이 있으면 실행 없으면 중단한다. 실행 중에도 조건이 바뀌면 중단된다.

BP_AIController_Basic 함수

 

BP_AIController_Basic Perception 함수 내용

함수 생성

1. Get Currently로 현재 순간에 감지되는 객체 목록을 나타낸다. 클래스 NULL이기 떄문에 어떤 객체든 감지가 된다.

2. 플레이어만 찾을 거니까 형변환을 해준다.

3. Get Blackborad를 사용하면, 연결되어있는 블랙보드를 가져오게 된다.

4. Key Name에 연결해줄 이름은 Target로 지정, 그리고 세팅 끝났으면 return 시킨다.

5. 중간에 반환형이 안되어 있다면, 감지 된게 없다는 의미이므로, 에셋 선택을 비워둬서 종료시킨다.

 

1. 이벤트를 사용해 볼 것이다. On Perception Updated를 선택

2. 감지되는 순간 콜이되며, 배열은 계속 감지 될수록 누적되서 들어온다. 그래서 사용을 잘 하지 않는다.

 

 

1. 내비 메시 바운드 범위를 크게 넓혀서 지정

2. 큐브를 올려보면 색이 다른걸 볼 수 있다. 이 부분은 감지가 안된다는걸 나타낸다.

1. 만들어 놓은 Move로 설정해준다.

2. 실행해보면 Enemy가 감지 되는 순간 쫒아오고, 내비 메시 바운드에서는 감지를 못하고 멈추게 된다.

 

BP_Enemy_AI_Melee 설정

1. 원래 있던 2개를 복사해서 따로 사용하게끔 이름만 Melee로 변경시켜준다.

2. BP_Enemy_AI_Melee 설정에서 Tree는 Move로 변경시켜주고, Controller Class는 Melee로 변경시켜준다.

1. 비에이비어 트리 Melee로 하나 더 생성해준다. Service도 생성해준다.

2. Service는 어떤 상태인지를 지정해 줄 수 있다.

3. 시간을 지정해줌으로써 상태 변경을 자유자제로 변경해 줄 수 있다.

 

 

https://www.youtube.com/watch?v=ExWmxSFtHdk 

 

- 비헤이비어 트리 엄청 어렵다.

 

Comments