UE 4.14.0ではEQSのテストはBlueprintで作成出来ない。
C++が必要になるのでその手順メモ。
参考 †
エンジンのソースコードの下記辺りに既存のテストclassが有る
Engine\Source\Runtime\AIModule\Classes\EnvironmentQuery\Tests\
作り方 †
- C++クラスを作成する

- 右上の「Show All Classes」にチェック、親クラスを「EnvQueryTest」を指定する。

- そのまま作成を進めてC++ファイルを追加する。Visual Studioで開かれる。
- ヘッダーは下記のように。
UCLASS()
class UMyEnvQueryTest : public UEnvQueryTest
{
GENERATED_UCLASS_BODY()
// テストを行う
virtual void RunTest(FEnvQueryInstance& QueryInstance) const override;
virtual FText GetDescriptionTitle() const override;
virtual FText GetDescriptionDetails() const override;
};
- ソースコードもいい感じに
#include "EnvironmentQuery/Items/EnvQueryItemType_VectorBase.h"
UMyEnvQueryTest::UMyEnvQueryTest(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
// testのコスト?
Cost = EEnvTestCost::Low;
// アイテムは何のパラメーターを受け取れるか。多分。
ValidItemType = UEnvQueryItemType_VectorBase::StaticClass();
}
void UMyEnvQueryTest::RunTest(FEnvQueryInstance& QueryInstance) const
{
// オーナーが居ない
UObject* QueryOwner = QueryInstance.Owner.Get();
if (QueryOwner == nullptr)
{
return;
}
FloatValueMin.BindData(QueryOwner, QueryInstance.QueryID);
float MinThresholdValue = FloatValueMin.GetValue();
FloatValueMax.BindData(QueryOwner, QueryInstance.QueryID);
float MaxThresholdValue = FloatValueMax.GetValue();
// アイテムの数だけブン回す
float score = 0.0f; // いい感じにする
for (FEnvQueryInstance::ItemIterator It(this, QueryInstance); It; ++It)
{
score += 0.05f; // いい感じにする
It.SetScore(TestPurpose, FilterType, score, MinThresholdValue, MaxThresholdValue);
}
}
FText UMyEnvQueryTest::GetDescriptionTitle() const
{
return Super::GetDescriptionTitle();
}
FText UMyEnvQueryTest::GetDescriptionDetails() const
{
return DescribeFloatTestParams();
}
- エディターに戻ってCompile.
- コンパイルに成功したら、EQSのテスト欄に追加されているハズ。

エラー †
テストを有効にしても正常に反映されない時 †
Output Logにエラーメッセージ出てる。

Tips †
テストの詳細欄にパラメーターを出す †
- ヘッダーに下記追加で、「TestValue」項目に「QueryContext」型のQuery変数を表示する
UPROPERTY(EditDefaultsOnly, Category=TestValue)
TSubclassOf<UEnvQueryContext> Query;
- ソースコード側。
- コンテキストのヘッダ
#include "EnvironmentQuery/Contexts/EnvQueryContext_Querier.h"
- コンストラクタに初期化
Query = UEnvQueryContext_Querier::StaticClass();
- RunTestメソッド内で取得。PrepareContextには各Transform取得メソッドも有るのでQueryInstanceクラス参照。
// クエリからActorのリストを取得する
TArray<AActor*> ContextActors;
if (!QueryInstance.PrepareContext(Query, ContextActors))
{
// Actorが1つも無かった
return;
}
- こんな感じでブン回せる
for (int32 ContextIndex = 0; ContextIndex < ContextActors.Num(); ContextIndex++)
{
}
