Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE4 Lerp処理やEase処理を簡単に使う

ここ最近夏のイベントに向けてかなり忙しい状況になってきているので更新が下がっている状態です。9月まではこんな状況が続くかと思いますので、しばらく控え目の更新で。

久し振りにブループリントのノード解説をやります。今回はLerp処理とEase処理についてです。

これらのノードは移動や回転を処理する時に、加減速を伴った動作を可能とします。一部のゲームでは非常によく使う処理のひとつです。ブループリントではこれを通常のコードを書くよりも遥かに簡単に実現することが可能です。

まずは以下のように移動したいアクターと移動到達地点を予め決めておきます。これは移動開始地点と終了地点がわかればどのような方法でも構いません。

f:id:alwei:20160712194402p:plain

Lerpによる線形補間処理

Lerpというのは線形補間(Linear Interpolation)のことです。ゲームや3DCGではこの線形補間をとてもよく使います。

線形補間 - Wikipedia

これを利用することにより非常に滑らかな移動が可能となります。ブループリントでは最初から様々な型のLerp系ノードが用意されています。

f:id:alwei:20160712195429p:plain

"Alpha"には補間係数を設定します。0.5と入力するとちょうど2点間の真ん中の位置を返してくれます。0に近ければ近いほどAに近い位置となり、1に近ければBに近い位置を返します。

ここではRキーを押下した際に移動処理ができるようにしてみます。通常、Lerp処理というのは1フレームで完結できるわけではありません。なので本来はUpdate系の関数やTickイベントを利用し、ボタンを押してから一時的に処理を行う分岐などを作成する必要があります。

ただし、ブループリントにはタイムラインというノードがあります。これはアクター内でTickとは別のUpdateを毎フレーム呼び出すことが可能です。タイムラインノードの中でトラックを追加する必要はありません。

Update処理だけができればいいので、Playを開始してしまえばタイムラインの残り時間の間だけ処理をしてくれます。そこで以下のようにノードを組みます。

f:id:alwei:20160712200039p:plain

"Alpha"は0.1となっているので、AとBの間でAに近い補間位置を計算して返します。これを何度も繰り返すとヌルっとした動きになります。

f:id:alwei:20160712200800g:plain

いい感じに処理ができました。

フレームレートに依存しないInterp Toによる補間処理

実はこのままだと少し問題があります。Lerp系のノードはフレームレートに依存してしまうので、少しでもフレームレートが可変してしまうと動き方が変わってきます。これを解決するのが、"Interp To"と呼ばれるノードたちです。

f:id:alwei:20160712201306p:plain

"InterpTo"もFloatやVector、Rotationに対応したものが用意されており、更にそれぞれには"Interp to Constant"と呼ばれるノードも用意されています。

Interp Toはフレームレートによって多少補間量が可変してしまうので、線形補間とは言えません。"Interp to Constant"を使うことによって必ず一定の値を返してくるようになりますが、"Interp To"系とはかなり動きが異なっているようなので注意してください。

実際に利用する時は以下のような具合となります。

f:id:alwei:20160712202348p:plain

Lerp系との最大の違いは"Alpha"がなくなって、"Delta Time"と"Interp Speed"が追加されています。"Delta Time"にはTickなどから得られる、"Delta Seconds"の値や"Get World Delta Seconds"ノードから得られる値を渡してあげてください。これでフレームレートに依存しなくなります。

"Interp Speed"には一度に移動する値を入力します。大きければ大きいほど当然動きが早くなります。補間値ではないので、純粋に1フレームで移動したい量を設定してあげてください。

これでLerp処理と同じように、しかもフレームレートに依存せずに動くことができているはずです。

Easeによる緩急のついた値の補間処理

Easeとは加速や減速などにカーブのような緩急をつけて補間させる処理のことです。ブループリントでは2種類のEaseノードがあります。

f:id:alwei:20160712203036p:plain

"FInterp Ease in Out"はFloatで値を返してくれる専用のノードです。4.12の現状では他の種類はありません。

Lerpと同様の使い方が可能ですが、こちらは"Exponent"によってカーブの具合いを設定することができます。しかし"Ease"ノードでほぼ代用可能なのでこちらを使うことはまずありません。

次が"Ease"ノードです。こちらは特殊なノードになっており、AとBにはある決まった型を持つものであれば、ピンに繋いだ時点で自動的にピンが変換されます。

ほどLerp系と同様の使い方が可能ですが、補間関数を"Function"ピンから選択する必要があります。補間関数についてはヒストリアさんがとても詳しく解説されているので参考にしてください。

historia.co.jp

選択した補間関数によっては、"Blend Exp"で補間するブレンド係数の指定が必要になりますので、必要時に別途指定してください。

実際にノードとして使ってみると以下のような具合です。これでほぼ、最初のLerp系処理と同様の動きができます。

f:id:alwei:20160712204045p:plain

しかしこちらは可変フレームレートに対応しておりませんので、注意が必要です。

システム的でなければ可変フレームレートに対応させるために"Alpha"の値を自分で計算させれば、可変フレーム対応自体は可能です。
Alphaに渡すベースの値を可変対応させれば、フレームレートへの依存がなくなります。詳細は以下の記事を参考にしてください。

unrealengine.hatenablog.com