UnityでAnimationEvent ‘*’ on animation ‘*’ has no receiver! が出た時の対処
追記
本記事は2023/09/15に内容をリライトしています。
概要
Unity Asset StoreでFreeのAnimationクリップを落としてきてモデルにアタッチしてSimpleAnimationを使って動かそうとしたところ以下のエラーが出ました。
AnimationEvent ‘Hit’ on animation ‘Attack1’ has no receiver! Are you missing a component?
このような場合の対処法について説明します。
発生事象
Unity Technologiesが提供するRobot KyleにExplosiveさんが提供されているWARRIOR PACK BUNDLE 3 FREEのAnimationを使って、Robot Kyleをカッコよく動かそうとしていました。
Robot Kyle
https://assetstore.unity.com/packages/3d/characters/robots/space-robot-kyle-4696#reviews
WARRIOR PACK BUNDLE 3 FREE
Karate WarriorのなかのAttack1
Animationを呼び出す方法としてはSimpleAnimationを使用して、Element3にAttack1を設定し、スクリプトから使用する方式をとりました。
そしてGameをスタートして実際にAttackを実行してみると、以下のようなエラーが発生しました。
‘Robot Kyle’ AnimationEvent ‘Hit’ on animation ‘Attack1’ has no receiver! Are you missing a component?
原因
このようなエラーが発生する要因としては使用しているAnimationにAnimationEventが設定されていることが挙げられます。
AnimationEventが設定されている場合、スクリプト側でそれらのAnimationEventが使われていなかったりすると上記のようなエラーを吐きます。
これらの対処法としては2つあります。
対処法1
基本的にはこの対処法がおすすめです。
一つ目はAnimationEventをしっかりとスクリプトないで呼び出す方法です。
といってもAnimationEventを使って特に何かしたいわけではない場合には単位関数だけ呼び出せばエラーが消えます。例えば以下のエラーが出ている場合は”Hit”というAnimationEventに対応する関数が不足しています。
AnimationEvent ‘Hit’ on animation ‘Attack1’ has no receiver! Are you missing a component?
そのため、以下のような関数定義をスクリプトの中に記載してやることでエラーが消えます。
void Hit() {
}
対処法2
二つ目はAnimationEvent自体を削除してしまう方法です。
Animationのコピー
直接元のAnimationの’Hit’を削除してしまってもいいのかもしれませんが、オリジナルに手を加えるのは不安なので、Animationをコピーしてから’Hit’を削除することにします。
コピーするAnimationが入った塊(FBX)を選択した状態でCtrl + Dを押すとコピーが生成されます。これをF2キーで任意の名前に変更します。
Hitイベントの削除
次にコピーしたAttack1のAnimationを選択し、Inspectorタブを開きます。
Inspectorタブの右上にEditがあるのでこちらをクリックします。
Inpsectorタブの下のほうにEventメニューがあるので、これを展開します。
Eventメニューを開くと一見して何もEventが無いように見えますがよく見ると0.2秒付近にマークがあります。これがEventでした。
このEventを右クリックしてDelete Animation Eventを選択します。
削除に下のApplyボタンを押します。Applyを押さないと、エラーが解消されない時があったので忘れずに押します。
Roboto KyleにAttachしているSimpleAnimationで呼び出すAttack1を’Hit’を削除した修正版に置き換えます。
そしてGameを実行して再度確認します。
再度Gameで確認
対処法の1または2を施した後、無事にエラーなくAttack1 Animationが実行されるようになれば成功です。
以上
Unityを一から学ぶのにおすすめの本はコチラ