AnimationEventからの実行を禁止させる属性だとかはないんじゃないですかね...
ご質問者さんがおっしゃるような、直感的でない手段を使わないといけないかもしれません。ちょっと不格好ですが、
C#
1private void InitFromScript(bool dummyArg0 = false, bool dummyArg1 = false)
2{
3 Debug.Log("Do something");
4}
みたいにダミーの引数を追加して、InitFromScript
の引数の数が2個以上になるようにするというのはどうでしょう。
AnimationEvent
によるメソッド起動は引数が0個または1個でなければならないという制限があるようですから、これをAnimationEvent
から実行しようとすると失敗するはずです。
なお、SendMessage経由での実行にも引数が1個までの制限があるようですので、そちらもブロックしてしまうという弊害があるでしょう。また、安全性確保のためとはいえ、一見すると無意味な引数を追加するというのはメンテナンス性の観点からはいまいちかもしれません...
別案として、調査不十分ですがAnimationEvent
からのメソッド実行には呼び出し元が存在しないような感じなので...
C#
1using System.Diagnostics;
2using UnityEngine;
3using Debug = UnityEngine.Debug;
4
5public class Sample : MonoBehaviour
6{
7 private void InitFromScript()
8 {
9 var previousFrame = new StackFrame(1);
10 var caller = previousFrame.GetMethod();
11 if (caller == null)
12 {
13 Debug.Log("Invoked from AnimationEvent?");
14 return;
15 }
16
17 if (caller.Name == "SendMessage")
18 {
19 Debug.Log("Invoked by SendMessage?");
20 return;
21 }
22
23 Debug.Log("Do something");
24 }
25}
という風に直前のスタックフレームを調べてAnimationEvent
による実行なのか、SendMessage
による実行なのか、あるいはそれ以外なのかを識別できるかもしれません。
ですがこれはこれで、ビルドしたリリース版ではデバッグシンボルがなくて動作しない可能性があります(未確認です)。プレイモードのときだけ有効になるように条件付きコンパイルをさせる必要があるかもしれませんね。