背景
- Releaseビルドではデバッグリソースを除外したい
- デバッグリソースの置き場所をどこにしようか迷う
- Resourcesフォルダは非推奨なので使用したくない
- Release版のビルド前処理でResourcesフォルダを一時移動させる方法は面倒
- Addressableアセットシステムで IncludeResourcesFolders をOFFにする方法もあるが、他ライブラリでResourcesフォルダを使用しているケースもある
結論
- Assets/Main/Debug 以下にデバッグリソースを配置
- AddressableアセットシステムでDebugグループを用意
- Addressable の使い方は こちら
- Release版切り替え時にDebugグループを削除し、アセットバンドルビルド
- Develop版切り替え時にはデバッグリソースをインポートし、アセットバンドルビルド
- BuildTarget切り替えの実装方法は こちら
- AddressableAssetSettings.BuildPlayerContent() で自動ビルドできるが、Addressable のリモートアセット対応 が完了するまでは手動ビルドのほうがトラブルが少ない
コード例
using UnityEditor; using System.Linq; using UnityEditor.AddressableAssets.Settings; [InitializeOnLoad] public class EditorMyAppMenu { static EditorMyAppMenu() { EditorApplication.update += calc; } public enum EBuildTarget { Develop, Release } private static void calc() { // Develop/Releaseメニューが有効になったが両方にチェックが入っていない場合は、Rspファイルを参照してどちらかにチェックを入れる // コンストラクタではメニューが構築されておらず、Menu.SetChecked できないので、calc でポーリングしている if (Menu.GetEnabled(cMenu_BuildTarget_Develop) && Menu.GetEnabled(cMenu_BuildTarget_Release) && !Menu.GetChecked(cMenu_BuildTarget_Develop) && !Menu.GetChecked(cMenu_BuildTarget_Release)) { EBuildTarget curBuildTarget = getBuildTargetFromRsp(); if (curBuildTarget == EBuildTarget.Develop) OnBuildTarget_Develop(); else if (curBuildTarget == EBuildTarget.Release) OnBuildTarget_Release(); else throw new System.Exception("[EditorMyAppMenu] Illigal BuildTarget"); ; } } [MenuItem(cMenu_BuildTarget_Develop)] private static void OnBuildTarget_Develop() { // チェックマークを付ける Menu.SetChecked(cMenu_BuildTarget_Develop, true); Menu.SetChecked(cMenu_BuildTarget_Release, false); // PlayerSettingsの設定(Androidの場合。iOS も必要であれば追記する) var group = BuildPipeline.GetBuildTargetGroup(UnityEditor.BuildTarget.Android); PlayerSettings.SetManagedStrippingLevel(group, ManagedStrippingLevel.Low); PlayerSettings.SetApplicationIdentifier(group, "com.konden.myapp.develop"); PlayerSettings.productName = "Develop"; // slnファイルを削除 deleteSln(); // rspファイルを上書き保存 createRsp("-define:DEVELOP"); // デバッグリソースをインポート AddressableImporter.FolderImporter.ReimportFolders(new string[] { "Assets/Main/Debug" }); } [MenuItem(cMenu_BuildTarget_Release)] private static void OnBuildTarget_Release() { // チェックマークを付ける Menu.SetChecked(cMenu_BuildTarget_Develop, false); Menu.SetChecked(cMenu_BuildTarget_Release, true); // PlayerSettingsの設定(Androidの場合。iOS も必要であれば追記する) var group = BuildPipeline.GetBuildTargetGroup(UnityEditor.BuildTarget.Android); PlayerSettings.SetManagedStrippingLevel(group, ManagedStrippingLevel.Low); PlayerSettings.SetApplicationIdentifier(group, "com.konden.myapp"); PlayerSettings.productName = "MyApp"; // slnファイルを削除 deleteSln(); // rspファイルを上書き保存 createRsp(""); // デバッグリソースを削除 deleteAssetGroup("Debug"); } private static void deleteSln() { System.IO.FileInfo fileInfo = new System.IO.FileInfo("MyApp.sln"); fileInfo.Delete(); } private static void createRsp(string text) { System.IO.StreamWriter sw = new System.IO.StreamWriter("Assets/csc.rsp", false); sw.WriteLine(text); sw.Flush(); sw.Close(); } private static EBuildTarget getBuildTargetFromRsp() { EBuildTarget ret = EBuildTarget.Develop; System.IO.StreamReader sr = new System.IO.StreamReader("Assets/csc.rsp"); string text = sr.ReadToEnd(); if (text.Contains("-define:UNDER_DEVELOP")) ret = EBuildTarget.Develop; else ret = EBuildTarget.Release; sr.Close(); return ret; } private static AddressableAssetSettings getSettings() { var guidList = AssetDatabase.FindAssets("t:AddressableAssetSettings"); var guid = guidList.FirstOrDefault(); var path = AssetDatabase.GUIDToAssetPath(guid); var settings = AssetDatabase.LoadAssetAtPath<AddressableAssetSettings>(path); return settings; } private static void deleteAssetGroup(string groupName) { var settings = getSettings(); var group = settings.FindGroup(groupName); settings.RemoveGroup(group); } private const string cMenu_BuildTarget_Develop = "MyApp/Build Target/Develop"; private const string cMenu_BuildTarget_Release = "MyApp/Build Target/Release"; }
使用方法
- デバッグリソースは Assets/Main/Debug 以下に追加していく
- MyApp - BuildTarget からターゲットを切り替える
- Build Settings - Build でapk作成