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