Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【Unity】リリース時にデバッグ用リソースをちゃんと消す方法

Haruki Yano
October 24, 2022

 【Unity】リリース時にデバッグ用リソースをちゃんと消す方法

Haruki Yano

October 24, 2022
Tweet

More Decks by Haruki Yano

Other Decks in Technology

Transcript

  1. はじめに リリースビルドからはデバッグ用の諸々を綺麗に確実に削除しようというお話 • ソースコード - e.g. チートコマンド • アセット -

    e.g. デバッグ用のResourcesフォルダ • シーン上のオブジェクト - e.g. SRDebuggerのPrefabインスタンス そのために使うべきUnityの機能をまとめます。
  2. IPreprocessBuildWithReport • プレイヤービルドの前処理を記述できる • 同様に後処理を記述する IPostprocessBuildWithReport もある using UnityEditor.Build; using

    UnityEditor.Build.Reporting; public sealed class PreprocessBuild : IPreprocessBuildWithReport { public int callbackOrder => 0; public void OnPreprocessBuild (BuildReport report) { // ビルド前の処理を書く } }
  3. IProcessSceneWithReport • シーンをビルドしたりアセバン化したりエディタで再生する時に処理を加えられる • プレイヤービルド時には IPreprocessBuildWithReport よりも後に呼ばれる using UnityEditor; using

    UnityEditor.Build; using UnityEditor.Build.Reporting; using UnityEngine.SceneManagement ; public sealed class ProcessScene : IProcessSceneWithReport { public int callbackOrder => 0; public void OnProcessScene (Scene scene, BuildReport report) { // エディタで再生した時には実行しない if (EditorApplication .isPlaying) return; // シーン上のオブジェクトを削除したりできる } }
  4. #if 〜 #endif • よくあるやつ • コードを条件に応じてコンパイルする/しない • Scripting Define

    Symbols などで定義されているシンボルに応じてコンパイルされる かが決まる #if DEVELOPMENT_BUILD // DevelopmentBuildがOnの時の処理 #else // DevelopmentBuildがOffの時の処理 #endif
  5. デバッグ用モジュールを参照しているコードにも設定 • #if 〜 #endif で • Conditional という手もある •

    ビルド前にスクリプトごと削除(移動)してもOK private void Example() { #if DEBUG_ENABLED FPSCounter.Instance.Setup(); #endif }
  6. 1. デバッグ系のスクリプトを削除・無効化 • IPreprocessBuildWithReport を使う • 物理削除する場合 ◦ 正確には削除ではなく移動し、IPostprocessBuildWithReport で戻す

    ◦ もちろんmetaファイルも一緒に • #if 〜 #endif や asmdef の Define Constraints などを使う場合 ◦ Scripting Define Symbols を追加・削除する ◦ PlayerSettings.SetScriptingDefineSymbolsForGroup() • 依存関係を意識して処理順を設定しないとビルドエラー(コンパイルエラー)になる ので注意 ◦ IPreprocessBuildWithReport.callbackOrder で処理順を指定できる ◦ 数値が小さいほど早い段階で処理される
  7. 3. シーン上のオブジェクトを削除 • IProcessSceneWithReport を使う ◦ GameObject名やコンポーネント名で判定して消したり ◦ Debug タグをつけておいてタグで判定して消したり

    ◦ その辺りは自由に • プロジェクトのシーンアセットに変更は加わらない ◦ 普通に Object.DestroyImmediate で削除すればOK
  8. ライブラリがあったらいいよね • 指定したリソースをビルド前に移動、ビルド後に戻す • 指定した Scripting Define Symbols を有効化・無効化する •

    処理順を指定できる ◦ コンパイルエラーにならないように • 指定したシーン上のオブジェクトを削除 ◦ 指定方法はGameObject名とかタグ名とか選べる • いくつかプロファイルを持てる ◦ デバッグ用、リリース用、その他諸々の環境用・・ • 使いやすいGUIでいい感じに設定できる(重要) ◦ 保守性 ◦ GUI 作らないならライブラリにするほどの話でもない ▪ Undo/Redo、ドラッグで並び替え、スクリプトからも全ての操作が可能、etc..