ゲームコントローラの機能とキーのアイコンとを結びつけて、キーのバインディングが変更されたらアイコンを変更するクラスを設計していた。ゲームコントローラの種類(XboxやPlayStationなど)毎にキーとアイコンを対応させる変数を作り、インスペクターで設定するようにした。
[System.Serializable]
public struct ButtonIDToIcon {
public GamepadButtonID buttonID;
public Sprite iconSprite;
}
[System.Serializable]
public struct IconOfGamepadButton {
public GamepadFamily gamepadFamily;
public ButtonIDToIcon[] buttonIDToIcon;
}
[Header("Gamepad Key Image")]
[SerializeField]
public IconOfGamepadButton[] iconOfGamepadButtonDefine;
配列の要素に structを定義しているのは、Dictionary型がインスペクターに対応していないための苦肉の策。
このクラスをコンポーネントとしたオブジェクトにインスペクターから値を設定しデバッグを開始すると、なぜかiconOfGamepadButtonDefineのアクセスで Nullエクセプションが発生する。
色々調査したが分からなかったのでソースコードをつけて Copilotにエラー原因を聞いてみた。すると回答として、Unityではインスペクターでのstructの扱いにエラーがあるのでclassに変更するよう回答があった。これに従い、修正したがエラーが改善されない。
そこで今度は Gemini3に聞いてみたところ、インスペクターで設定しているのとは別のコンポーネントが別に無いか、と回答があった。調べると、このクラスの初期テスト時に作成したオブジェクトが残っており、そこには値が設定されていなかった。
実に初歩的なミスだが指摘されなければ気づけなかった。今回は Geminiの勝利という記事。