UE4で手軽にキャラの『アレ』を揺らしてみる(Spring Controller)

僕はゲームエンジンでキャラの『アレ』を揺らすのが大好きです。

もうすでにさび付いた頭をフル活用してネットに転がっている情報を拾い、Unity、UE4でキャラの『アレ』が、やわらかくたゆんたゆんと揺れると感動すら覚えます。

そんな一部では永遠のテーマである揺れモノの実現方法として、UE4も様々な方法があります。
その方法の一つで、ある程度の揺れクオリティを実現できるSpring Controllerが、なぜか誰か書いた形跡がなかったので、折角だから書いてみることにしました。

検証は**UE4.19**で行っております。

#UE4で『アレ』を揺らす方法

UE4で揺れモノを揺らす方法として、オープンにしている情報では、先駆者（と勝手に呼ばせてもらっている）である、おかずさんがたくさん書いています。

[UE4の物理アセット ツール (PhAT)を使って、ユニティちゃんを揺らしてみた](http://pafuhana1213.hatenablog.com/entry/2014/11/13/215543)
[UE4のアニメーションの加算レイヤートラックを使って、ユニティちゃんをまた揺らしてみた](http://pafuhana1213.hatenablog.com/entry/2014/12/23/220028)
[UE4のAnim Dynamicsを使って、グレイちゃんを揺らしてみた](http://pafuhana1213.hatenablog.com/entry/2016/04/04/231026)

ただ、上記の物理や加算レイヤーを使う方法だと、設定や調整が結構手間です。
特に物理は結構荒ぶりやすいので、満足が行くように設定するのは（楽しいのですが）結構大変です。

もっと手軽に『アレ』が揺れる方法ないかなー、と思って色々と調べていたらSpring Controllerノードが見つかった、という感じです。

# 手軽な設定で『アレ』を揺らしてみよう

『アレ』を揺らすためにAnimation Blueprintのアニムグラフで、**Spring Controller**ノードを使います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/cc31d7a0-d383-fbaf-8873-1a7970a36313.png)

今回はユニティちゃんで『アレ』を揺らしてみました。

![unitychan2.gif](https://qiita-image-store.s3.amazonaws.com/0/104377/f1f46b3c-6d4b-d85a-2ee9-04a9e4bd1ed4.gif)

こんな感じです。いい感じにゆれてますねー。
公式ドキュメントはこちら：[Spring Controller](http://api.unrealengine.com/JPN/Engine/Animation/NodeReference/SkeletalControls/SpringController/)


##プロパティ

以下、SpringControllerのプロパティです。

| プロパティ       |    説明    |
|:-----------------:|:--------------------------|
|Spring Bone|スプリングを適用するボーン|
|Limit Displacement|有効時はMax Displacementの値までボーンが移動。<br/> 無効時はエンジン内部で制限なくボーンが伸びる|
|Max Displacement|ボーンが伸縮する最長距離。値が大きくなればなるほどボーンが伸縮される|
|Spring Stiffness|剛性。この値が大きくなればなるほど、ボーンの伸縮するのに必要なベロシティ（速度）が変わる<br/>ベロシティの計算はエンジン内部で行われる|
|Spring Damping|減衰。元のボーン位置に戻るためにフレームごとに引かれる数字。<br />この数値が大きくなればなるほど、揺れたらもとの位置に戻る時間が早くなる、もしくは揺れなくなる<br/>減衰の計算はエンジン内部で行われる|
|Error Reset Thresh|閾値。エンジン内部でこの値以上に伸縮された場合、強制的にリセットされる|
|Translate X|X座標に伸縮可能か|
|Translate Y|Y座標に伸縮可能か|
|Translate Z|Z座標に伸縮可能か|
|Rotate X|伸縮時にRollが回転可能か|
|Rotate Y|伸縮時にPitchが回転可能か|
|Rotate Z|伸縮時にYawが回転可能か|

色々と上記のプロパティを検証しているうちに、『アレ』を揺らすための大体の値がわかってきました。

| プロパティ       |    設定値   |
|:-----------------:|:--------------------------|
|Spring Bone|『アレ』のボーン|
|Limit Displacement|有効|
|Max Displacement|0～5<br/>6以上は不自然な伸び方になることが多かった|
|Spring Stiffness|0だと剛性がないので、とってもやわらかく『アレ』がゆれる<br/>個人的は100以下|
|Spring Damping|0.1～4、大きく設定しても最大値は10～30ほど<br/>少なくとも0は**元に戻らなくなるのでNG**|
|Error Reset Thresh|デフォルト値の256|
|Translate X|有効|
|Translate Y|ケースバイケース<br/>『アレ』が縮むような動作をしたら切ること推奨|
|Translate Z|有効|
|Rotate X|ケースバイケース<br/>『アレ』が自然な回転をするならチェックを入れてもOK|
|Rotate Y|ケースバイケース<br/>『アレ』が自然な回転をするならチェックを入れてもOK|
|Rotate Z|ケースバイケース<br/>『アレ』が自然な回転をするならチェックを入れてもOK|

自分が実装した限り、以下の通り、左右のボーンを一つだけSpring Controllerで設定すると自然な揺れ方をする場合が多かったです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/dd1cc0d8-778c-7cae-654d-06c602930015.png)

モデル、アニメーションよって最適なノード数、プロパティ設定値が違うので、参考程度にとどめてください。

## 実践してみた

『アレ』のボーンをSpring Controllerでゆらしてみました。

| Before       |    After    |
|:-----------------:|:------------------:|
|![unitychan1.gif](https://qiita-image-store.s3.amazonaws.com/0/104377/85543aca-292d-9e2c-5201-d4f5dce43e6b.gif)|![unitychan.gif](https://qiita-image-store.s3.amazonaws.com/0/104377/fc4ef9ca-dac6-ebf0-684d-f2ad39e15f0a.gif)|


ゆれてますねー！　デフォルトで用意されているノードを使っただけで、ここまでゆれるとは感動的です。

上記Gif画像の設定値は以下の通りです。ボーン以外の参考にしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/e14fe82b-caf6-5b8b-9e27-03d3c7484f87.png)

#Spring Controllerで『アレ』を揺らすときの欠点

Spring Controllerでかなり手軽に『アレ』を揺らせるので便利なのですが、揺れる速度の調整等、かゆいところに手が届かないのが欠点です。

また、キャラをコントローラーで動かす場合、変な揺れ方をする場合があります。
特にジャンプ（落下）した時に不自然な揺れ方をする場合が結構あります。

『もっと細かく揺らし方をしたい！！』『僕の理想の揺れとは違う！！』という場合は加算レイヤーや物理の設定、もしくはボーンを動かす計算を自前でするということになりそうです。

物理でやる場合は荒ぶりやすいので、おかずさんの記事を参考に頑張って調整してみてください。

[「UE4.18で生まれ変わった物理アセットエディタ(Physics Asset Editor)について」 と 「物理と少し仲良くなる方法について」 その1](http://pafuhana1213.hatenablog.com/entry/2017/12/13/000000)
[「UE4.18で生まれ変わった物理アセットエディタ(Physics Asset Editor)について」 と 「物理と少し仲良くなる方法について」 その2](http://pafuhana1213.hatenablog.com/entry/2017/12/13/000100)
[「UE4.18で生まれ変わった物理アセットエディタ(Physics Asset Editor)について」 と 「物理と少し仲良くなる方法について」 その3](http://pafuhana1213.hatenablog.com/entry/2017/12/13/003018)

Spring Controllerの揺れ調整は限界（どうしても細かい調整をSpringControllerだけでやりたい場合はエンジン改造するしかない）があるので、手軽に安易的に『アレ』を揺らすための方法、と思ってください。

それでは、よき揺れモノ実装ライフを！！

---
8/8追記

物理でアレを揺らしたいという方へ
NumericGazerさんの[Pixiv Fanbox](https://www.pixiv.net/fanbox/creator/17774908?utm_campaign=creator_page&utm_medium=share&utm_source=twitter)で支援すると、揺れモノの素晴らしい動画を見ることができます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">UE４の物理アセットは結構パラメーターが複雑なので、今すぐオッパイを揺らしたいおっぱいヘッズの皆さんは是非この動画をチェックしてください🤱<a href="https://t.co/GNzJgt8FLu">https://t.co/GNzJgt8FLu</a> … <a href="https://t.co/NTCOCy6Swe">pic.twitter.com/NTCOCy6Swe</a></p>&mdash; NumericGazer R-18 (@NumericGazer) <a href="https://twitter.com/NumericGazer/status/1024519935693733890?ref_src=twsrc%5Etfw">2018年8月1日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

最低100円で見れます。ワンコインで物理設定が見れるのは素晴らしいので、是非気になる方は支援してみてください。

---

© Unity Technologies Japan/UCL