はじめに
MoveTo、TeloportToをつかって対象物を動かすことができることは以前にご紹介しました。
実際につかってみて、もっと滑らかに動かすことはできないかなとか、もっと違う自由な動きを表現できないかなとか思った方はいないでしょうか。
動きの自由を求める方にオススメなのが、animation controllerです。
animation controllerとは
下の動画をご覧ください。
アセットの人形(prop)が、移動したり大きくなったりしています。
どうやってつくっているかというと、人形が動きはじめるポイントAを決めて、動いた後のポイントBを決めます。それで、AとBとの間でおこなわれる動きはどのようにするのか決めていきます。例えば、90度だけ回転するとか、ちょっとだけ拡大したいとか。
ここでお話しているポイントというものを、”キーフレーム“と呼びます。また、キーフレームを決めて動きをつくっていくことを、”アニメーション“と呼びます。
キーフレームを設定しアニメーションを作成する作業をverseで実行するには、どのような手順ですすめれば良いでしょうか。
ここで登場するのがanimation controller(アニメーションコントローラ)です。animation controllerは、キーフレームを設定してアニメーションをつくる機能をもつクラスです。クラスであるため、様々な機能を持ちますが、animation controllerの場合は上記で説明したようなアニメーションに関わる機能をたくさん持っています。
使ってみましょう。
animation controllerをつかってみる
現状では、人形prop(creative_prop)がanimation controllerを使うことができます。
以下のように利用していきます。
(※ここから先は完全な理解をしないで大丈夫です。スクリプトも提示するので数値をかえたりして変化を楽しむことをまずは優先されてください。)
- 位置情報、回転情報、時間情報などの情報をひとまとめにした配列を作成する(keyframe_delta型配列と呼びます)。
- creative_propについているAnimationControllerの情報を取得する(GetAnimationController)。
- 1で作成した配列を、AnimationControllerにセットし、再生を開始する(SetAnimation、Play)。
スクリプトは、以下のようになります。#メモで各行を説明しています。スクリプトをコピーして、セッションを開始してみてください。verseデバイスの詳細設定にて、propを指定することを忘れないでください。propは何でもよいです。
using { /Fortnite.com/Devices }
using { /Fortnite.com/Devices/CreativeAnimation }
using { /Fortnite.com/Devices/CreativeAnimation/InterpolationTypes }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /UnrealEngine.com/Temporary/Diagnostics }
AnimationControllerExample := class(creative_device):
#animation controllerはcreative_propで使える。
#人形とか好きなpropをUEFNでは設定してください。
@editable
PropToAnimate : creative_prop = creative_prop {}
#どんなイベントが起きるかここから書いていきます。
OnBegin<override>()<suspends>:void=
#これはなくても大丈夫です。開始して5.0秒後にイベントスタートしたいときに使います。
Sleep(5.0)
#ループでAnimateProp関数をつかいまわします。
loop:
AnimateProp()
#AnimateProp関数とはなにか
AnimateProp()<suspends> : void =
# キーフレームを取り扱っています。
# 位置情報や回転情報、拡大情報などをつかってキーフレームを設定します。
# どのくらいの時間でキーフレームに変化がおきるのか、どのくらいの加速度で変化するのかも情報としてまとめる
# 設定したキーフレームの情報をMovementKeyFrameへ格納します。
MovementKeyFrame: keyframe_delta = keyframe_delta
{
# PropToAnimateが、x軸に 200.0cm移動します。
DeltaLocation := vector3 { X:=200.0, Y:=1.0, Z:=1.0 }
# PropToAnimateが、 Z (Yaw)軸に 90.0度回転します。
DeltaRotation := MakeRotationFromYawPitchRollDegrees(90.0, 0.0, 0.0)
# PropToAnimateが、全方位に1.2倍拡大します。
DeltaScale := vector3 { X:=1.2, Y:=1.2, Z:=1.2 }
# 上記の作業をどれくらいで実行するか。0.5秒で実行する。
Time := 0.5
# interpolationはLinear(リニア)、EaseIn(イーズイン)、EaseOut(イーズアウト)
# Linearは動きの加速度に変化がなく進む。
# EaseInは動きの加速度は最初早い、後半で一気に失速する。
# EaseOutは動きの加速度は最初遅い、後半で一気に加速する。
# いずれも同じ時間に進む距離は同じになる。
Interpolation := EaseOut
}
#PropToAnimateで、GetAnimationControllerによってanimation controllerをつかいたいと宣言する。
if (AController := PropToAnimate.GetAnimationController[]):
# さきほどのキーフレームの情報MovementKeyFrameを配列としてFortVaderKeyFramesへ格納する。
FortVaderKeyFrames:[]keyframe_delta = array { MovementKeyFrame }
# animation controllerはクラスなので、アニメーションに関する機能をたくさん持っている。
# animation controllerがもつ機能で、SetAnimationはアニメーションを設定してくれる。
# アニメーションはキーフレームで設定された順番に実行されていく。
# animation_mode.OneShotのところ、OneShotを書き換えることができる。PingPongまたは、Loop
# OneShotは、アニメーションを一度再生したら停止する。
# PingPongは、最後のkeyframe_deltaに達した後、アニメーションを逆再生する。
# Loopは、アニメーションをループ再生する。この場合、アニメーションが始まったところで正確に終了する必要があります。
AController.SetAnimation(FortVaderKeyFrames, ?Mode:=animation_mode.OneShot)
#animation controllerがもつ機能で、Playはアニメーションの再生を開始または再開する。
AController.Play()
# ループする前に2.0秒待つ
Sleep(2.0)
ちなみに動画で使用している人形propはfortniteフォルダでDollsと検索するとヒットします。
セッションを開始すると、人形propが回転しながら一定方向に移動していくことがわかります。そして、少しずつ拡大している様子もうかがえます。狙い通りの結果がでています。大成功です。
まとめ
ご紹介したスクリプトは数値の部分などをいじり倒して変化を楽しんでください。移動する方向や、リニアをつかってみるとか、いろいろです。
animation controllerは自由な動きを表現してくれる心強い仲間です。いろいろな使いかたがありますので、引き続きご紹介してまいりたいと思います!
それでは、また。
お疲れ様でした。
ご質問やご感想はお気軽にコメント欄まで!