ランドスケープサンプルの、徐々に角度を変える仕組み
妹「ランドスケープのサンプルを見て飛び方の調査をしてるんだけど、よくわかんないノードがある。いっぱいある」
「日本語のドキュメントがないやつかな」
妹「日本語のがなかったり、日本語なんだけど意味がわからなかったりした。角度関係っぽいんだけど。RInterpToとか、FindLookAtLocationとか?」
「そのへんの角度関係のノードについては、ヒストリアさんのブログが詳しいよ」
「……というだけではなんなので、ちょっとランドスケープの中身を具体的に解説してみようと思う」
「これはBP_Boost_Ring。自機が輪っかをくぐると加速する……やつなのかな、多分。で、これのティックのところに、こういうブループリントが組んである」
妹「そうそう、こういうのがいくつかあって、なんとなくやろうとしてる雰囲気はわかるんだけど、具体的にそれぞれが何のノードなのか、どういう理由で使ってるのかがよくわかってない」
「だいたいの流れとしてはこういう仕組み。まず本来向くべき方向と、今向いてる方向を調べて、向くべき方向に若干回転させてからSetしてる。これを繰り返すとだんたん向くべき方向を向く。もちろん次のフレームでは自機も動いてるから、今度はそっちに動かす。ってずっと繰り返してる」
妹「ふむふむ。FindLookAtLocationというので、向く方向を調べてると。これ角度はどこからの角度になるのかな?」
「うーん、それは場合によるんだけど、今回はワールド座標同士で計算してるから、ワールド座標の角度になる。GetActorLocationの数字で計算して、SetActorLocationする用の数字が出てくる。Localなんとか同士でも出来るけど、その場合角度もLocalでsetしないと変な方を向いちゃう」
妹「角度っていうのは、どこから何度なんだろ?」
「X軸がプラスの方向を向いた状態を、XYZの回転が0にしてたような。ワールドで角度指定するならワールド座標のX軸、ローカルで角度指定するならローカル座標のX軸が基準になる。このへんは説明するよりやってみた方が早いと思うけど」
妹「じゃあそれはいいとして、RInterpToは?」
「これは角度のピンを2つ持ってる。Currentが今の角度、Targetが最終的に向きたい角度」
妹「それはわかる」
「InterpSpeedは1秒あたりどれぐらい傾けるか。DeltaTimeは何秒間動かしたか」
妹「そのへんがわからない……」
「そしたら、まず話を単純にするために、DeltaTimeの方は1に固定して考える。InterpSpeedは、0だと0%のまま、つまりCurrentの角度がそのまま出てくる。1だとTargetのまま。普通はその中間の数字を使う」
妹「0.5だったら、真ん中になる?」
「なる。例えばCurrentを50度、Targetを100度とした場合だと、DeltaTimeが1、InterpSpeedが0.5だったら、結果は75度になる」
妹「DeltaTimeのとこにつないであるgetWorldDeltaTimeというのは?」
「これはティックイベントについてるピンと同じ。ティックイベント以外で使う場合が多いけど、今回はピンまで遠いから、これを使ったんだと思う。やってることは一緒。処理落ちがあっても同じ速度でリングを回転させるための仕組み」
妹「だんだんわかってきたけど、そうすると、実際どれぐらいの速さで回るのかよくわかんないね」
「そのへんは試しながら調整しないと駄目だろうね」
妹「10度ずつ傾けたいとかは出来ないの?」
「それは今日出てきたノードでは難しそう。10度が何%にあたるのか計算して使うか、普通に角度を足していくか。角度を足す場合だと足しすぎた時に困りそうだけど」
妹「そうそれ。足しすぎた時が困ると思ってた。RInterpToなら足しすぎないの?」
「DeltaTimeやInterpSpeedを大きくすると回転速度は上がるけど、回転しすぎることはないよ」
妹「あとVInterpToとか、FInterpToっていうのも見かけたんだけど」
「それもやってることは同じ。Vector用と、Float用って違いだけ。ゆっくり進んだりとかに使える」