Category: “UE5”
“3Dギズモ、マニピュレーターと呼ばれるようなもの”
執筆: “モ”
はじめに
DCCツール等にある「コレ」

ツールによって様々ですが、3Dギズモと呼ばれたり、マニピュレーターと呼ばれたりします。今回はこれをマニピュレーターと呼称し、移動のみに絞って解説します。
準備
用意するもの
- 矢印の3Dモデル(3DUI用)
今回は3方向に伸びているものではなく、矢印が一つずつ分かれている物にしています。UE上で、X軸の正の方向に矢印が伸びている物にしてください。その方向が「Fowerd(前)」です。
- マニピュレーター本体のBlueprint
場合にもよりますが、今回は独立して動く形とします。Actorを継承して問題ないと思います。 - PostProcessマテリアル
操作するモノが矢印の裏側に行った時にちゃんと見えるようにする為のもの。障害物の向こう側から操作しないときは不要です。こちらは後ほど解説します。
今回は簡易的に用意します。
挙動の整理
大まかな処理の流れとしては
・「移動させる物」を指定し、マニピュレーターに持たせる(今回は言及しない。)
↓
・動作する3D矢印を指定
↓
・マウスの移動距離等から移動距離を指定
↓
・移動距離に合わせて矢印とオブジェクトを移動
となります。
実際に作る
・Blueprintに物を配置する

このように配置しましょう。
・Xが赤、Yが緑、Zが青としています。今回必要なのは各矢印メッシュのFowerdVectorのみなので、各コンポーネントのローカルX軸の正の方向に矢印の先が伸びていればよいです。
・矢印メッシュのコリジョンプリセットは一旦このように設定してください

今回はUnrealの座標系に準拠していますが、必要であればどのような座標系でも大丈夫です。動く方向は結局「矢印」の方向です。
・ロジック部分

メインの処理はこのようになります。
CheckHitManipulatorAxisで矢印のComponent取得しGrabbingAxisにSet、SetされたらIsValidの方に流れるので、マニピュレーターを動かすことができるようになります。
各関数について解説します。
・CheckHitManipulatorAxis

この関数でやっている事は以下の通りです。
1.MultiLineTraceForObjectで画面からマウスでクリックした位置にあるすべてのオブジェクトを取得する。
※今回仮のObjectTypeを指定していますが、どのようなLineTraceでも矢印メッシュを取得できれば問題ありません。
2.取得したオブジェクトの中からマニピュレーターのパーツを探し、見つけたらGrabbingAxisにSet
3.この時の画面内のマウスの位置と、この時のマニピュレーターの位置をそれぞれMousePositionStart、BasisLocationに覚えておく
4.クリックした位置にあるオブジェクトに複数矢印オブジェクトがあっても、最初(通常はカメラから見て一番前)の1つの矢印メッシュを取得し、それ以降の処理はBreakで中断します。
この処理が完了したら、GrabbingAxisにXYZ何れかの矢印メッシュが入っているか、何も入っていない状態になります。
・ManipulateLocation

この関数でやっている事は以下の通りです。
・まず、現在のマウスの位置をMousePositionEndにSetします。
これ以降は番号に分けて解説します。

この部分は、現在の画面における現在つかんでいる矢印メッシュの「画面から見た」2Dベクトルを求めています。

この部分は、2D画面におけるクリックを開始した位置を始点、現在のマウスの位置を終点とした2Dベクトル(上)と、その距離(下)を求めています。

この部分は、プレイヤーとマニピュレーターの距離をベースにした移動倍率を求めています。CameraLengthAdjustValueは適宜設定する値です。

この部分では、1で求めたベクトルと、2で求めたベクトルのドット積を2で求めた距離をかけて、さらに3で求めた移動倍率をかけています。
その後つかんでいる軸の3D方向ベクトルに、上までで求めたFloat値をかけて移動距離とし、CheckHitManipulatorAxisで取得した「クリックした時点での位置」に足し合わせています。
以上の値を新しいマニピュレーターの位置とし、SetActorLocationで移動させます。
これでマニピュレーターの位置が自由に動くようになります。
ここに対して、移動させるものをSetすれば移動できます。
・オブジェクトの裏からもマニピュレーターが見えるPostProcess
・Blueprint側の設定
PostProcess単体では見えるようになりませんので、まずはBlueprint側で設定をしましょう。

Blueprint側で、矢印メッシュを選択し、CustomDepthStencilValueを軸に合わせて2~4に設定しましょう。今回はX(赤)を2、Y(緑)を3、Z(青)を4と設定しました。
・PostProcess本体

このようなPostProcessを、マニピュレーターが出現しているときに適用します。マニピュレーターのBlueprintにPostProcessのボリュームを付けて、マニピュレーターのBlueprintをDestroyする事でボリュームも消える、などの仕組みで対応できます。
さいごに
今回は移動のみですが、移動距離指定の仕組みはオブジェクトの拡大動作にも流用できます。具体的にはManipulateLocationの[4]のFowerdVectorを掛け算しているFloatの値を各軸のScaleに適用する形です。
回転を実装するのであればManipulateLocationの1のベクトルを違ったものにする必要がありますが、回転のマウス移動の方向、仕組みはDCCツールによってまちまちだったりするので何とも言いずらいです。