[unity]UnassignedReferenceException: 設定してるフィールドが設定されてない…何をいってるかわからn

わかればなんてことはない問題ではありますが、「初心者うっかり」だったら結構ハマるかもしれないな…と思いデバッグの手順を記事にしてみました。
一つずつ問題を詰めていく手順も(恥ずかしいですが)載せておきます。

UnassignedReferenceException: The variable CanvasGroup of DDisp has not been assigned.
You probably need to assign the CanvasGroup variable of the DDisp script in the inspector.

ログにはこんなエラー。翻訳すると「DDispのCanvasGroupが設定されてないよ! インスペクタの設定し忘れかもね?」といったところでしょうか。

インスペクタを確認

ところが、確認すると設定されている。

「インスペクタで設定してても、Awake で拾えないルールとかあったっけ…?」とか見当違いな憶測を立てつつ、デバッガでブレークポイントを貼ってみます。

Awake、Start、OnEnable には随分といじめられた

デバッガで指(マウスカーソル)さし確認

確かに null になっている。
Start だとどうかな? と F5実行 でブレークを進めてみる。

あれれー、おっかしいなぁ? もう一回 Awake が実行されて、値が入ってるんだけどー?

そう。
1つのGameObjectにアタッチしたつもりが2つのGameObjectに間違えて設定していた模様。
(1つのGameObjectに2つアタッチしちゃうことも稀によくある)

FindObjectsOfType で全てのアタッチされたオブジェクトを確認

どこに間違えて設定したか検討つけばいいんですが、間違えて設定した場合は検討がつきません。
シーンに大量の GameObject があったりしたら、目視で探すのは現実的ではないので、FindObjectsOfType<DDisp>() を使います。

こうすれば、シーン内で DDisp がアタッチされた全ての GameObject を確認できます。

今回の場合、DDisp 以外に PerformanceMeter という GameObject にもアタッチしていたようです…。
インスペクタで何も設定してないし、エラーが出るわけだ。

と、いうわけで PerformanceMeter の DDisp を消したところ、無事に動くようになりました。

返信を残す

メールアドレスが公開されることはありません。

CAPTCHA