妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

ランドスケープサンプルの、徐々に角度を変える仕組み

妹「ランドスケープのサンプルを見て飛び方の調査をしてるんだけど、よくわかんないノードがある。いっぱいある」

「日本語のドキュメントがないやつかな」

妹「日本語のがなかったり、日本語なんだけど意味がわからなかったりした。角度関係っぽいんだけど。RInterpToとか、FindLookAtLocationとか?」

「そのへんの角度関係のノードについては、ヒストリアさんのブログが詳しいよ」

historia.co.jp

「……というだけではなんなので、ちょっとランドスケープの中身を具体的に解説してみようと思う」

f:id:una_unagi:20160907231909p:plain

「これはBP_Boost_Ring。自機が輪っかをくぐると加速する……やつなのかな、多分。で、これのティックのところに、こういうブループリントが組んである」

f:id:una_unagi:20160907231509p:plain

妹「そうそう、こういうのがいくつかあって、なんとなくやろうとしてる雰囲気はわかるんだけど、具体的にそれぞれが何のノードなのか、どういう理由で使ってるのかがよくわかってない」

f:id:una_unagi:20160907234128p:plain

「だいたいの流れとしてはこういう仕組み。まず本来向くべき方向と、今向いてる方向を調べて、向くべき方向に若干回転させてから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用って違いだけ。ゆっくり進んだりとかに使える」