質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3358閲覧

UnityのAnimation Eventから特定の関数が呼ばれないようにする方法

ninogojo32

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/11/24 09:29

編集2020/11/24 12:17

Animation eventから呼べる関数を制限する方法についてご存知のことがあれば教えていただきたいです.
例えば

c#

1public class Sample : Monobehaviour 2{ 3 private void InitFromAnimation(){} 4 private void InitFromScript(){} 5}

というスクリプトをアタッチしたオブジェクトのアニメーションからは"InitFromScript"は実行できず,"InitFormAnimation"のみ実行できるようにしたいです.

Animation eventではアニメーションクリップに設定した関数しか実行されませんが,(私の認識が正しければ)Animation eventの設定次第ではSampleクラス内のすべての関数が呼び出されてしまう可能性があると思います.
ただ,安全性やメンテナンス性を考えるとAnimation eventで呼べる関数は制限したいと考えています.

このような場合,"InitFromScript"の引数をシリアライズ(?)できないクラスにしたりなどで制限するしかないのでしょうか.

Unityのバージョンは2018.4.23f1です.

よろしくお願いします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ninogojo32

2020/11/24 12:05

すいません.言葉足らずでした. ご指摘の通りAnimation eventでは事前に設定しなければ関数は実行されないのですが,Animation eventの設定次第ではSampleクラス内のすべての関数が呼び出せてしまいます. ただ,安全性というかメンテナンス性を考えるとAnimation eventで呼び出せる関数は制限したいと考えたのでこのような質問を投稿しました.
guest

回答1

0

ベストアンサー

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による実行なのか、あるいはそれ以外なのかを識別できるかもしれません。
ですがこれはこれで、ビルドしたリリース版ではデバッグシンボルがなくて動作しない可能性があります(未確認です)。プレイモードのときだけ有効になるように条件付きコンパイルをさせる必要があるかもしれませんね。

投稿2020/11/24 20:45

Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ninogojo32

2020/11/25 03:40

回答ありがとうございます! 呼び出し元をたどる方法は知らなかったのでとても参考になりました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問