タイムラインを使ってアクタを滑らかに動かす[TimeLine,Set Actor Location,Set Actor Rotation]

目次

タイムラインを作成する

  • 全体の長さは2秒。
  • 0秒から1秒の間に値が0から200に進み、1秒から2秒の間に200から0に進む。
  • 上部の矢印を選択してループさせる

Set Actor Locationでアクタを移動する

アクタをZ軸方向に動かす

  • タイムラインの出力値をMake VectorのZに接続して、Z軸だけ動くVectorを作る。
  • Make Vectorで作成したVectorをSet Actor Locationに接続する。

プレイすると設置したアクタがZ軸方向に移動する。

Make VectorのX,Yに0を設定しているため、アクタをどの位置に配置していてもゲームを開始すると(0,0,0)から(0,0,200)の間を移動することになる。

アクタの位置を取得する

レベル上に配置しているアクタの位置を移動開始位置にするためにアクタの位置を取得する。

  • Get Actor Locationノードでアクタの位置を取得する。
  • 取得した値は変数化しておく。
  • 変数化するには出力ピンから引っ張って「変数へ昇格」を押す。
  • 変数化すると「マイブループリント」タブの「変数」の項目に新しく追加される。
  • 追加した変数は名前やタイプを変更できる。
  • コンパイルするとデフォルト値の設定ができるようになる。
  • 今回は「StartLocation」という名前にしている。
  • 追加した変数に値を設定するために、変数をドラックアンドドロップして表示されるメニューから「Set~」を選択してセッタ(変数に値を設定するノード)を追加する。

セッタはAltを押しながら変数をドラッグすることでも追加できる。

  • ゲーム開始時のアクタの位置を取得するために「イベントBeginPlay」の後に接続する。
  • 変数に設定した値を取得するにはゲッタ(変数から値を取得するノード)を使用する。
  • ゲッタは変数をドラッグアンドドロップしてでてくるメニューから「Get~」を選択する。

セッタはCtrlを押しながら変数をドラッグすることでも追加できる。

取得したアクタの位置からVectorを作成する

  • Start LocationにBreak Vectorノードを接続して要素を分解する。
  • Breakして取得したX,Yの値をMake Vectorに接続する。
  • アクタを座標(100,100,0)に配置する。
  • プレイすると配置した位置から動いていることがわかる。
  • 現在の状態だとアクタの開始位置に関わらずZ軸が0-200の値で動いてしまうので修正する。
  • ゲーム開始時のアクタのZ座標にタイムラインの値を加えるようにする。
  • アクタを(100,100,100)に配置する。
  • これでアクタを配置した位置から移動できるようになった。

タイムラインのグラフを変更する

  • アクタの移動に緩急をつけるため、タイムラインのグラフを変更する。
  • グラフのキーを選択してキー補完を「自動」に設定する。
  • 全てのキーを自動にする。
  • 上限下限での動きが滑らかになった。
  • もっと動きにメリハリをつけたくなったので再度グラフを修正する。
  • キーを増やして角度を変えてみる。
  • より緩急がついた。

Lerpを利用する

  • タイムラインに移動する値を直接設定していると、変更する場合にグラフのキーの値を全て変更しなければいけなくなる。
  • これを解消するためにLerpノードを使用する。
  • タイムラインの出力値を0から1の間にするため、最大値が1となるタイムラインを作成する。
  • タイムラインの出力をLerpノードに接続する。
  • Lerpに設定したAとBの間の値を補完して出力してくれる。
  • 今回動かしたアクタと同じ動きにするにはAに0、Bに200を設定する。
  • 値を変更するにはLerpのAとBの値を変更すればよい。
  • LerpのAとBを変数に昇格し、変数をインスタンス編集を可能にしておくことでレベル上に配置したアクタから値を設定することができるようになるので便利。

Set Actor Rotationでアクタを回転させる

アクタをYaw回転させる

  • 回転といえばドアなのでドアのメッシュを設定したアクタを使用する。
  • アクタは座標(0,0,0)に回転(0,0,0)の状態で設置する。
  • ドアが開いているように見せるにはZ軸中心に回転(Yaw)させればよさそう。
  • 1秒間で90度開き、その後1秒間で閉じるようにする。
  • タイムラインは1秒間で0から1、その後1秒間で1から0の値を出力する。
  • 矢印をクリックしてループさせる。
  • タイムラインの出力をLerpに接続する。
  • 0度から90度まで回転させるのでLerpのAに0、Bに90を設定する。
  • アクタをZ軸中心のYaw回転させるため、Lerpの出力をMake RotatorのZに接続する。
  • Make RotatorのX,Yには0を設定して回転しないようにする。
  • Make Rotatorの出力をSet Actor Rotationに接続する。
  • ドアが開閉しているアニメーションができた。
  • 回転させるだけなのでアクタを配置する位置はどこであっても問題は無い。
  • 画像のようにアクタを傾けて設置した場合、ゲームを開始するとX,Yの回転は0固定なので傾きが戻ってしまう。

アクタの回転情報を取得する

  • ゲーム開始時のアクタの傾きを保持するために処理を変更する。
  • 開始時のアクタの回転情報をGet Actor Rotationノードから取得する。
  • 取得した情報は変数にセットする。
  • 開始時のアクタの回転X,YをMeke Rotatorに設定する。
  • プレイすると傾いた状態は保持されているが、傾いたままZ軸中心に回転している。
  • 解消するにはアクタ自身のローカル空間のZ軸でYaw回転させる必要がある。

Set Relative Rotationで回転させる

  • Set Relative Rotationは親に対して相対的に回転させるノード。
  • ドアのメッシュをSet Relative Rotationに接続する。
  • X,Yは回転させなくてよいので0を設定する。
  • 傾いた状態でいい感じに回転した。

Set Relative Rotationを使用してもアクタがワールド座標のZ軸に対して回転する場合

  • ブループリントを作成した時点では「DefaultSceneRoot」がルートコンポーネントになっている。
  • この状態でメッシュを追加した場合は子として追加されるので、Set Relative Rotationで親に対してローカル座標で回転する。
  • ルートコンポーネントは別のコンポーネントをドラッグアンドドロップして置き換えることができる。
  • 回転させるメッシュをルートコンポーネントに置き換えると自身が親になるのでSet Relative Rotationを使用するとワールド座標との相対回転になる。
  • 自身が親になっている場合は他のコンポーネントで置き換える必要がある。
  • 例えばスタティックメッシュを追加して、それを現在のルートコンポーネントにドラッグして置き換える。この状態Set Relative RotationでSM_Doorを回転させると追加したメッシュを親として相対的に回転する。
  • 追加したメッシュはHidden in Gameで見えなくしたりとか。

他に方法があるかもなのでわかったら追記したい。

コメント

コメントする

目次