1. ホーム > 
  2.  IT

[tips]UnityでInvokeやDestroyがうまく動かない時のチェックポイント

2021/7/28 - IT, Tips

指定時間後に指定した関数を実行するとてもお手軽で便利なInvoke()ですが、ちょっとしたミスで意図したように動かないことがあります。(Destroy()の場合もご参考に)

原因の9割(自分調べ)

よくあるミスとしては第一引数の関数名が間違っているです。

Invoke(“関数名を文字列で指定“, 1.0f);

ここがただの文字列指定なのでスペルミスがあってもエラーとはならないんですね。
私はこういう発見しにくい凡ミスを避けるために関数名はコピペが基本だと思っています。

うっかりスペースが入ってるとか凡ミスも発生しがちな場所なのでまずはそれらを疑ってください。

レアだけど気づきにくい原因

関数名が間違っていないのに動かない場合、プログラムのどこかでTime.timeScale = 0とかやっちゃってませんか?
そして、時間停止のままInvoke()やDestroy()に来るような処理になってませんか?
Invoke()、Destroy()など第二引数に時間を指定した場合は時間経過で実行される関数なので、時間経過が止まっていたらInvoke()なども実行されないということになります。
よくよく考えたら当たり前なのですが、自分はこれに気づかずハマっちゃいました…

Invoke ()が動いているかのチェックで処理の直前にDebug.Log()を仕込む人も多いかもですが、関数名が間違ってなくてDebug.Log()も表示されるのにInvoke()のみが動かない場合はInvoke()の直前にTime.timeScale = 1f;とか入れてみてください。

もしもこれでInvoke()がきちんと動くようならTime.timeScaleとの兼ね合いによるミスになると思いますので、その辺りの処理をチェックすることになりますね。

これ、気づかずにデバッグでそうとうハマっちゃったので同じように困ってる人に届くといいな…

ほかの記事も読んでみてね!