Unity 2021+SRDebugger 1.11.0で動的にデバッグオプションを構成するとInvalidCastExceptionが頻発する

TL;DR SRDebugger 1.12.1へアップデートしましょう

英会話学習メタバースfondiでエンジニアをしているmuoです
モバイル端末向けUnity開発でよく利用されるデバッグツールSRDebuggerの拡張メニュー実装時に若干ハマったので、記録がてら共有します

fondi開発チームではSRDebuggerを次のような用途で幅広く利用しています

  • 開発版アプリのデバッグログ+スクショをメール送信経由でSlackへ流す

    • 同、ログを実機上でフィルタしつつ確認

  • Unity Profilerを接続しない状態での簡易的なフレームレート傾向チェック

これらの標準機能に加え、SRDebuggerにはアプリ性質にあわせて機能を拡張し独自のデバッグメニューを実装する仕組みが用意されています
公式ドキュメント
今回は、アプリ起動後にデバッグメニューを動的構築したいパターンでした

C#的な実装面からみると、SRDebuggerのデバッグメニュー拡張には

  • SROptionのpartial classを実装してアセンブリ内に定義を組み込むパターン

  • 動的にOptionDefinitionインスタンスを登録してメニュー構築するパターン

の2つが用意されています
デバッグメニューも千差万別でアプリ起動時点で項目やメニュー構成を決められるものと、起動後のAPIサーバー通信結果類によって構成が動的に決まるもの両方があるので適切なSDK構成といえます

前掲の公式ドキュメントに記載のとおり、動的なメニュー構築方式はアプリ開発者からみると基本的にgetterとsetterをAction/Funcで渡しておくと値の初期化・変化時のメソッド呼び出しをほどよくやってくれる仕組みです

var option = OptionDefinition.Create("My Option", () => _someInternalField);
SRDebug.Instance.AddOption(option);

(getterのみを持つ最小限の例を公式ドキュメントより抜粋)

以前記事で言及したfondiのUnity 2021化の完了からしばらく経ち、SRDebuggerの動的メニュー構築機能がうまく動作していないことに気付きました(実際にはしばらく使っていなかったのでUnity 2020でも同様の挙動だった可能性はあります)
どのような型のデータを紐付けても、デバッグオプションタブを開く際に次のような例外が発生します

InvalidCastException: Specified cast is not valid.
SRDebugger.Editor.SROptionsWindow.OnGUI_Boolean (SRDebugger.OptionDefinition op) (at Assets/StompyRobot/SRDebugger/Scripts/Editor/SROptionsWindow.cs:306)
SRDebugger.Editor.SROptionsWindow.OnGUI_Property (SRDebugger.OptionDefinition op) (at Assets/StompyRobot/SRDebugger/Scripts/Editor/SROptionsWindow.cs:284)
SRDebugger.Editor.SROptionsWindow.OnGUI_Category (System.Collections.Generic.List`1[T] options) (at Assets/StompyRobot/SRDebugger/Scripts/Editor/SROptionsWindow.cs:249)
SRDebugger.Editor.SROptionsWindow.OnGUI () (at Assets/StompyRobot/SRDebugger/Scripts/Editor/SROptionsWindow.cs:233)
UnityEditor.HostView.InvokeOnGUI (UnityEngine.Rect onGUIPosition) (at /home/bokken/buildslave/unity/build/Editor/Mono/HostView.cs:448)
UnityEditor.DockArea.DrawView (UnityEngine.Rect dockAreaRect) (at /home/bokken/buildslave/unity/build/Editor/Mono/GUI/DockArea.cs:387)
UnityEditor.DockArea.OldOnGUI () (at /home/bokken/buildslave/unity/build/Editor/Mono/GUI/DockArea.cs:378)
UnityEngine.UIElements.IMGUIContainer.DoOnGUI (UnityEngine.Event evt, UnityEngine.Matrix4x4 parentTransform, UnityEngine.Rect clippingRect, System.Boolean isComputingLayout, UnityEngine.Rect layoutSize, System.Action onGUIHandler, System.Boolean canAffectFocus) (at /home/bokken/buildslave/unity/build/ModuleOverrides/com.unity.ui/Core/IMGUIContainer.cs:351)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&) (at /home/bokken/buildslave/unity/build/Modules/IMGUI/GUIUtility.cs:189)

公式サンプルに掲載されているコードでも同様の例外が発生するので、どうも基盤内の型処理におかしいところがありそうです

、、、と軽くコードを調べ始めたところで手元のSRDebuggerが最新版ではないと気付きました
もともと2021/06/02にリリースされた1.11.0を利用していたのですが、最新は2022/04/30にリリースされた1.12.1です(公式のchangelog

Asset Storeから1.12.1を入手して差し替えたところ、前述の例外は発生しなくなりました

この記事が気に入ったらサポートをしてみませんか?