Top > EQS-テスト自作
#contents ---- UE 4.14.0ではEQSのテストはBlueprintで作成出来ない。 C++が必要になるのでその手順メモ。 * 参考 [#xd5b71b4] エンジンのソースコードの下記辺りに既存のテストclassが有る Engine\Source\Runtime\AIModule\Classes\EnvironmentQuery\Tests\ * 作り方 [#z058c67d] + C++クラスを作成する &ref(eqs_create_test01.png,,70%); + 右上の「Show All Classes」にチェック、親クラスを「EnvQueryTest」を指定する。 &ref(eqs_create_test02.png,,70%); + そのまま作成を進めて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のテスト欄に追加されているハズ。 &ref(eqs_create_test03.png,,70%); * エラー [#l8b25381] ** テストを有効にしても正常に反映されない時 [#u04ec8f4] Output Logにエラーメッセージ出てる。 &ref(eqs_create_test04.png,,70%); * Tips [#yd0cdcf7] ** テストの詳細欄にパラメーターを出す [#hac2d047] + ヘッダーに下記追加で、「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++) { } &ref(eqs_create_test_tips_param01.png,,70%); |