CollisionTest プラグイン
1. 概要
CollisionTest プラグインは、Unreal Engine プロジェクトに追加することで導入できます。 図のように Collision Checker から送信された json データを参照し、データを基に処理を実行した後、 実行結果のデータとゲームの内部データを Collision Checker に返信します。
関連ファイル
CollisionTest プラグインに関連するファイルは以下です。
CollisionTest
├── CollisionTest.Build.cs +-------------+ 依存モジュール設定ファイル
├── Private +----------------------------+ .cpp ディレクトリ
│ ├── AStarPathFinding.cpp +-----------+ A* 経路探索 (.cpp)
│ ├── CollisionCallbackComponent.cpp +-+ 接触判定関連クラス (.cpp)
│ ├── CollisionTest.cpp +--------------+ プラグイン本体 (.cpp)
│ ├── CollisionTestFunctions.cpp +-----+ ブループリント連携クラス (.cpp)
│ ├── CombinedMesh.cpp +---------------+ テスト結果のキューブ描画クラス (.cpp)
│ └── UnusedFunctions.cpp_ +-----------+ ナビメッシュベースのコリジョンチェック関連コード (退避用)
└── Public +-----------------------------+ .h ディレクトリ
├── AStarPathFinding.h +-------------+ A* 経路探索 (.h)
├── CollisionCallbackComponent.h +---+ 接触判定関連クラス (.h)
├── CollisionTestFunctions.h +-------+ ブループリント連携クラス (.h)
├── CombinedMesh.cpp +---------------+ テスト結果のキューブ描画クラス (.h)
├── ICollisionTest.h +---------------+ プラグイン本体 (.h)
└── UnusedFunctions.h_ +-------------+ ナビメッシュベースのコリジョンチェック関連コード (退避用)
2. 定数の定義
CollisionTest プラグインに必要な機能を 2 種類に区別し、それぞれの機能をifdef
範囲内で実装することで機能をオンオフできるようにしてあります。
機能は重複していないため、基本的に全て定義したままで運用できます。
// コリジョンチェック中のみ必要な機能を ifdef 内で定義
#define COLLISIONTEST_TEST
// ビューワーツールと連携する際に必要な機能を ifdef 内で定義
#define COLLISIONTEST_VIEW
3. データの可視化
目標点の可視化
json 形式のコリジョンチェックファイルの中から目標点データ"Collision"
情報を読み込み、メッシュ結合クラスを利用して目標点を可視化します。
- 関数
FCollisionTest::DrawCollisionPoint
- 呼び出し元
FCollisionTest::OnRecvJsonData
- コンソールコマンド ("coltest_draw_colpoint")
接触点の可視化
json 形式のテスト結果ファイルの中から接触点データ"TouchData"
情報を読み込み、メッシュ結合クラスを利用して接触点を可視化します。
- 関数
FCollisionTest::DrawTouchPoints
- 呼び出し元
FCollisionTest::OnRecvJsonData
到達点の可視化
json 形式のテスト結果ファイルの中から到達点データ"ReachData"
情報を読み込み、メッシュ結合クラスを利用して到達点を可視化します。
- 関数
FCollisionTest::DrawReachPoints
- 呼び出し元
FCollisionTest::OnRecvJsonData
4. コマンドの実行
ゲーム開始時にエンジン側から呼び出されるFCollisionTest::StartupModule
関数内で
IConsoleManager::Get().RegisterConsoleCommand
関数を実行することで
Unreal Engine コンソールコマンドを登録し、各機能のコマンドを登録します。
#include "HAL/IConsoleManager.h"
void FCollisionTest::StartupModule()
{
IConsoleManager::Get().RegisterConsoleCommand(
TEXT("{コマンド名}")
, TEXT("説明: {コマンド説明文}")
, FConsoleCommandDelegate::CreateLambda([this]() {
/* コマンド実行時のプログラムをここに記述する */
})
, ECVF_Default
);
}
5. ビューワーとの連携
ゲーム開始時にエンジン側から呼び出されるFCollisionTest::StartupModule
関数内で
UCollisionTestFunctions::SubscribeToRecvData
を実行することで
ビューワーから json データを受信した際にFCollisionTest::OnRecvJsonData
関数が呼び出されるようにします。
void FCollisionTest::StartupModule()
{
TFunction<void(const FString&)> func = [this](const FString& jsonData) { this->OnRecvJsonData(jsonData); };
auto ptr = TSharedPtr<TFunction<void(const FString&)>>((new TFunction<void(const FString&)>(func)));
UCollisionTestFunctions::SubscribeToRecvData(ptr);
UCollisionTestFunctions::SetCollisionTestObject(this);
}
void FCollisionTest::OnRecvJsonData(const FString& jsonData)
{
TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(jsonData);
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());
if (FJsonSerializer::Deserialize(JsonReader, JsonObject) && JsonObject.IsValid())
{
/* jsonデータを読み取り関数を実行する */
}
}