ブログ

Unity でデバッグリソースを除外してビルドする

背景

  • Releaseビルドではデバッグリソースを除外したい
  • デバッグリソースの置き場所をどこにしようか迷う
  • Resourcesフォルダは非推奨なので使用したくない
    • Release版のビルド前処理でResourcesフォルダを一時移動させる方法は面倒
    • Addressableアセットシステムで IncludeResourcesFolders をOFFにする方法もあるが、他ライブラリでResourcesフォルダを使用しているケースもある

結論

  • Assets/Main/Debug 以下にデバッグリソースを配置
  • AddressableアセットシステムでDebugグループを用意
  • Release版切り替え時にDebugグループを削除し、アセットバンドルビルド
    • Develop版切り替え時にはデバッグリソースをインポートし、アセットバンドルビルド
    • BuildTarget切り替えの実装方法は こちら
  • AddressableAssetSettings.BuildPlayerContent() で自動ビルドできるが、Addressable のリモートアセット対応 が完了するまでは手動ビルドのほうがトラブルが少ない

Unity_Menu

コード例

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";
}

使用方法

  1. デバッグリソースは Assets/Main/Debug 以下に追加していく
  2. MyApp - BuildTarget からターゲットを切り替える
  3. Build Settings - Build でapk作成

 

-ブログ

© 2022 墾田ええねん! Powered by AFFINGER5