Unityで、C#スクリプトで設定した変数に[階層]画面からドラッグして設定する際に[Type mismatch]と表示されてしまう現象にハマったので対処法を備忘録的に投稿します。
変数を設定する際の[Type mismatch]
Unityで見かける罠は、沢山あります。私もかなり経験してきましたが、今回のも意味不明で解決するのに時間がかかりました。
例えば、C#スクリプトで Public 変数を追加するとコンポーネントとして追加したGameObjectの[インスペクター]画面に表示され[階層]画面からドラッグしたり、プロジェクト内のアセットを指定して変数の値として利用できます。
今回は[Prefab]化したアセットに設定した変数に[階層]からドラッグする際に型は合っているはずなのに[Type mismatch]が表示される現象にハマりました。
ドラッグがダメなら、一覧に表示されるプロジェクト内のアセットを指定しても、同様に[Type mismatch]が表示されてしまいます。
階層のルートを選択
先に原因を書いてしまうと、Prefab化したアセットの場合[階層]画面のルートを選択した[インスペクター]画面と、[プロジェクト]画面で[階層]画面で表示しているアセットを選択して表示された[インスペクター]画面は違うという罠です。
具体的に書くと、プロジェクト画面で Prefab化したアセットをダブルクリックなどで階層画面に表示しておきます。
[プロジェクト]画面でアセットを選択すると[インスペクター]が表示されます。この状態では[階層]画面内のGameObjectをドラッグしても[Type mismatch]になります。
Prefab化しているアセットの[階層]を表示した画面のルートを選択しても[インスペクター]に同じ画面が表示されます。
この状態だと[階層]画面内のGameObjectをドラッグして変数に設定できます。
原因が分かっても意味不明な動作ですが、同じ画面を表示するという仕様は高難易度のトラップでした。
推測になりますが、Prefab化(GameObjectをライブラリ化)しているので[プロジェクト]画面で表示した[インスペクター]では、ライブラリ内のGameObjectを変数として設定できない仕様の矛盾が生まれている気がします。
GameObjectをドラッグして変数に設定できない場合には[階層]画面のルートを選択して表示された[インスペクター]画面を使うことを覚えておくと、トラップを回避できるかもしれません。
まとめ
今回は短い記事ですが、C#スクリプトで設定した変数に[階層]画面からドラッグして設定する際に[Type mismatch]と表示されてしまう現象の対処法について書きました。
[プロジェクト]画面でアセットを選択して表示できる[インスペクター]画面の他に、[階層]画面のルートを選択しても[インスペクター]画面が表示されます。
特に、Prefab化したアセットの場合、表示方法でインスペクターが異なる挙動をするので注意が必要です。
Unityで[インスペクター]画面の変数設定時に[Type mismatch]が表示される人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。




