unity缩小包体

去除不需要的aar和so和dll

  • 限制aar和so生效的平台,比如有些只需要在 Editor 平台下生效
    直接在文件属性中设置

  • 导出时根据条件设置是否需要

        public class ARCorePreprocessBuild : IPreprocessBuildWithReport
        {
            //  要过滤的插件
            static readonly string[] k_RuntimePluginNames =
            {
                "UnityARCore.aar",
                "ARPresto.aar",
                "arcore_client.aar"
            };
            public void OnPreprocessBuild(BuildReport report)
            {
                foreach (var plugin in PluginImporter.GetAllImporters())
                {
                    if (plugin.isNativePlugin && k_RuntimePluginNames.Any(pluginName => plugin.assetPath.Contains(pluginName)))
                    {
                        plugin.SetIncludeInBuildDelegate(path => isARCoreLoaderEnabled);
                    }
                }
            }
    
            internal static bool isARCoreLoaderEnabled
            {
                get
                {
                    //  你的条件判断
                    return true;
                }
            }
        }
    
  • 根据需要设置gradle依赖库
    比如在 mainTemplate.gradle 中

        dependencies {
            if ( project.file('libs/glasslocalizer-release.aar').exists() ){
                implementation 'com.rokid.uxrplugin:rkuxrplugin:1.0.4M'
            }
        }
    

去除不需要的程序集

  • 用宏定义限制程序集生效的条件
    在程序集属性的Define Constraints 中填入依赖的宏定义

  • 实现IFilterBuildAssemblies来根据条件过滤掉不需要的程序集

        public class RokidBuildProcessor : IFilterBuildAssemblies
        {
        readonly string[] runtimeAssemblyNames = new string[]
            {
                "RKAREngineAdapter.dll",
                "RKAREngine.dll",
                "RKSDK.dll",
                "EZXRGlassSDK.dll"
            };
    
            public string[] OnFilterAssemblies(BuildOptions buildOptions, string[] assemblies)
            {
                //  从  assemblies  中过滤掉你不需要的程序集
                return assemblies.Where(assembly =>
                {
                    foreach (var assemblyName in runtimeAssemblyNames)
                    {
                        if (assembly.Contains(assemblyName))
                            return false;
                    }
                    return true;
                }).ToArray();
            }
        }
    

裁剪代码

参考 代码裁剪

  • PlayerSettings->Managed Stripping Level 设置为 Medium
    设为Low裁剪得很少,程序集中只要有 MonoBehaviour 或 ScriptableObject 派生类,则整个程序集都不会被裁剪
  • 示例中的代码如何裁剪呢??
    因为示例中的代码包含有 MonoBehaviour 派生类,因此不管裁剪级别设为多高,这些类和用到的类都不会被裁剪

去除静态链接的资源

  • 移除不需要的场景

  • 如果某些资源只是在Editor模式下用到,那就不要用 Inspector 直接去关联
    可以通过建立一个 Editor 类,在运行时通过 AssetDatabase 查找资源并关联,这样这些资源就不会打包

        public class GameEditorSettingsLoader 
        {
            [RuntimeInitializeOnLoadMethod]
            public static void LoadGameEditorSettings()
            {
                string searchText = "t:GameEditorSettings";
                string[] assets = AssetDatabase.FindAssets(searchText);
                if (assets.Length > 0)
                {
                    string path = AssetDatabase.GUIDToAssetPath(assets[0]);
                    GameEditorSettings settings = AssetDatabase.LoadAssetAtPath(path, typeof(GameEditorSettings)) as GameEditorSettings;
                    GameEditorSettings.Instance = settings;
                }
            }
        }
    

去除Resources文件夹下的资源

Sprite合图

参考 合图

更多推荐