UE4で「ランダムアイドルアニメーション」したい！

# UE4でランダムな待機モーションを設定したい
※この記事はUE4歴およそ半年の学生が書いています
~~もっと良い方法を知ってる方がいたら教えてほしいです~~ 






ふと、UE4で遊んでいるときに私はこう思いました


### ***待機モーションちゃっちいなぁ...***


なので、ランダムに遷移するアニメーションBPを作成しました。
動作はこんなかんじになってます
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ランダムにIdleアニメーションを切り替えてみた<br><br>なんで今まで挑戦してなかったのかわからん<br>やったことない事はもっと挑戦していこ<a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a><a href="https://twitter.com/hashtag/%E3%81%BE%E3%81%84%E3%81%AB%E3%81%A1UE4?src=hash&amp;ref_src=twsrc%5Etfw">#まいにちUE4</a> <a href="https://t.co/y2aNtBT2CE">pic.twitter.com/y2aNtBT2CE</a></p>&mdash; Sora (@kisa_sora) <a href="https://twitter.com/kisa_sora/status/1141603080535805952?ref_src=twsrc%5Etfw">2019年6月20日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


実装した環境はこちら
___
### ソフトウェアバージョン
* Windows10 (今回のノードには関係ないはず)
* Unreal Engine ver4.21

### 使用したアセット
・`MCO_Mocap_Basics`
___

今回使用したアセットは `MCO Mocap Basics` ですが、もちろん他のアセットやアニメーションでも可能です。

今回やることで大事なところは2点！

・`AnimationSequence`の**通知**を使う
・`Animationブループリント`で**通知イベント**を使う

<details><summary>以下での呼称</summary><div>
`[AnimationSequence = AnimSe]
 [Animationブループリント = AnimBP]`<br>
</div></details>

たったこれだけ、ではないですがおおよそこれだけです。
ほかは普通にAnimationBPを組んでいくだけです。



手順は以下の通り

1.AnimSeで `終了を通知するイベント`を設定する
2.AnimBPに`int型変数`を追加する
3.AnimBPで `終了イベント`を呼び出しておく
4.AnimBPの`アニムグラフ`で`ステート`をつくる
4.`ステート`内でアニメーションを`整数型でBlend`する
5.`終了イベント通知`発生時に、追加した`int型変数`を`Random intger in Range`でセットする。

ね？簡単でしょう。
では実際のノードを交えて簡単な説明を

## 1.AnimSeで `終了を通知するイベント`を設定する
AnimSeの機能に[**アニメーション通知**](https://api.unrealengine.com/JPN/Engine/Animation/Sequences/Notifies/index.html)というものが存在します。
めちゃくちゃ便利な機能ですが詳細は公式リファレンスからどうぞ。
ここではこの機能の中でも `カスタム通知`を使います

このように新規通知を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290523/910c69bc-f724-fcee-06d6-73a161929ed4.png)

**使用するすべてのIdleアニメーション**の終了する場所に通知を置きます。
アニメーションの終了する位置に通知を置くと下の画像のような見た目になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290523/cdda0687-23a2-1879-1507-0dcfb38143d3.png)

まず、終了イベントの設定は終了です。
## 2.AnimBPに`int型変数`を追加する
説明することもありませんね
普通に変数を追加するだけです。名前はお好みで！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290523/4eea90d8-d7f4-ee19-bb6a-7ecd291f842b.png)

## 3.AnimBPで `終了イベント`を呼び出しておく
手順１で作った終了通知を呼びます
私の場合はこのノード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290523/d2a1663d-db87-1843-a6cd-b5ac6217ab9d.png)
`AnimNotify_"自分でつけた名前"`のノードを呼び出すことができれば大丈夫

## 4.`ステート`内でアニメーションを`整数型でBlend`する
まずは、最終アニメーションポーズにつながるステートを
**作る！**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290523/b6f7ce6e-0138-4912-805f-7b7ecbe3cecd.png)

次に、ステートの中でIdle用のステートを
**作る！！**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290523/0cf4f09f-1928-9405-bd92-efbe7f4d58fe.png)
最後に
作った`Idle用のステート`の中に`使用したいIdleアニメーションをすべて`配置する
追加した`int型変数をGet`する
`整数値でのブレンドポーズ`(英語名は確認してませんが int blendで出ると思います)を配置
最初はピンが２つしかないので右クリックして追加する!
あとは画像のようにつなげて...
**作る！！！**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290523/c1166078-f5eb-d2db-53db-df9b83a1b29f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290523/73453af7-5461-5b2f-a2f4-d130821845b5.png)


## 5.`終了イベント通知`発生時に、追加した`int型変数`を`Random intger in Range`でセットする。
このように、終了イベントから実行ピンを伸ばして`int型変数`をセットする
setする値は　`使用するアニメーション数 - 1`を設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290523/e7068ddb-2026-9339-77f4-921de9c04dd2.png)

以上でもう`ランダムアイドルアニメーション`するようになります!
アニメーションの再生時間を取得したりせず、簡単に設定できる方法です。


## 感想
数が少ない場合はこの方法で十分だと思います。
しかし、アニメーションの数が増えると通知管理など大変になってくると思われるので
再生時間を取得して再生が終了するたびに再セットする、この方法のほうがいいかもしれないですね...。