54. 인바이런먼트 쿼리(2) - Target 뒤로 텔레포트 하기
인바이런먼트 쿼리의 Dot 테스트를 통해 Enemy의 뒤로 갈 수록 아이템의 Score 커지기
먼저 Point : Grid Generators를 추가하여 Grid 우클릭 - 테스트 추가를 통해 Dot 테스트를 추가하였다.
그리고 Dot 테스트를 통해 Enemy의 후방으로 갈수록 아이템의 Score 값이 점점 커지도록 할 것이다.
첫번째 Line A는 Querier의 Rotation을 통해 첫번째 벡터로 삼는다.
두번째 Line B는 Querier에서 Item으로 가는 두번째 벡터로 삼는다.
Test Mode는 평면 상에서의 거리만 볼 것이기 때문에 Dot 2D(x,y 좌표)로 선택했다.
* Absolute Value : 결과값이 모두 절대값
Fliter Type으로는 Maximum을 선택하였는데, 이는 cos으로 볼 때, 후방이면 -(음수)로 볼 수 있다.
따라서 Maximum을 선택하여 0.0이 넘는 값들을 모두 필터로 걸러낸다.
Scoring Equation은 Inverse Linear를 주었다. 이는 아이템이 Querier와 거리가 멀어질수록 점수가 높게 나온다.
EQS_GetDestination
새로운 인바이런먼트 쿼리(EQS_GetDestination)을 만들었다. 이는 Enemy가 텔레포트할 위치를 정해줄 것이다.
먼저 Generators 중 Points : Circle을 선택하여 추가했다.
Points : Circle
- Space Between : 아이템 간의 간격
- Number Of Points : 아이템의 개수
- Arc Angle(호 각도) : 원의 일부인 호 형태 아이템을 생성하는 경우,
여기서 호의 각도 정의
- 원 중앙 : 원 중앙이 누가 될 것인지
- 원 중앙 ZOffset : 원의 높이를 얼마나 줄 것인지
대상의 뒤를 잡아야되기 때문에, Points : Circle에 우클릭 - 테스트 추가 - Dot을 선택한다.
그런데 여기서 Querier가 중심이 아닌 뒤를 잡을 대상을 중심으로 Circle이 형성되어야 한다.
따라서 OnCircle의 원 중앙을 새로 만들어줄 것이다.
EQC_Target
블루프린트 클래스 - 모든 클래스(QueryContext)를 검색하여 나오는 EnvQueryContext_BlueprintBase를 선택하여 EQC_Target을 만들어준다.
EQC_Target 내부를 보면 이렇게 오버라이드 가능한 함수가 4가지가 있다.
우리가 여기서 사용할 것은 Provide Single Actor 함수. Actor를 반환해줄 것이다.
Querier Actor(현재 쿼리를 사용중인 Actor)에서 Blackboard를 받아와 Target 이름의 키값을 Actor로 형변환하여 변환했다.
해서 이렇게 만든 EQC_Target을 원 중앙으로 선택해준다.
이후 실행해보면 Circle이 Target(Player) 주변으로 생성되는 것을 볼 수 있다.
이제 Circle의 Dot 테스트를 통해서 Target 뒤의 아이템이 최고 점수가 되도록 해본다.
먼저 Line A는 Rotation의 대상은 Target으로 잡아준다.
Player의 회전에 따라가는 것이다.
Line B는 Target과 아이템 사이의 벡터로 선택했다.
TestMode는 Dot 2D만 사용할 것이다.
마찬가지로 Maximum : 0.0을 통해 전방의 아이템들은 모두 필터로 걸러주고,
Scoring Equation : Inverse Linear를 통해 Target과 제일 멀어질수록 Score가 높게 설정되도록 했다.
그런데 여기서 Target의 등 뒤로만 이동하기보단 등 뒤의 특정 각도 범위를 정해서, 그 각도 안의 랜덤한 곳에서 텔레포트하도록 해볼 것이다.
BT_Enemy_Ranged 비헤이비어 트리로 와서, Run EQS Query 태스크를 보자.
먼저 EQSRequest의 Query Template는 방금 만들었었던 EQS_GetDestination 인바이런먼트 쿼리를 넣어준다.
그리고 결과물(아이템의 위치)로 받을 Blackboard Key로 Destination을 선택한다.
이제 Run Mode : Single Random Item from Best 25%를 설정해준다.
- Single Best Item : 가장 상위(Winner) 아이템
- Single Random Item from Best 5% : 상위 5% 안의 랜덤한 아이템
- Single Random Item from Best 25% : 상위 25% 안의 랜덤한 아이템
BT_Enemy_Ranged 비헤이비어 트리의 텔레포트를 사용하는 Escape(Sequence)의 사이에 Run EQS Query를 넣어주면 텔레포트를 하는 것을 볼 수 있다.