レイキャスト関係の調整
Map Scanner ではレイキャストを利用して地形や障害物をスキャンしています。 しかし、ゲーム内に配置されたオブジェクトのコリジョン(当たり判定)の設定はゲームによって大きく異なります。
そのため、自動テスト対応を行う際にはゲームの実装を確認しつつ、適切にレイキャストが行えるように調整する必要があります。 具体的には、以下の 3 つの調整を行なう必要があります。
- Map Scanner 用の調整
- プレイヤー周辺の地形調査用の調整
- Collision Checker 用の調整
本ページでは、わかりやすいようにサンプルゲームでの実装も併記して解説します。
Map Scanner 用の調整
Map Scanner 用のレイキャスト (トレース) はBP_COMBridgeUtility
内の関数にて定義されています。
下記の 2 つの関数をプロジェクトごとに調整(書き換え)をする必要があります。
Map Scan to JSON V
ノードMap Scan to JSON H
ノード
Map Scan to JSON V/H ノードの書き換え
Map Scanner 用のレイキャストは、以下のような特性が求められます。
- 地形および障害物にはヒットする
- 敵キャラクターなどの NPC にはヒットしない
上記を満たすように、内部で使用しているSphereTrace
を調整します。
使用するノードの変更
UnrealEngine には標準で、球体を飛ばすSphereTrace
が 3 種類用意されています。
- 指定した
Trace Channel
だけにヒットするSphereTraceByChannel
ノード - 該当するプロファイルのコンポーネントにヒットする
SphereTraceByProfile
ノード - 指定した
Object Type
だけにヒットするSphereTraceForObject
ノード
また、上記ノードのActors to Ignore
にヒットさせたくないアクターを指定することが出来ます。
ノードの変更は、基本的にデフォルトの SphereTraceByChannel
ノードにつながっているピンを入れ替えることで実施します。
この際、新たに入力ピンの接続が必要なものがありますが、これは関数の引数として設定し、
呼び出し元関数 Create Com Bridge Common Data
から渡すとよいでしょう。
例えば SphereTraceForObject
ノードを使う場合、入力として Object Type
と Actors to Ignore
を指定する必要があります。
これらの値を関数の引数として設定し、Create Com Bridge Common Data
関数内側で「配列を作成」、Get All Actors of Class
をした値を渡すとよいでしょう。
Get All Actors of Class
ノードを使ってActors to Ignore
用のリストを生成することになりますが、
Get All Actors of Class
ノードは実行に時間がかかるため、高頻度に呼び出すことが推奨されていません。(参照)
Get All Actors of Class
の利用は最小限に留めるよう工夫してください。
上記内容を駆使して、うまくマップをスキャンできるようにしてください。
プレイヤー周辺の地形調査用の調整
Playthrough Tester などで周囲の地形を把握するために使用している以下のノードに対しても、Map Scannaer 用と同様の変更を行います。
Raycast Data to Json V
ノードRaycast Data to Json H
ノード
Collision Checker 用の調整
コリジョンチェックにおいては、コリジョン抜けが発生しうる場所の検出方法とコリジョン抜けの判定方法はゲームによって様々になります。
そのため、Collision Checker に備わっている「怪しい箇所」検出機能は、現在ゲームごとに問題を検出できるような実装にしています。
以下にサンプルゲームでの仕様を解説します。 これを参考に、プレイヤーの周囲 16 方向のコリジョン抜けが発生していそうな箇所を検出できるような処理を実装してください。
サンプルゲームでの実装例
Map Scanner 用の調整
サンプルゲームでは以下のように実装することで敵キャラクター以外の可視オブジェクトにヒットさせています。
Collision Checker 用の調整
サンプルゲームでは、意図的に配置されたコリジョン抜け箇所を一定の精度で検出できるよう、 以下のように 2 回のレイキャストでプレイヤー周囲のコリジョン抜け箇所を検出するようにしています。
- プレイヤーの中心から、水平方向に [周辺探査の距離] だけ、垂直下方向に [プレイヤーの身長] だけ進んだ地点に向けて 半径=5 の球を飛ばす (SphereTrace)
- 水平方向に飛ばした球がヒットした場所 (ヒットしなかった場合はレイキャストの終点) から上空に向けてラインを飛ばす (LineTrace)
- 2 回目の上空に飛ばす LineTrace が Landscape (地形システム) に衝突した場合、コリジョン抜けが発生しうる場所と判定
- 1 回目を SphereTrace、2 回目を LineTrace にすることで、2 回目の始点がオブジェクトに接触しないようにしている
- 1 ~ 2 をプレイヤーの周囲 16 方向とプレイヤーの真上の合計 17 方向に対して行う
なお、サンプルゲームにおけるコリジョン抜け検出の処理は以下のノードで実現しています。
Collision Error Data to JSON Alfort
ノード
解説
Landscape は一般的に地面=その下にプレイヤーが侵入しない想定と言えます。 つまり、上空に飛ばしたレイが Landscape にヒットするようなことは通常起こり得ません。 そうなっていた場合はその場所は本来進入できないはずの地下(コリジョン抜け箇所)である可能性が高いです。
この手法を応用して、さらに周囲 16 方向のコリジョン抜けも探しています。
プレイヤーが奈落落ち状態に陥るということはどこか地面に穴が空いている場所があるはずなので、プレイヤー周囲に斜め下方向に SphereTrace を行い、そこから上空に LineTrace をすることで、プレイヤーの周囲の怪しい箇所まで見つけられるようにしています。
洞窟のような地形も考えられますが、その場合、Landscape の下に 洞窟の天井 が配置されるはずなので Landscape にヒットすることはありません。