執筆: H.A
はじめに
今回紹介するのはUnreal EngineでBPとCppの連携について記載しようと思います。
よくWBPにcppで計算したパラメータを送る場合や
WBPをユーザーが操作した場合にcppに結果を送りたい場合など多々あるとおもいますが、
あまり記事がないのでここに記載します。
この記事の内容
今回はプレイヤーの視界を計算して、見えている範囲を表すメッシュを表示するところまで行います。
今回は、UEだけでなく、3Dモデリングの作業もあります。
とはいえ、小さな三角ポリゴンの板を作るだけなので、BlenderやMayaの簡単な操作ができれば十分行えます。
実行環境
今回使用する環境は以下の通りです。
- Unreal Engine 5.3.2
- Blender 4.4
見下ろし型ゲームがベースのシステムを作るので、今回はUEのトップダウンのサンプルプロジェクトをもとに実装していきます。
実装してみよう
まず、視界システムを実装していくBPアクターを作成します。
アクタークラスを親として「BP_SightArea」を作成します。
BP_SightAreaクラスを開き、このクラスに対して、まずは、キャラクターの視界の範囲をLineTraceで計測する処理を実装します。
新しく関数「CalcSightArea」を作成して、以下の処理を実装します。
この段階で使用する変数は以下の6つです。

各変数はそれぞれ、以下の意味を持ちます。
- TraceCount
- LineTraceを実行する回数を表します。数が多いほどより正確に視界を測定できますが、負荷が増えます。今回は初期値として、90を設定しました。
- CheckRange
- 視界の長さを表します。この値が高いほど、キャラクターから遠くまで見ることができます。
- TraceOffset
- LineTraceを実行する際に上方向へオフセットを加えるときの値です。アクターが地面のメッシュに接している状態だと、LineTraceが地面に視界をさえぎられている認識になってしまうため、上方向へオフセットを加えて、適切に計測ができるようにします。
- ViewingAngle
- 視野角の値です。キャラクターの前方向を中心に左右の角度の合計がこの値となります。今回は初期値として、90を設定しています。
- IsOffsetByHeight
- 上方向へのオフセットの有無を切り替えるフラグです。Trueでオフセットあり、Falseでなしとします。
- CurrentTraceStep
- 現在処理しているLineTraceが何本目かを保持するローカル変数です。
それでは、処理を組んでいきます。
TraceCountの数分ループをして、LineTraceを実行していきます。
LineTraceの始点では、上方向へのオフセットを加えるかの判定を行い、終点でもオフセットの判定を行いつつ、VIewingAngleをTraceCountで割った値分、ループごとにずらしながら計測をしていきます。

処理が出来たらテストをするために以下のようにConstruction ScriptにCalcSightAreaをつなげて、Editor画面で確認します。

ここまで成功していれば、以下のGIFのように、扇状に赤線が伸びて、オブジェクトにさえぎられている先は緑色になります。
全部緑色になってしまう場合は、LineTraceが地面に接していて、視界が遮られている判定になっている可能性があります。BP_SightAreaを上に上げるか、IsOffsetbyHeightをTrueにして上方向へのオフセットを有効にしてみてください。

次に、視界を表すメッシュを生成するための3Dオブジェクトを作成していきます。
今回はBlender4.4を使用しますが、作るのは小さな三角メッシュのため、BlenderやMayaなど、お好きな3Dモデリングアプリを使ってください。
作るモデルは以下のような形です。

参考に各ポリゴンの座標は以下となっています。
- (0.0, 0.0, 0.0)
- (1.0, 0.0090, 0.0)
- (1.0, -0.0090, 0.0)
完成したらFBXにエクスポートして、UEにインポートします。
インポートしたスタティックメッシュは「SM_SightAreaMesh」とします。
そして次に、子のメッシュに対して設定するマテリアル「M_SightAreaMesh」を作ります。
子のメッシュはのちに、ポストプロセスで使用するマスク情報として使用するため、あまり見た目に対して気にする必要はないため、シンプルに白一色のマテリアルにします。

できたら、「SM_SightAreaMesh」を開いて忘れずにマテリアルを設定しておきましょう。

これでメッシュの設定は完了です。
ここからは、LineTraceの結果に従って、視界範囲を表すメッシュを生成する処理を実装していきましょう。
まず、InstancedStaticMeshComponentをBP_SightAreaに追加します。
追加したら、StaticMeshをSM_SightAreaMeshにして、コリジョンプリセットを「No Collision」にしてください。

次に、LineTraceの後に、インスタンスを生成する以下の処理を加えます。

最後に、関数の最初にインスタンスをリセットする処理を加えます。

起動
これで、視界範囲を表すメッシュが生成されます。
レベル上に配置しているBP_SightAreaを動かしてみましょう。
以下のように障害物に沿って、メッシュが生成されるはずです。

まとめ
これで視界を表すメッシュの生成が完了しました。
このままマテリアルを調整して赤い半透明などにすれば、ステルスゲームの敵キャラクターの視界の表現などに使えそうですね。
次回は、このメッシュの描画を使って画面をマスクして、視界外は暗くなるようにします。