초보 코린이의 성장 일지

UE4 비헤이비어 트리 (Behavior Tree) AI 감지, 탐색 (Patrol), 무기 장착 (Equip) 본문

언리얼

UE4 비헤이비어 트리 (Behavior Tree) AI 감지, 탐색 (Patrol), 무기 장착 (Equip)

코오린이 2023. 2. 22. 14:58

순찰 경로를 돌면서 탐색하는 Enemy들은 이제 Component를 가져서 상황에 맞게끔 행동하도록 만들어 볼 것이다.

1. 컴포넌트랑 Actor을 각 한개씩 생성해준다.

TextRender 설정값

1. 컴포넌트 추가해서 Spline와 TextRender 추가

2. Spline은 말그대로 곡면선을 그린다는 것이다. 2가지 방법이있는데 베지에 곡선과 캣멀롬이 있다. 

 

배지에 곡선 - 포물선 같은 곡선을 그리는 것

캣멀론 - 자동차 레이싱 트랙에있는 울타리를 생각하면 된다.

 

Construction Script

1. Construction Script 많이들 봤을 것이다. 하지만 무슨 용도로 사용하는지는 잘 모를 수도 있고, 글쓴이도 사용을 처음해본다.

2. 블루프린트에서는 생성자라고 생각하면 된다. 어디에 배치나 생성되거나 맴버에 값이 바뀔때 호출 된다.

3. 속해있는 객체에 Name를 받아서 만들어 놓은 Text에 띄어준다.

4. 루프가 실행되도록 연결해준다.

 

1. 만든 PartrolPath를 맵에 올려 놓고 클릭 후 늘리면 선이 하나 생기게 된다.

2. 늘리고 나면 중간에 지점이 하나 생기는데 그걸 눌러서 포인트 복제를 누르면 다른 곳으로 또 선을 이을 수 있다.

3. 그 상태로 방향을 틀어서 곡선을 만들어 줄 수 있는데 이걸 배지에 곡선이라고 부른다.

4. 사용하는 이유는 나중에 AI가 이 곡선에 포인트 지점을 따라서 움직이게 만들것이기 때문이다.

1. 사용할 함수 및 변수 추가

Index = 몇 번째 포인트를 갈건지, 혹은 가고 있냐를 나타내기 위해

Reverse = 정방향으로 돌껀지 역방향으로 돌껀지 판단

AcceptanceRadius = 얼마만큼을 도달했으면 도착으로 간주할 건지 판단 

Is Valid Path

1. 리턴용으로 Path가 Null이 아닌지만 판단해준다.

Get Move To

1. 이동할 지점을 구해주기 위한 함수

2. false라면 그냥 retrun으로 끝낸다

3. true라면 해당 Index번호를 받아서 리턴 시켜준다. Local로 설정되어있으면, 제어점이 만약 0번이면 0이고, 1번이면 0번부터 1번까지 떨어진 거리가 나온다. 그래서 World로 지정해줘야한다.

 

Update Next Index

1. Null인지 체크 후 Spline Points로 포인트에 갯수를 리턴받아준다. 그리고 Count에 저장해준다.

2. Recerse가 false면 정방향이고, true면 역방향이된다. 

3. 정방향이고, index가 작다면 index가 1씩 증가해 가면 된다. 그 중에 false이고 Loop라면 index를 0으로 세팅해주면 된다.

4. 또 Loop가 아니라면, 방향도 뒤집어지고 역방향으로 가야하므로, index는 count에서 -2뺀 번호가 들어와야한다. 그 이유는 포인트 0, 1, 2, 3 갔다가 2번으로 다시 와야하므로 2를 뺴줘야 한다. 1을 빼주면 그 자리 그대로가 되기 때문에

5. Reverse를 체크해서 반대로 뒤집어준다.

6. 역방향이고 true라면, index가 0보다 크다면 index가 줄어가야 하므로 1씩 빼준다.

7. Loop라면, 역방향일때 3, 2, 1, 0으로 가므로 Count에 -1 을 주고 index에 세팅해주면된다.

8. Loop가 아니라면, 3, 2, 1, 0으로 왔으므로 1번으로 가야한다. 그리고 Reveres를 체크 풀어서 뒤집어 주면된다.

 

 

1. PartrolComponent를 추가해준다.

2. 다시 맵에 있는 AI를 선택해서 추가된 컴포넌트를 클릭 -> 세팅에 Path를 지정해준다.

 

1. 사용할 함수 및 변수 추가

Drawing

1. Draw Debug가 true라면 AI가 위치를 그릴수 있도록 설정.

 

Receive Execute AI 이벤트 앞 부분
Receive Execute AI 이벤트 뒷 부분

1. Component by Class로 Patrol Component가 있는지 확인부터 해준다.

2. Null이 아니고 Get Move To가 true라면 위치를 얻은 것이므로, Location에 세팅해주면 된다. 그리고 Drawing 콜해준다.

3. 2. 만일 Null이고,  Get Move To안에 Valid Path가 들어있다. 이것 또한 실패라면 위치를 구할 수 없으므로, 갈 곳이 없게된다, 이 랜덤으로 움직이도록 false로 이어준다.

4. 그리고 동일하게 AI가 움직이면서 지점을 그려야하므로 똑같이 연결 후 Location 세팅해주고, 끝낸다.

 

Receive Tick AI 이벤트

1. 원래 있는 Tick에서 Component에 Patrol을 찾아주면 된다.

2. 그럼 도착해 있을때 결과가 바뀌게 될 것이다.

3. Patrol이 없다면, 그냥 끝내고 다시 랜덤한 위치를 구하면 된다.

4. Patrol이 있다면 다음 지점으로 갈 수 있게 갱신시켜주고 끝내야 다음번호로 가게 될 것이다.

1. 위에 결과로 AI가 만들어 놓은 곡선 Point 지점을 따라 천천히 돌게 된다.

 

1. PatrolComponent에서 index를 1부터 시작하고 역방향으로 돌게 한다면, AI가 1번으로 갔다가 다시 0번 지점으로 돌아가게 된다.

 

1. 동일하게 AI를 하나 더 만들어 왼쪽에 두고, BP_PatroPath를 한개 더 맵에 올려 놓는다.

2. 그리고 동일하게 곡선 Point를 만들어 주고, 저 지점에 따라 가도록 해줄 것이다.

3. 설정에 Path는 화면에 올라가있는 2번째껄로 교체해주고, index 0번부터 가도록 설정하였다.

4. 천천히 포인트 지점을 따라 움직이고 마지막 Point까지 가면 다시 역순으로 돌아올 것이다.

 

1. AI 하나를 더 만들어서 Patrol를 아에 지정안해주고 꺼버린다면, 랜덤으로 돌아다니는 모습을 보게 될 것이다.

 

BT_Melee 오른쪽 Action 추가한 상태

1. 이제 AI들도 무기를 뽑도록 만들어 볼 것이다.

2. 무기를 뽑기 위한 Euqip 상태를 넣어준다.

 

1. AI Enemy들이 사용 할 수 있는 무기 숫자를 Player 꺼와 동일하게 맞춰준다. 그래서 배열을 늘려주고,  2번에 Sword를 지정해 준다.

 

1. 이미 세팅이 완료된 구조를 가지고 있기 때문에, AI들이 자연스럽게 칼을 장착하고 있는 모습을 볼 수 있다.

2. 이제는 돌아다니다가 Player를 발견하면 Action에 들어가면서 칼을 뽑도록 만들어 볼 것이다.

1. BTTask_Equip에서 Type를 불러서 사용해야 한다. 

2. 불러올 방법을 만들기 위해 return 함수로 하나 만들어서 가져올 것이다.

 

1. 블루프린트 클래스로 BTTask를 지정해서 생성해준다.

2. 사용 할 변수 추가

Receive Execute AI 이벤트

1. WeaponComponent가 있는지 확인해주고, Null인지 체크해준다.

2. 없으면 바로 행동을 할 수 없으므로 바로 종료시킨다.

3. 가져온 함수 Type과 지금 Type가 같다면, 이미 해당 무기가 장착이 되어있다는 뜻이므로 종료 시킨다.

4. false라면 Switch를 통해 받은 Type 배열로 각 무기모드를 장착하도록 만들어 준다.

5. 결국 장착이 되어야지만 Melee에 테스크를 나갈 수 있게 된다. 그래서 Tick이벤트가 필요하다.

Receive Tick AI

1. Weapon에 End_Equip를 보면 In Equipping로 장착 했나 안했나를 확인했었다. 이걸 가지고 판단할 것이다.

2. WeaponComponent로 무기를 장착했는지와 StateComponent로 Idle모드 일때를 확인해 줘야 한다.

3. Equipping가 아니고, Idle모드라면 성공이므로, 끝내준다.

1. 오른쪽 Action 만들어 준 곳 테스크 Equip를 연결해준다. 

2. Equip에서 장착하고 나중에 Action을 추가해서 실행 해 줄 것이다.

3. 시퀀스이기 때문에 무기가 없다면, 자연스럽게 동작을 안하게 될 것이다.

 

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

 

 

 

 

 

Comments