メインコンテンツまでスキップ
バージョン: 1.3.0

レイキャスト関係の調整

Map Scanner ではレイキャストを利用して地形や障害物をスキャンしています。 しかし、ゲーム内に配置されたオブジェクトのコリジョン(当たり判定)の設定はゲームによって大きく異なります。

そのため、自動テスト対応を行う際にはゲームの実装を確認しつつ、適切にレイキャストが行えるように調整する必要があります。 具体的には、以下の 3 つの調整を行なう必要があります。

  1. Map Scanner 用の調整
  2. プレイヤー周辺の地形調査用の調整
  3. 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を調整します。

image.png

使用するノードの変更

UnrealEngine には標準で、球体を飛ばすSphereTraceが 3 種類用意されています。

  • 指定したTrace ChannelだけにヒットするSphereTraceByChannelノード
  • 該当するプロファイルのコンポーネントにヒットするSphereTraceByProfileノード
  • 指定したObject TypeだけにヒットするSphereTraceForObjectノード

また、上記ノードのActors to Ignoreにヒットさせたくないアクターを指定することが出来ます。

ノードの変更は、基本的にデフォルトの SphereTraceByChannel ノードにつながっているピンを入れ替えることで実施します。 この際、新たに入力ピンの接続が必要なものがありますが、これは関数の引数として設定し、 呼び出し元関数 Create Com Bridge Common Data から渡すとよいでしょう。

例えば SphereTraceForObject ノードを使う場合、入力として Object TypeActors 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の利用は最小限に留めるよう工夫してください。 image.png

上記内容を駆使して、うまくマップをスキャンできるようにしてください。

プレイヤー周辺の地形調査用の調整

Playthrough Tester などで周囲の地形を把握するために使用している以下のノードに対しても、Map Scannaer 用と同様の変更を行います。

  • Raycast Data to Json V ノード
  • Raycast Data to Json H ノード

Collision Checker 用の調整

コリジョンチェックにおいては、コリジョン抜けが発生しうる場所の検出方法とコリジョン抜けの判定方法はゲームによって様々になります。
そのため、Collision Checker に備わっている「怪しい箇所」検出機能は、現在ゲームごとに問題を検出できるような実装にしています。

以下にサンプルゲームでの仕様を解説します。 これを参考に、プレイヤーの周囲 16 方向のコリジョン抜けが発生していそうな箇所を検出できるような処理を実装してください。

サンプルゲームでの実装例

Map Scanner 用の調整

サンプルゲームでは以下のように実装することで敵キャラクター以外の可視オブジェクトにヒットさせています。

image.png

Collision Checker 用の調整

サンプルゲームでは、意図的に配置されたコリジョン抜け箇所を一定の精度で検出できるよう、 以下のように 2 回のレイキャストでプレイヤー周囲のコリジョン抜け箇所を検出するようにしています。

  1. プレイヤーの中心から、水平方向に [周辺探査の距離] だけ、垂直下方向に [プレイヤーの身長] だけ進んだ地点に向けて 半径=5 の球を飛ばす (SphereTrace)
  2. 水平方向に飛ばした球がヒットした場所 (ヒットしなかった場合はレイキャストの終点) から上空に向けてラインを飛ばす (LineTrace)
    • 2 回目の上空に飛ばす LineTrace が Landscape (地形システム) に衝突した場合、コリジョン抜けが発生しうる場所と判定
    • 1 回目を SphereTrace、2 回目を LineTrace にすることで、2 回目の始点がオブジェクトに接触しないようにしている
      image.png
  3. 1 ~ 2 をプレイヤーの周囲 16 方向とプレイヤーの真上の合計 17 方向に対して行う
    image.png

なお、サンプルゲームにおけるコリジョン抜け検出の処理は以下のノードで実現しています。

  • Collision Error Data to JSON Alfort ノード

解説

Landscape は一般的に地面=その下にプレイヤーが侵入しない想定と言えます。 つまり、上空に飛ばしたレイが Landscape にヒットするようなことは通常起こり得ません。 そうなっていた場合はその場所は本来進入できないはずの地下(コリジョン抜け箇所)である可能性が高いです。

image.png

この手法を応用して、さらに周囲 16 方向のコリジョン抜けも探しています。
プレイヤーが奈落落ち状態に陥るということはどこか地面に穴が空いている場所があるはずなので、プレイヤー周囲に斜め下方向に SphereTrace を行い、そこから上空に LineTrace をすることで、プレイヤーの周囲の怪しい箇所まで見つけられるようにしています。

image.png

洞窟のような地形も考えられますが、その場合、Landscape の下に 洞窟の天井 が配置されるはずなので Landscape にヒットすることはありません。
image.png