초보 코린이의 성장 일지

UE4 비헤이비어 트리 (Behavior Tree) AI EQS 텔레포트 본문

언리얼

UE4 비헤이비어 트리 (Behavior Tree) AI EQS 텔레포트

코오린이 2023. 2. 24. 16:59

AI 마지막 EQS를 다뤄볼 것이다.

1. Melee를 복사하여 이름을 EQ로 변경해주고 시작해 보겠다.

1. Behavior Tree와 Class 둘다 EQ로 설정해준다.

1. 인바이런먼트 생성해준다.

2. 블랙보드에 사용할 Key도 하나 생성해 줘야한다.

 

EQS가 return해주는 값에 유형은 vector이거나 actor 두개다 

vector이면 필요한 위치를 return 해주고, actor면 필요한 공간에서 actor를 return 해준다.

 

 

1. 위치만 다루게 될거라 vector만 추가해준다.

2. vector은 타입이 확정적으로 되어있기 때문에 설정이 따로 필요하지 않다.

1. Blackboard Key는 공간에 지시를 내렸을때 return되는 Key값이므로, 만들어준 EQ_Location으로 선택해준다.

 

1. Grid로 다양하게 다뤄 볼 것이다.

2. Size를 1000으로 지정하면 상하좌우 전부 해당되므로 2000x2000 맵에 item들이 100단위로 깔리게 된다는 의미이다. 그렇게되면서 동그란 item들이 생기게 된다.

3. 그 중에 가장 큰 값중 하나를 선택해서 알려주게 된다.

4. 이제 이 테스크 중에 합산 점수가 누적되면서 가장 높은걸 return 받게 된다.

1. Distance를 추가해준다.

2. 점수를 매겨야 하므로, Score Only로 변경해준다. 간격은 2D로 평면을 다뤄볼 것이다. 

3. 점수는 가장 가까운 거리가 0, 먼 거리가 1로 나오게 된다.

 

1. 거리상에서 어떠한 범위 이상은 판단하고 싶지 않을때 잘라낼 수도 있다. 그럴때는 Filter and Score를 설정해주면 된다.

2. Filter Type에 Range는 범위로 잘라내는 것이며, 범위 안에 점수만 나오게된다.

3. Minimum으로 설정하게 되면, 실제적인 값을 주게 되므로, 정해준 값이 그 이하라면 잘라낸다는 뜻이다.

4. 파란색 범위는 실제 거리는 연산하지만, 점수는 매기지 않는다 필터링 되었기 때문

 

1. 이번에는 먼 곳을 0으로해서 가까운 곳을 5로해서 5까지 찾게 만들고 싶다면. Scoring Equation을 Inverse Linear로 변경해주고, Factor은 5로 설정해주면 된다.

2. 위에 그림에도 보이듯이 가장 먼 지점이 0이되고, 가장 가까운 지점에 300까지는 잘려있고 그 중에 하나가 연두색으로 선택되어있게 된다.

Random number 사용

1. HalfSize에 보면 값이 매길수 있는 곳에 데이터 바인딩이 붙어있다. 만일 변수로 숫자를 주게 하려면 Query Params를 사용하면되고, Random number은 내부에서 사이에 숫자 값을 랜덤으로 만들어서 파라미터에게 넘겨주면 값이 들어온다. 

2. Random number은 사용하면 위에 그림처럼 처음에 나오고 랜덤으로 범위가 바뀌면서 모양이 나타난다.

Absolute Value 체크 해줘야함

1. 이번에는 내적인 Dot를 사용해 볼 것이다.

2. 내적을 하려면 기본적으로 vector가 2개가 필요하게 된다. 하지만 여기서는 Location이 전방 vector를 나타낸다. 그로인해 item과 내적을 할 수 있게 된다.

3. 내적에 범위는 -1, 0, 1이지만 위를 보면 정면은 1이 뜨고 좌우는 0.5가 뜬다. 여기서 내적은 뒤가 0, 앞을 1로 쓴다. 만일 abs를 체크해서 사용하게 된다면 앞뒤가 1이되고, 좌우가 0이 된다.

4. 값을 차감해서 음수도 만들수도있다.

 

Absolute Value 체크 해줘야함

1. Score로 바꿔주고, Filter를 Min으로 설정 후 0.3 값을 줘보겠다.

2. 0.3 이내에 각도는 다 파란색 부분으로 잘렸다고 보면된다. 그렇게 되면 저 공간은 판단하지 않게 된다.

Absolute Value 체크 해줘야함

1. 하나를 더 복사 후 위에꺼는 Fliter and Score를 사용하고 아래꺼는 Score Only를 사용해한다면, 둘다 최대값이 1이된다 그럼 가장 정면에 있는 숫자가 누적되서 2가 된다.

1. 점수도 2배도 만들고 싶고, 잘라내는것도 만들고 싶다면 2번째에서 Maximum을 설정해주고, 실제로 나올값이 0 ~ 1까지 이므로 실질적인 값을 줘야한다 그래서 0.75를 넣어준다면 2배가 되는 값 1.5를 넘는 값들이 짤리게 된다. 조금 오차 범위는 날 수 있다.

 

1. Trace를 사용해 보겠다. Trace는 블럭연산으로 여기서는 Overlap과 비슷하다. 

2. 어떠한 벽이 앞에 막혀있다고 가정했을때, Trace를 날려도 결국 벽뒤는 판단할 수 없게된다. 그럼 벽뒤는 숨을 수 있는 공간으로 1로 나오게되고, Trace에 걸리게 되는 모든 부분은 0으로 나오게 된다.

 

1. Factor에 1을 주고, Bool일치를 꺼주게 되면, 역으로 뒤집혀서 보이지 않는 공간이 0이되고 보이는 공간이 1이 된다.

 

1. Distance 추가 후 Min으로 설정하고 300값을 넣어준다.

2. Dot 추가 후 Abs 켜주고 2D로 변경해주면, 정면에 있고 가장 먼 지점이 2가 된다. 

3. Min 0.3을 주고 Inverse Linear로 뒤집어 주면, 앞뒤가 1이였던게 좌우가 1로 바뀌게 되고, 좌우에서 가장 먼 곳이 2로 나오게 될 것이다.

4. Trace를 추가해준다. 보여지지 않는 곳이 1이였고, 좌우에서 가장 먼 곳이며 보여지지 않는 곳이 3으로 나오게 될 것이다. 연두색부분이 가장 높은 숫자이다.

 

1. 위치를 구했으면 Move To로 가고, 블랙보드 키를 EQ_Location으로 설정해줘서 return 받아준다.

2. 이렇게 실행하면, AI가 뛰다가 3초 후에 다시 가려는 위치를 구해서 뛰어간다.

 

 

플레이어를 기준(중심)으로 위치를 구하고, 플레이어 뒤쪽 방향에 상위 25프로 지점을 랜덤으로 선택해서 그 지점으로 이동하게 만들어 볼 것이다. 공간 조차도 플레이어를 기준으로 한다.

 

1. Blackboard를 불러서 Object를 불러서 이름을 지정해준다.

2. 그리고 object기 때문에 actor 형변환 후 return 해준다.

 

Actors Set = actor를 여러개 주는 경우

Locations Set = item들이 결국 이 함수를 통해서 위치를 계산해서 나온 것이다.

Single Actor = actor을 하나 줄것, 플레이어에 하나 줄 것이기 때문에 적용. 

Single Location = 위치를 기준으로 적용

 

1. Mode를 Two Points 해주면 방향을 만들 수 있다.

2. Line To에서도 Query item 선택해서 방향을 만들어 줄 수 있다.

3. Line B에 Line To에 Query로 부터 Play 방향을 지정해준다.

4. Play가 서있는 위치가 무조건 1이 된다.

 

Item from Best 5% = 상위 5프로 내에서 랜덤

Item from Best 25% = 상위 25프로 내에서 랜덤

All Matching = 매칭되는거 전부다 return이면서 배열로 받아줘야 한다.

 

1. 25프로 내에서 계속 랜덤으로 연두색이 이동하면서 바뀌게 된다.

 

 

1. Circle로 만들어준다.

2. Data Blnding은 Random number로 설정, 랜덤 범위는 800 ~ 1200사이로 지정

3. Space Between은 원을 그릴때 아이템 간격, Points은 개수를 이용해서 간격 계산하라는 명령

4. Angle는 말 그대로 몇도를 만들 것인지, 중심은 플레이어 중심.

5. Dot도 동일하게 지정

6. 적이 정면에 있을떄 1에 가깝게 나올 것이다. 하지만 우린 후방을 구해야 하므로, Inverse로 뒤집어준다. 후방에 값이 뜨게 된다.

 

오른쪽 아래 Warp 추가

1. 오른쪽 Avoid만 추가해준 상태이다

2. Equip는 Warp로 지정해주고, Run EQS는 도망갈 위치를 구할 것이다.

3. 네비게이션 Mesh 안에서 공간 지정되는 것이다.

 

 

1. 이제 Warp 액션을 취하게끔 마지막에 Action을 추가해준다.

 

MoveToLocation

 1. 위치에서 Character가 바라보는 위치로 가게끔 만들어줬다.

DoAction 앞 부분
DoAction  부분

1. True나 False나 동일하게 몽타주는 실행하지만 조건이 달라진다.

2. Out Hit가 true라면 바로 Location으로 이동해 버리면 된다. Move to Location에 연결.

3. Character에 Controller이 AIController일때 움직일 것이므로 형변환 후 Blackborad에서 값을 가져온다.

 

 

https://www.youtube.com/watch?v=9lYQ2fzW81E 

 

Comments