アクタをちょっとずつ目的地に近づける方法・もっと簡単版
「よく考えると、昨日のブループリントだと残りの距離のことを考えてないから、残り2cmしかない時でも5cm先までいっちゃうという問題が残ってる」
妹「途中でBlockされるから別に平気なのでは?」
「Blockだとそうなんだけどね。Overlapにして高速移動させると、目標の周りをビュンビュン往復することになるから、一応対処法を説明しておこうかと」
妹「近くに来たら違う風に動かすとか?」
「その近くかどうかをどうやって調べるかなんだけど、コリジョンのOverlapでもいいけどちょっと大げさ。そこまでしなくても、Vectorの長さを調べれば残りの距離はわかる。計算で求めることもできるけど、VectorLengthというノードがあるのでその方が速い。Vectorの長さ……昨日の話の単位ベクトルの場合だと出力は1になるし、5倍したVectorだと出力は5になる」
妹「それがわかるなら……Branchノードで、長さが5以下の時は……どうしたらいいんだろ? 単位ベクトルにその長さを掛ける?」
「それでもいいし、そもそも単位ベクトルにする前のVectorのままでOffset移動してもいいし、目的地のLocationに直接SetActorLocationしてもいい。移動せずに停止してもいいし、Vectorの長ささえわかれば後はなんとでもなる」
妹「長さが大事なのか」
「今回の場合だともっと簡単に使えるノードがあった。Clamp Vector Sizeという関数ノードなんだけど、Vectorの長さの上限(max)と下限(min)を設定して、それ以上長かったり短かったりする時には、範囲内に加工したVectorを出力してくれる」
妹「それはどういう風に使うの?」
「例えば、上限と下限を1にすると、Normalizeと同じように単位ベクトルを出力する。で、上限と下限を5にすれば、5cmのVectorが1発で作れる」
妹「それは便利だ」
「さらに上限が5で下限が0とすると……5cmより長い時は5cmにカットしたVectorが、それより短い時は元のままのVectorが出力される。これを移動用に使うと、特に複雑にノードを組まなくても一発でピタッと止まってくれる。ちなみにMinより短いVectorでも、長さが0の場合だけは0cmのままになる。そこは単位ベクトルの時と同じ」
妹「これってminの方がmaxより大きい時ってどうなるの? 条件が矛盾すると思うんだけど」
「数字によって違う」
妹「minが優先なのか」
「でもこれマニュアルに書いてるわけじゃないし、あんまりアテにしない方がいいと思うよ。多分中身の計算式でたまたまそうなってるってだけの話だと思うから」
妹「じゃあマイナスを入れたら?」
「マイナスの長さっていうのも変だけど、計算上は逆方向のVectorになる。Clamp Vector Sizeの計算でもそうなってる。普通にminとmaxに数字を入れて、両方ともにマイナスを付ける。minが-5でmaxが-10みたいにmaxの方が小さい数字になるけど、それで正常に動く」
妹「これを使えば反対向きのが作れる?」
「マニュアルには特に書いてなかったけど作れる。普通の長さのVectorを作ってから、Vector×Floatで-1を掛けてもいい。XYZ全部のプラスとマイナスを逆にするから、それでも逆方向のVectorになる」
妹「minとmaxにそれぞれプラスとマイナスを入れたら?」
「それはなんか不思議な計算結果になった。エラーにはならないし、なにかしらの法則はあると思うんだけど。まあそんなあやしい使い方せずに、常識的に使えば大丈夫だよ」
妹「自分の使い方が常識的なのかどうかが一番わからないんですが……」