초보 코린이의 성장 일지

UE4 비헤이비어 트리 (Behavior Tree) AI 근접 공격 및 원거리 공격 본문

언리얼

UE4 비헤이비어 트리 (Behavior Tree) AI 근접 공격 및 원거리 공격

코오린이 2023. 2. 23. 14:36

1. Equip를 복사해서 이름만 Action으로 변경 후 노드를 수정해 보겠다.

 

BTTask_Action 이벤트그래프

1. 이미 무기는 손에 쥐어진 상태이므로, 액션만 취해주면 된다.

2. 액션 중이면 끝내면 된다.

3. 비헤이비어 트리에서 시퀀스로 노드를 이었기 때문에 Null이라면 넘어가면 안되므로 실패로 끊어버린다.

 

BTTask_Action 이벤트그래프

1. 액션을 시작하면 Begin_DoAction이 실행되면 In Action이 활성화 된다. 그리고 액션이 끝나면 End_DoAction에서 InAction을 비활성화 시켜준다.

2. 그러므로, 조건에 InAction이 아니면으로 넘겨주면 된다.

BT_Melee 오른쪽 Action 추가

1. 행동을 실행하기 위해 위에서 만든 BTTask_Action을 오른쪽 끝 Action 시퀀스 아래에 추가해주고, 이름 변경

2. 그럼 실행이 되면 AI가 와서 공격을 하게 된다. 하지만 여기서 플레이어가 한대라도 Hit를 시킨다면 AI는 다시 액션으로 못돌아오므로 멈춰버린다. 그래서 노티파이로 Hit 처리를 해주고 돌려주는 기능을 수행할 것이다.

 

1. Character로 캐스팅해서 맞는지 확인해준다. AIControlled를 가져와야 하므로 캐릭터로 가져왔다.

2. 맞았다면 우선 Idle로 돌아가야 다시 Action으로 들어갈 수 있다.

3. AIController와 Blackboard를 Null 체크해주고, 둘다 없다면 그냥 끝내주면된다.

4. 둘다 존재한다면, Value Enum 실행 시켜주고, 이름과, 동작 타입을 정해준다.

5. 둘다 리턴으로 넘겨준다.

 

1. State안에서 이벤트 바인딩으로 하나 불러준다. 이름은 부모의 같은 이벤가 존재해서 AI를 뒤에 붙여서 생성해준다.

2. 새롭게 들어오는 행동이 무엇인지 스위치로 확인해주고, Controller에서 Blackboard를 불러서 값을 넣어준다.

3. 이름도 맞는지 확인해주고, 행동은 Hitted로 등록해준다. 이제 맞았을때 Hitted로 들어간다

 

BTTask_Hitted 이벤트그래프

1. Hitted 조건을 빼주기 위해 생성해준다.

2. 맞으면 그냥 멈춰주면 된다.

3. Hit가 완료됐다는 조건은 무엇이 될까? Enum 타입에서 Hitted가 아니라면 그 행동은 이미 무엇인가를 하고 있다는 뜻이된다. 그럼 결국 Hit가 끝이났다는 표시가 된다. 

1. 이제 Hitted를 세팅해줘야한다 여기서 중요한 내용이 있다.

2. Euqip 중에 맞는 순간 Hitted로 바뀌게 된다. 그러면서 Service_Melee가 중단되버린다.

그러면 다시 아래로 들어 갈 수가 없게된다. 그래서 방법이 Hitted는 행동중에 취소할수 있는 방법이 없다. Service에 들어오지 못하도록 옆으로 따로 빼서 Hit시에만 적용되도록 하여 행동이 끝나면 return시키고 다시 아래로 내려올 수 있게 만들어 줘야한다.

3. 루트 아래에서 따로 빼서 추가

4. 관찰자는 None로 하는건 위에도 언급했듯이 행동에서 중단되는게 없다.

 

1. 아까 만들어준 Hit 노티파이를 AI가 맞는 모션이 나오는 몽타주에 추가해준다.

2. Fist에도 추가해준 이유는 만일 다른 무기에서 맞는 몽타주 Hit 모션이 다르다면, 동일하게 Hit 노티파이를 추가해줘야 하기 때문에 예를 들기위해서 올려놓은 것이다.

 

 

Begin_Action을 시키고 End_Action으로 마무리가 되는게 정상적으로 돌아가고 있는 상태이다

하지만 만일 Ai가 Equip중에 맞는다면 Hit가 Begin_Action과 End_Action 중간에 들어가서 인식되므로, 완료 안되버리고 넘어가게 된다. 이러면 트리에서 해동 인식에 문제가 발생하여 AI 행동에 오류가 생긴다 왜냐면 다시 Action으로 돌아갈 방법이 없기 때문이다. 이걸 해결해야한다.

 

 

BTTask_Equip 이벤트그래프

1. Equip 중에 체크를 해줘야한다.

2. Weapon가 Null인지 확인을 해준다.

3. Weapon에 Equip, Begin_Equip, End_Equip가 있다. Equip 들어가면 Begin_Equip에 In Equipping가 true가 된다.

결국 Equipping이 true라면 End로 가면되고, false라면 Begin_Equip로 들어가면된다. 어차피 End_Equip에서 전부다 돌려주기 때문이다.

4. Finish Abort는 특정한 상황에 중단되고 이런게 아에없이 그냥 무조건 중단되어 버린다.

  

 

BTTask_Action 이벤트그래프

1. BTTask_Equip에 있는 Abort Ai를 그대로 가져와서 Weapon에 있는 조건을 In Action으로 변경해주면 된다.

2. Action에서도 Equip와 동일하게 조건 들어갔다 풀렸다 하게된다. 그래서 동일하게 넣어준 것이다.

 

이제 원거리 공격이 나가도록 만들어 볼 것이다.

1. 어차피 같은 기능에 원거리 공격만 추가하게 되므로, 이미 만들어 놓은걸 복사해서 이름만 Range로 변경해준다.

안에 내부는 이제 수정해 볼 것이다.

 

1. 감지범위 Lose Sight Radius를 Sight Radius와 동일한 수치로 만들어주면, 감지 범위 벗어나는 순간 바로 실행된다.

2. HalfAngleDegrees은 시야각에 반시야각이므로, 어느방향에서 들어가든 감지하게 된다.

3. 최대수명은 1초를 줘서 바로 범위 밖으로 나오면 기능을 상실하도록 만들어 준다.

 

1. 둘다 Range로 변경해주면 된다.

BTService_Range 설정
Equip 설정

1. Key 둘다 Target, Behavior 변경, Interval은 0.1로 변경해준다.

2. Equip도 원거리 공격으로 변경

3. Patrol은 필요하면 넣어줘도 되는 선택사항이다. 원거리라 인식 범위가 클 수 있기때문에 일부로 뺐다.

4. 쫒아가는것도 원거리이므로, 그냥 없애고 공격과 무기를 뽑는것만 넣어준다.

 

 

1. Range로 형변환 해주고, Tick AI 컨트롤러를 Range로 바꿔준다.

 

 

Tick AI 앞 부분
Tick AI 뒷 부분

1. 복사해서 만들었기 때문에 노드에 연결은 동일하고 옵션들만 조금 변경될 것이다.

2. Null이 아니라면 SetFocus가 범위안에 들어오면 New Focus인 상대를 바라보게 만들어 주는 기능을 수행한다. 

3. Null이 라면 감지를 잃게 되었으므로, ClearFocus를 풀어준다.

4. AI에 AvoidDistance 범위 안에 플레이어가 들어오고 true라면 도망갈 것이고, 그게 아니라면 공격을 할 것이다.

 

 1. 이제 AI에 Weapon에 사용할 무기와 도망갈때 Warp를 사용하게 나중에 만들 것이므로, 설정해준다.

Weapon_FireBall 추가

1. AI가 이제 공격을 하지만 공격을 날릴때 문제가 생긴다. 카메라 방향이 정해져있지 않아 이상한 방향으로 날리게된다.

더군다나 제자리에 공격이 멈추게된다.

2. CameraComponent가 없으면, Direction이 없으므로, 결국에 들어갈 Veloctiy가 0이 되버리면서 나갈 수 가없다. 스피드 또한 0이 되므로 문제가 생긴다.

3. Character을 AI로 캐스팅해서 전방 방향에 Direction을 세팅해준다. 플레이어에 방향으로 세팅이 이미 끝나있기때문에 AI만 따로 주면 끝이난다.

 

 

EQS(Environment Query System) - 인바이런먼트 쿼리 시스템

- 만약 플레이어를 마주친 AI가 어느시점에서는 공격하고 플레이어를 피해서 도망가야할때 그 지점을 어떻게 판단할 수 있는가를 또 한 제일 안전한 곳으로 도망갈 수 있는 위치를 어떻게 설정할 것인가 유리한 위치가 어디인지 어떻게 선점할건지 공간을 정리해준다. 여러명에 AI가 있다면, 몇몇은 공격을 하고 몇몇은 도망가고 나머지는 주변을 돌아다니는 상황을 연출 할때 사용할 수 있다.

 

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

 

Comments