渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

UnityタイムラインのAnimationEventを受け取る方法と罠


f:id:esakun:20150730215258g:plain

UnityのタイムラインとAnimationEventを組み合わせた場合の備忘録。

  • AnimationEventを仕込んだAnimationClipを用意
  • AnimationTrackに先のAnimationClipをセット

この場合、どうやってAnimationEventを受け取るか?

PlayableDirectorではなくAnimator側で受け取る

感覚的にはPlayableDirectorがアタッチされたGameObjectにレシーバーのコンポーネントをくっつけておけばイベントを取得できるかなーなんて思っていましたが、それだと以下のエラーが出ちゃいます。

'AnimationTrackにセットされたGameObject名' AnimationEvent 'AnimationEvent名' has no receiver! Are you missing a component?

エラー内容から分かるように、AnimationTrackにセットされたGameObjectにレシーバーコンポーネントをくっつけるのが正解です。

これで正しくイベントを受け取ることが出来ます。

バージョンの罠

Unityのバージョンによって、AnimationEventが発火しない致命的なバグが存在します。

Unity Issue Tracker - Event added to animation window, which is linked to sequence editor, doesn't get activated

こちらのissueにあがっていますが、Unity2017.2.0b10からUnity2017.3.1f1までの間はこのバグが存在するためタイムラインによるAnimationEventは使用できません。

Unity2017.3.1p1で対応が入っているので、それ以降のバージョンをお試しください。

Unity - Unity QA - Patch Releases

余談

ちなみにAnimationEventをテーマに記事を過去に書いてます。

AnimationEventはAnimationClip自体にイベントを仕込んで、それをプログラム側で取得する、アーティストとプログラマーの作業を分離させてくれる機能といえます。

実績的には、剣を振った時の衝突のタイミングにイベントし込んだりしました。便利っちゃあ便利です。

検証環境

  • Unity2017.3.1p4