From bc5f12ed8858b8559292e3d2397add86b8f587b9 Mon Sep 17 00:00:00 2001 From: ALEXTANG <574809918@qq.com> Date: Fri, 10 Feb 2023 12:11:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E8=B5=84=E6=BA=90MD5?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E9=97=AE=E9=A2=98=E4=BF=AE=E6=AD=A3=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=96=AD=E7=82=B9=E7=BB=AD=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 下载资源MD5校验问题修正,支持断点续传 --- Assets/TEngine/EntryPrefab/TEngine.prefab | 51 +- .../Editor/AssetBundleBuild/Builder.cs | 963 ++++++++++-------- .../AssetBundleBuild/BuilderInjectorMoment.cs | 24 +- .../AssetBundleBuild/Editor/BuilderEditor.cs | 59 +- .../Res/DefaultResourcesHelper/AssetConfig.cs | 4 +- .../DefaultResourceHelper.cs | 5 + .../Scripts/Runtime/Core/Res/TResource.cs | 1 + .../Runtime/Core/Version/GameConfig.cs | 18 + .../GameProcedure/ProcedureCodeInit.cs | 2 - .../GameProcedure/ProcedureResourcesInit.cs | 4 +- .../GameProcedure/ProcedureStartGame.cs | 2 +- .../Scripts/Runtime/HotUpdate/Config.txt | 2 +- .../Scripts/Logic/DownloadHandlerFileRange.cs | 4 +- .../HotUpdate/Scripts/Logic/DownloadImpl.cs | 14 +- .../Runtime/HotUpdate/Scripts/UI/UILoadMgr.cs | 21 +- .../Scripts/Runtime/TEngine.Runtime.asmdef | 3 +- 16 files changed, 688 insertions(+), 489 deletions(-) diff --git a/Assets/TEngine/EntryPrefab/TEngine.prefab b/Assets/TEngine/EntryPrefab/TEngine.prefab index 1688ac40..9c41444f 100644 --- a/Assets/TEngine/EntryPrefab/TEngine.prefab +++ b/Assets/TEngine/EntryPrefab/TEngine.prefab @@ -336,7 +336,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bc449de9a177d854181ed6d829a72ada, type: 3} m_Name: m_EditorClassIdentifier: - ResourceMode: 1 + ResourceMode: 2 m_ResourceHelperTypeName: TEngine.Runtime.DefaultResourceHelper m_CustomResourceHelper: {fileID: 0} --- !u!1 &3463045026180535776 @@ -374,6 +374,7 @@ Transform: - {fileID: 3463045025307533286} - {fileID: 1672025514} - {fileID: 96376812} + - {fileID: 5650366479353104569} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -427,6 +428,54 @@ MonoBehaviour: - TEngine.Runtime.ProcedureResourcesInit - TEngine.Runtime.ProcedureResourcesUpdate - TEngine.Runtime.ProcedureResourcesVerify + - TEngine.Runtime.ProcedureRunPuerts - TEngine.Runtime.ProcedureSplash - TEngine.Runtime.ProcedureStartGame m_EntranceProcedureTypeName: TEngine.Runtime.ProcedureLaunch +--- !u!1 &5455811614053608841 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5650366479353104569} + - component: {fileID: 9103295844223457350} + m_Layer: 0 + m_Name: PuertsMgr + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5650366479353104569 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455811614053608841} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 3463045026180535779} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &9103295844223457350 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455811614053608841} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7135f85bd7cf44f694f817356b03519e, type: 3} + m_Name: + m_EditorClassIdentifier: + WaitForDebugger: 0 + RunOnAwake: 0 + DebuggerRoot: G:/1_WorkSpace/TEngine_Custom/Assets/TResource/PuertsScripts + DebuggerPort: 5556 diff --git a/Assets/TEngine/Scripts/Editor/AssetBundleBuild/Builder.cs b/Assets/TEngine/Scripts/Editor/AssetBundleBuild/Builder.cs index 35b353cb..00145343 100644 --- a/Assets/TEngine/Scripts/Editor/AssetBundleBuild/Builder.cs +++ b/Assets/TEngine/Scripts/Editor/AssetBundleBuild/Builder.cs @@ -15,520 +15,623 @@ using Debug = UnityEngine.Debug; namespace TEngineCore.Editor { - public class Builder : IBuilder - { - internal static readonly Builder Instance = new Builder(); + public class Builder : IBuilder + { + internal static readonly Builder Instance = new Builder(); - /// - /// 数据部分 - /// - internal BuilderEditor CurBuilderData; + /// + /// 数据部分 + /// + internal BuilderEditor CurBuilderData; - /// - /// AB构建器 - /// - internal AssetbundleBuilder AssetbundleBuilder = new AssetbundleBuilder(); + /// + /// AB构建器 + /// + internal AssetbundleBuilder AssetbundleBuilder = new AssetbundleBuilder(); - /// - /// 设置当前的BuidlerConfigData - /// - /// - /// - public void SetBuilderConfig(BuilderUtility.PlatformType platform, string configName, string configPath = "") - { - CurBuilderData = BuilderUtility.LoadConfig(platform, configName, configPath); - if (CurBuilderData == null) - { - TLogger.LogError("未找到配置,config:" + configName); - Process.GetCurrentProcess().Kill(); - } + /// + /// 设置当前的BuidlerConfigData + /// + /// + /// + public void SetBuilderConfig(BuilderUtility.PlatformType platform, string configName, string configPath = "") + { + CurBuilderData = BuilderUtility.LoadConfig(platform, configName, configPath); + if (CurBuilderData == null) + { + TLogger.LogError("未找到配置,config:" + configName); + Process.GetCurrentProcess().Kill(); + } - CurBuilderData.platform = platform; - } + CurBuilderData.platform = platform; + } - /// - /// 设置当前的BuidlerConfigData - /// - /// - /// - public void SetBuilderConfig(BuilderEditor tmpBuilder) - { - CurBuilderData = tmpBuilder; - } + /// + /// 设置当前的BuidlerConfigData + /// + /// + /// + public void SetBuilderConfig(BuilderEditor tmpBuilder) + { + CurBuilderData = tmpBuilder; + } - /// - /// 切换平台 - /// - /// - public void SwitchPlatform(BuilderUtility.PlatformType platform) - { - if (CurBuilderData == null) - { - TLogger.LogError("未设置BuilderData,请先调用接口:SetBuilderConfig"); - return; - } - CurBuilderData.platform = platform; - switch (CurBuilderData.platform) - { - case BuilderUtility.PlatformType.Windows: - { + /// + /// 切换平台 + /// + /// + public void SwitchPlatform(BuilderUtility.PlatformType platform) + { + if (CurBuilderData == null) + { + TLogger.LogError("未设置BuilderData,请先调用接口:SetBuilderConfig"); + return; + } - EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, - BuildTarget.StandaloneWindows64); + CurBuilderData.platform = platform; + switch (CurBuilderData.platform) + { + case BuilderUtility.PlatformType.Windows: + { + EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, + BuildTarget.StandaloneWindows64); - PlayerSettings.SetScriptingBackend(BuildTargetGroup.Standalone, ScriptingImplementation.Mono2x); - PlayerSettings.stripEngineCode = false; - PlayerSettings.SetManagedStrippingLevel(BuildTargetGroup.Standalone, ManagedStrippingLevel.Disabled); - PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Standalone, CurBuilderData.bundleIdentifier); - } - break; - case BuilderUtility.PlatformType.Android: - { - EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Android, BuildTarget.Android); + PlayerSettings.SetScriptingBackend(BuildTargetGroup.Standalone, ScriptingImplementation.Mono2x); + PlayerSettings.stripEngineCode = false; + PlayerSettings.SetManagedStrippingLevel(BuildTargetGroup.Standalone, ManagedStrippingLevel.Disabled); + PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Standalone, CurBuilderData.bundleIdentifier); + } + break; + case BuilderUtility.PlatformType.Android: + { + EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Android, BuildTarget.Android); - EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle; - PlayerSettings.Android.bundleVersionCode = 1; - PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android, - CurBuilderData.scriptingBackend == BuilderUtility.ScriptBackend.Mono ? ScriptingImplementation.Mono2x : ScriptingImplementation.IL2CPP); - Debug.Log("=============CurBuilderData.scriptingBackend:" + CurBuilderData.scriptingBackend); - PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, CurBuilderData.bundleIdentifier); - PlayerSettings.SetApiCompatibilityLevel(BuildTargetGroup.Android, ApiCompatibilityLevel.NET_4_6); - } - break; - case BuilderUtility.PlatformType.iOS: - { + EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle; + PlayerSettings.Android.bundleVersionCode = 1; + PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android, + CurBuilderData.scriptingBackend == BuilderUtility.ScriptBackend.Mono ? ScriptingImplementation.Mono2x : ScriptingImplementation.IL2CPP); + Debug.Log("=============CurBuilderData.scriptingBackend:" + CurBuilderData.scriptingBackend); + PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, CurBuilderData.bundleIdentifier); + PlayerSettings.SetApiCompatibilityLevel(BuildTargetGroup.Android, ApiCompatibilityLevel.NET_4_6); + } + break; + case BuilderUtility.PlatformType.iOS: + { + EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.iOS, BuildTarget.iOS); - EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.iOS, BuildTarget.iOS); - - PlayerSettings.iOS.appleEnableAutomaticSigning = false; - PlayerSettings.iOS.scriptCallOptimization = ScriptCallOptimizationLevel.SlowAndSafe; - PlayerSettings.iOS.targetOSVersionString = "8.0"; - PlayerSettings.iOS.buildNumber = "1"; - PlayerSettings.SetScriptingBackend(BuildTargetGroup.iOS, ScriptingImplementation.IL2CPP); - PlayerSettings.stripEngineCode = false; - PlayerSettings.SetManagedStrippingLevel(BuildTargetGroup.iOS, ManagedStrippingLevel.Disabled); - PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.iOS, CurBuilderData.bundleIdentifier); - PlayerSettings.SetApiCompatibilityLevel(BuildTargetGroup.iOS, ApiCompatibilityLevel.NET_4_6); - } - break; - } - } + PlayerSettings.iOS.appleEnableAutomaticSigning = false; + PlayerSettings.iOS.scriptCallOptimization = ScriptCallOptimizationLevel.SlowAndSafe; + PlayerSettings.iOS.targetOSVersionString = "8.0"; + PlayerSettings.iOS.buildNumber = "1"; + PlayerSettings.SetScriptingBackend(BuildTargetGroup.iOS, ScriptingImplementation.IL2CPP); + PlayerSettings.stripEngineCode = false; + PlayerSettings.SetManagedStrippingLevel(BuildTargetGroup.iOS, ManagedStrippingLevel.Disabled); + PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.iOS, CurBuilderData.bundleIdentifier); + PlayerSettings.SetApiCompatibilityLevel(BuildTargetGroup.iOS, ApiCompatibilityLevel.NET_4_6); + } + break; + } + } + /// + /// 构建包体 + /// + /// 是否直接出包 + internal void Build(bool isDirect = false, BuildOptions option = BuildOptions.None) + { + var platform = CurBuilderData.platform; - /// - /// 构建包体 - /// - /// 是否直接出包 - internal void Build(bool isDirect = false, BuildOptions option = BuildOptions.None) - { - var platform = CurBuilderData.platform; + SwitchPlatform(platform); - SwitchPlatform(platform); - - DoBuild(isDirect, option); - } + DoBuild(isDirect, option); + } - /// - /// 执行完整构建流程 - /// - /// - /// - void DoBuild(bool isDirectBuild, BuildOptions option) - { - var buildStart = DateTime.Now; + /// + /// 执行完整构建流程 + /// + /// + /// + void DoBuild(bool isDirectBuild, BuildOptions option) + { + var buildStart = DateTime.Now; - if (!isDirectBuild) - { - if (!BuildAssetBundle()) - return; - } - else - { - Instance.AssetbundleBuilder.CopyAssetBundles(); - } + if (!isDirectBuild) + { + if (!BuildAssetBundle()) + return; + } + else + { + Instance.AssetbundleBuilder.CopyAssetBundles(); + } - BuildPackage(option); - Debug.Log("Apk打包总耗时:" + (DateTime.Now - buildStart).TotalMinutes.ToString("F2") + " 分钟"); - } + BuildPackage(option); + Debug.Log("Apk打包总耗时:" + (DateTime.Now - buildStart).TotalMinutes.ToString("F2") + " 分钟"); + } - /// - /// 构建AB包部分 - /// - /// - public bool BuildAssetBundle() - { - if (CurBuilderData == null) - { - TLogger.LogError("未设置BuilderData,请先调用接口:SetBuilderConfig"); - return false; - } + /// + /// 构建AB包部分 + /// + /// + public bool BuildAssetBundle() + { + if (CurBuilderData == null) + { + TLogger.LogError("未设置BuilderData,请先调用接口:SetBuilderConfig"); + return false; + } - var start = DateTime.Now; + var start = DateTime.Now; - BuilderInjectorHandler(BuilderInjectorMoment.BeforeCollect_AssetBundle); - if (!Instance.AssetbundleBuilder.CollectAssetBundles(CurBuilderData.builderBundlePolicy, CurBuilderData.bundleConfig)) - return false; + BuilderInjectorHandler(BuilderInjectorMoment.BeforeCollect_AssetBundle); + if (!Instance.AssetbundleBuilder.CollectAssetBundles(CurBuilderData.builderBundlePolicy, CurBuilderData.bundleConfig)) + return false; - if (CurBuilderData.bCollectShaderVariant) - { - Debug.Log("CollectShaderVariant"); - var list = ShaderVariantCollector.ClollectSharderAndVariant(); - string abName = ShaderVariantCollector.GetShaderVariantAbName(); - Dictionary additionalRes = new Dictionary(); - foreach (var sv in list) - { - if (!additionalRes.ContainsKey(sv)) - additionalRes.Add(sv, abName); - else - Debug.LogError("重复的变体路径:" + sv); - } + if (CurBuilderData.bCollectShaderVariant) + { + Debug.Log("CollectShaderVariant"); + var list = ShaderVariantCollector.ClollectSharderAndVariant(); + string abName = ShaderVariantCollector.GetShaderVariantAbName(); + Dictionary additionalRes = new Dictionary(); + foreach (var sv in list) + { + if (!additionalRes.ContainsKey(sv)) + additionalRes.Add(sv, abName); + else + Debug.LogError("重复的变体路径:" + sv); + } - list.Clear(); - Instance.AssetbundleBuilder.InsertAdditionalTopRes(additionalRes, false); - } + list.Clear(); + Instance.AssetbundleBuilder.InsertAdditionalTopRes(additionalRes, false); + } - Instance.AssetbundleBuilder.SetAndCheckAssetDependencies(); + Instance.AssetbundleBuilder.SetAndCheckAssetDependencies(); - BuilderInjectorHandler(BuilderInjectorMoment.BeforeBuild_AssetBundle); + BuilderInjectorHandler(BuilderInjectorMoment.BeforeBuild_AssetBundle); - Instance.AssetbundleBuilder.BuildAssetBundlesAfterCollect(CurBuilderData.buildType == BuilderUtility.BuildType.Development, CurBuilderData.bIncrementBuildAB); - BuilderInjectorHandler(BuilderInjectorMoment.AfterBuild_AssetBundle); - Debug.Log("AB打包总耗时:" + (DateTime.Now - start).TotalMinutes.ToString("F2") + " 分钟"); - return true; - } + Instance.AssetbundleBuilder.BuildAssetBundlesAfterCollect(CurBuilderData.buildType == BuilderUtility.BuildType.Development, CurBuilderData.bIncrementBuildAB); + BuilderInjectorHandler(BuilderInjectorMoment.AfterBuild_AssetBundle); + Debug.Log("AB打包总耗时:" + (DateTime.Now - start).TotalMinutes.ToString("F2") + " 分钟"); + return true; + } - /// - /// 输出apk或安卓工程 - /// - /// - /// - public void BuildPackage(BuildOptions option = BuildOptions.None) - { - if (CurBuilderData == null) - { - TLogger.LogError("未设置BuilderData,请先调用接口:SetBuilderConfig"); - return; - } - CurBuilderData.ApplyArgs(""); + public void BuildActive(bool isDirectBuild,BuildOptions options = BuildOptions.None) + { + var platform = CurBuilderData.platform; - PlayerSettings.productName = CurBuilderData.productName; - PlayerSettings.bundleVersion = CurBuilderData.bundleVersion + "." + CurBuilderData._bBaseVersion; + var buildStart = DateTime.Now; - if (EditorUserBuildSettings.development) - option |= BuildOptions.Development; - if (EditorUserBuildSettings.connectProfiler) - option |= BuildOptions.ConnectWithProfiler; - if (EditorUserBuildSettings.buildWithDeepProfilingSupport) - option |= BuildOptions.EnableDeepProfilingSupport; + if (!isDirectBuild) + { + BuildAssetsCommand.BuildAndCopyABAOTHotUpdateDlls(); - string applicationName = string.Empty; - BuildTarget target = BuildTarget.NoTarget; - switch (CurBuilderData.platform) - { - case BuilderUtility.PlatformType.Android: - applicationName = CurBuilderData.bExportAndroidProject ? $"{CurBuilderData.productName}" : $"{CurBuilderData.productName}.apk"; - target = BuildTarget.Android; - break; - case BuilderUtility.PlatformType.iOS: - applicationName = $"{CurBuilderData.productName}.ipa"; - target = BuildTarget.iOS; - break; - case BuilderUtility.PlatformType.Windows: - applicationName = $"{CurBuilderData.productName}.exe"; - target = BuildTarget.StandaloneWindows64; - break; - default: - UnityEngine.Debug.LogError("Not supported target platform"); - return; - } + if (!BuildAssetBundle()) + return; + } + else + { + Instance.AssetbundleBuilder.CopyAssetBundles(); + } - SetAppStoreUrl(); + if (CurBuilderData == null) + { + TLogger.LogError("未设置BuilderData,请先调用接口:SetBuilderConfig"); + return; + } - LoaderUtilities.DeleteFolder(FileSystem.ResourceRoot); + CurBuilderData.ApplyArgs(""); - BuilderInjectorHandler(BuilderInjectorMoment.BeforeBuild_Apk); + PlayerSettings.productName = CurBuilderData.productName; + PlayerSettings.bundleVersion = CurBuilderData.bundleVersion + "." + CurBuilderData._bBaseVersion; - BuilderInjectorHandler(BuilderInjectorMoment.BeforeBuild_FirstZip); + if (EditorUserBuildSettings.development) + options |= BuildOptions.Development; + if (EditorUserBuildSettings.connectProfiler) + options |= BuildOptions.ConnectWithProfiler; + if (EditorUserBuildSettings.buildWithDeepProfilingSupport) + options |= BuildOptions.EnableDeepProfilingSupport; - MakeFirstZip(); + string applicationName = string.Empty; + BuildTarget target = BuildTarget.NoTarget; + switch (CurBuilderData.platform) + { + case BuilderUtility.PlatformType.Android: + applicationName = CurBuilderData.bExportAndroidProject ? $"{CurBuilderData.productName}" : $"{CurBuilderData.productName}.apk"; + target = BuildTarget.Android; + break; + case BuilderUtility.PlatformType.iOS: + applicationName = $"{CurBuilderData.productName}.ipa"; + target = BuildTarget.iOS; + break; + case BuilderUtility.PlatformType.Windows: + applicationName = $"{CurBuilderData.productName}.exe"; + target = BuildTarget.StandaloneWindows64; + break; + default: + UnityEngine.Debug.LogError("Not supported target platform"); + return; + } - BuilderInjectorHandler(BuilderInjectorMoment.AfterBuild_FirstZip); + SetAppStoreUrl(); - CopyRawBytes(); + LoaderUtilities.DeleteFolder(FileSystem.ResourceRoot); - string export = CurBuilderData.ProjectExportPath; - if (string.IsNullOrEmpty(export)) - export = $"{FileSystem.BuildPath}/{(CurBuilderData.platform).ToString()}/{applicationName}"; + BuilderInjectorHandler(BuilderInjectorMoment.BeforeBuild_Apk); - BuildReport result = BuildPipeline.BuildPlayer(new string[] { EditorBuildSettings.scenes[0].path }, - export, target, option); + BuilderInjectorHandler(BuilderInjectorMoment.BeforeBuild_FirstZip); - switch (result.summary.result) - { - case BuildResult.Unknown: - TLogger.LogInfo("Build Package FAIL! 未知错误!"); - break; - case BuildResult.Succeeded: - TLogger.LogInfo("Build Package OK!"); - break; - case BuildResult.Failed: - TLogger.LogInfo("Build Package FAIL!"); - break; - case BuildResult.Cancelled: - TLogger.LogInfo("Build Package Cancelled!"); - break; - default: - throw new ArgumentOutOfRangeException(); - } + string export = CurBuilderData.ProjectExportPath; + if (string.IsNullOrEmpty(export)) + export = $"{FileSystem.BuildPath}/{(CurBuilderData.platform).ToString()}/{applicationName}"; - if (Application.isBatchMode && result.summary.result != BuildResult.Succeeded) - { - Process.GetCurrentProcess().Kill(); - } + BuildReport result = BuildPipeline.BuildPlayer(new string[] { EditorBuildSettings.scenes[0].path }, + export, target, options); - BuilderInjectorHandler(BuilderInjectorMoment.AfterBuild_Apk); + switch (result.summary.result) + { + case BuildResult.Unknown: + TLogger.LogInfo("Build Package FAIL! 未知错误!"); + break; + case BuildResult.Succeeded: + TLogger.LogInfo("Build Package OK!"); + break; + case BuildResult.Failed: + TLogger.LogInfo("Build Package FAIL!"); + break; + case BuildResult.Cancelled: + TLogger.LogInfo("Build Package Cancelled!"); + break; + default: + throw new ArgumentOutOfRangeException(); + } - } + if (Application.isBatchMode && result.summary.result != BuildResult.Succeeded) + { + Process.GetCurrentProcess().Kill(); + } + + BuilderInjectorHandler(BuilderInjectorMoment.AfterBuild_Apk); + + Debug.Log("一键打包总耗时:" + (DateTime.Now - buildStart).TotalMinutes.ToString("F2") + " 分钟"); + } + + /// + /// 输出apk或安卓工程 + /// + /// + /// + public void BuildPackage(BuildOptions option = BuildOptions.None) + { + if (CurBuilderData == null) + { + TLogger.LogError("未设置BuilderData,请先调用接口:SetBuilderConfig"); + return; + } + + CurBuilderData.ApplyArgs(""); + + PlayerSettings.productName = CurBuilderData.productName; + PlayerSettings.bundleVersion = CurBuilderData.bundleVersion + "." + CurBuilderData._bBaseVersion; + + if (EditorUserBuildSettings.development) + option |= BuildOptions.Development; + if (EditorUserBuildSettings.connectProfiler) + option |= BuildOptions.ConnectWithProfiler; + if (EditorUserBuildSettings.buildWithDeepProfilingSupport) + option |= BuildOptions.EnableDeepProfilingSupport; + + string applicationName = string.Empty; + BuildTarget target = BuildTarget.NoTarget; + switch (CurBuilderData.platform) + { + case BuilderUtility.PlatformType.Android: + applicationName = CurBuilderData.bExportAndroidProject ? $"{CurBuilderData.productName}" : $"{CurBuilderData.productName}.apk"; + target = BuildTarget.Android; + break; + case BuilderUtility.PlatformType.iOS: + applicationName = $"{CurBuilderData.productName}.ipa"; + target = BuildTarget.iOS; + break; + case BuilderUtility.PlatformType.Windows: + applicationName = $"{CurBuilderData.productName}.exe"; + target = BuildTarget.StandaloneWindows64; + break; + default: + UnityEngine.Debug.LogError("Not supported target platform"); + return; + } + + SetAppStoreUrl(); + + LoaderUtilities.DeleteFolder(FileSystem.ResourceRoot); + + BuilderInjectorHandler(BuilderInjectorMoment.BeforeBuild_Apk); + + BuilderInjectorHandler(BuilderInjectorMoment.BeforeBuild_FirstZip); + + MakeFirstZip(); + + BuilderInjectorHandler(BuilderInjectorMoment.AfterBuild_FirstZip); + + CopyRawBytes(); + + string export = CurBuilderData.ProjectExportPath; + if (string.IsNullOrEmpty(export)) + export = $"{FileSystem.BuildPath}/{(CurBuilderData.platform).ToString()}/{applicationName}"; + + BuildReport result = BuildPipeline.BuildPlayer(new string[] { EditorBuildSettings.scenes[0].path }, + export, target, option); + + switch (result.summary.result) + { + case BuildResult.Unknown: + TLogger.LogInfo("Build Package FAIL! 未知错误!"); + break; + case BuildResult.Succeeded: + TLogger.LogInfo("Build Package OK!"); + break; + case BuildResult.Failed: + TLogger.LogInfo("Build Package FAIL!"); + break; + case BuildResult.Cancelled: + TLogger.LogInfo("Build Package Cancelled!"); + break; + default: + throw new ArgumentOutOfRangeException(); + } + + if (Application.isBatchMode && result.summary.result != BuildResult.Succeeded) + { + Process.GetCurrentProcess().Kill(); + } + + BuilderInjectorHandler(BuilderInjectorMoment.AfterBuild_Apk); + } - /// - /// Builder流程插入处理器 - /// - /// - internal void BuilderInjectorHandler(BuilderInjectorMoment moment) - { - try - { - var compilationAssemblies = CompilationPipeline.GetAssemblies(); - List assemblies = new List(); - foreach (var assembly in compilationAssemblies) - { - assemblies.Add(Assembly.LoadFrom(assembly.outputPath)); - } - foreach (var assembly in assemblies) - { - var types = assembly.GetTypes(); - foreach (var type in types) - { - MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | - BindingFlags.Public | BindingFlags.IgnoreCase); - foreach (var method in methods) - { - foreach (var att in method.GetCustomAttributes(false)) - { - if (att is TEngineBuilderInjectorAttribute a) - { - if (!assembly.FullName.Contains("Editor")) - { - Debug.LogError($"{type.Name}.cs不在Editor中,已跳过"); - continue; - } + /// + /// Builder流程插入处理器 + /// + /// + internal void BuilderInjectorHandler(BuilderInjectorMoment moment) + { + try + { + var compilationAssemblies = CompilationPipeline.GetAssemblies(); + List assemblies = new List(); + foreach (var assembly in compilationAssemblies) + { + assemblies.Add(Assembly.LoadFrom(assembly.outputPath)); + } - if (type.IsSubclassOf(typeof(UnityEngine.Object))) - { - Debug.LogError( - $"{type.Name}.cs中函数:{method.Name},标记了BuilderInjectorHandler,请勿在mono脚本上调用,已跳过"); - continue; - } + foreach (var assembly in assemblies) + { + var types = assembly.GetTypes(); + foreach (var type in types) + { + MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | + BindingFlags.Public | BindingFlags.IgnoreCase); + foreach (var method in methods) + { + foreach (var att in method.GetCustomAttributes(false)) + { + if (att is TEngineBuilderInjectorAttribute a) + { + if (!assembly.FullName.Contains("Editor")) + { + Debug.LogError($"{type.Name}.cs不在Editor中,已跳过"); + continue; + } - if (!a.IsInMoment(moment)) - continue; + if (type.IsSubclassOf(typeof(UnityEngine.Object))) + { + Debug.LogError( + $"{type.Name}.cs中函数:{method.Name},标记了BuilderInjectorHandler,请勿在mono脚本上调用,已跳过"); + continue; + } - if (method.IsStatic) - { - method.Invoke(null, null); - } - else - { - var obj = Activator.CreateInstance(type); - method.Invoke(obj, null); - } - Debug.Log($"已完成执行插入方法:{method.Name}"); - } - } - } - } - } - } - catch (Exception e) - { - Debug.LogError($"BuilderInjectorHandler_{moment.ToString()}:" + e); - } - } + if (!a.IsInMoment(moment)) + continue; - /// - /// 拷贝RawBytes文件部分 - /// - private static void CopyRawBytes() - { - //复制到StreamingAsset下 - string target = $"{string.Format("{0}/RawBytes", FileSystem.ResourceRootInStreamAsset)}"; - if (Directory.Exists(target)) - Directory.Delete(target, true); - Directory.CreateDirectory(target); + if (method.IsStatic) + { + method.Invoke(null, null); + } + else + { + var obj = Activator.CreateInstance(type); + method.Invoke(obj, null); + } - LoaderUtilities.CopyDirectory(AssetConfig.AssetRootPath + "/" + "RawBytes", target); + Debug.Log($"已完成执行插入方法:{method.Name}"); + } + } + } + } + } + } + catch (Exception e) + { + Debug.LogError($"BuilderInjectorHandler_{moment.ToString()}:" + e); + } + } - LoaderUtilities.ClearMeta(target); + /// + /// 拷贝RawBytes文件部分 + /// + private static void CopyRawBytes() + { + //复制到StreamingAsset下 + string target = $"{string.Format("{0}/RawBytes", FileSystem.ResourceRootInStreamAsset)}"; + if (Directory.Exists(target)) + Directory.Delete(target, true); + Directory.CreateDirectory(target); - AssetDatabase.Refresh(); - } + LoaderUtilities.CopyDirectory(AssetConfig.AssetRootPath + "/" + "RawBytes", target); + + LoaderUtilities.ClearMeta(target); + + AssetDatabase.Refresh(); + } - [PostProcessBuild(1)] - static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) - { - Debug.Log($"target: {target.ToString()}"); - Debug.Log($"pathToBuiltProject: {pathToBuiltProject}"); - Debug.Log($"productName: {PlayerSettings.productName}"); - Debug.Log($"version:{GameConfig.Instance.GameBundleVersion}"); - string versionStr = GameConfig.Instance.GameBundleVersion.Replace(".", ""); - long versionLong = long.Parse(versionStr); - Debug.Log($"versionStr:{versionStr}"); + [PostProcessBuild(1)] + static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) + { + Debug.Log($"target: {target.ToString()}"); + Debug.Log($"pathToBuiltProject: {pathToBuiltProject}"); + Debug.Log($"productName: {PlayerSettings.productName}"); + Debug.Log($"version:{GameConfig.Instance.GameBundleVersion}"); + string versionStr = GameConfig.Instance.GameBundleVersion.Replace(".", ""); + long versionLong = long.Parse(versionStr); + Debug.Log($"versionStr:{versionStr}"); - GameConfig.Instance.WriteBaseResVersion(GameConfig.Instance.ResId); + GameConfig.Instance.WriteBaseResVersion(GameConfig.Instance.ResId); - if (target == BuildTarget.Android) - { - string explore = BuilderUtility.GetArgumentValue("ExploreAndroidProject"); - if (Instance.CurBuilderData.scriptingBackend == BuilderUtility.ScriptBackend.Mono && !string.IsNullOrEmpty(explore) && explore == "true") - { - byte[] versionByte = new byte[8]; - for (int i = 0; i < versionByte.Length; ++i) - versionByte[i] = (byte)((versionLong >> (i * 8)) & 0xff); + if (target == BuildTarget.Android) + { + string explore = BuilderUtility.GetArgumentValue("ExploreAndroidProject"); + if (Instance.CurBuilderData.scriptingBackend == BuilderUtility.ScriptBackend.Mono && !string.IsNullOrEmpty(explore) && explore == "true") + { + byte[] versionByte = new byte[8]; + for (int i = 0; i < versionByte.Length; ++i) + versionByte[i] = (byte)((versionLong >> (i * 8)) & 0xff); #if UNITY_2019_4_OR_NEWER - string dllPath = - $"{pathToBuiltProject}/unityLibrary/src/main/assets/bin/Data/Managed/Assembly-CSharp.dll"; + string dllPath = + $"{pathToBuiltProject}/unityLibrary/src/main/assets/bin/Data/Managed/Assembly-CSharp.dll"; #else string dllPath = $"{pathToBuiltProject}/{PlayerSettings.productName}/src/main/assets/bin/Data/Managed/Assembly-CSharp.dll"; #endif - if (File.Exists(dllPath)) - { - Debug.Log("Encrypt Assembly-CSharp.dll Start"); + if (File.Exists(dllPath)) + { + Debug.Log("Encrypt Assembly-CSharp.dll Start"); - byte[] bytes = File.ReadAllBytes(dllPath); - for (int i = 0; i < 901; ++i) - bytes[i] ^= 0x31; - for (int i = 0; i < bytes.Length; i += 2) - bytes[i] ^= bytes[bytes.Length - i - 1]; - using (FileStream dllStream = File.OpenWrite(dllPath)) - { - dllStream.WriteByte((byte)'L'); - dllStream.WriteByte((byte)'U'); - dllStream.WriteByte((byte)'A'); - dllStream.WriteByte((byte)'C'); - foreach (var t in versionByte) - dllStream.WriteByte(t); + byte[] bytes = File.ReadAllBytes(dllPath); + for (int i = 0; i < 901; ++i) + bytes[i] ^= 0x31; + for (int i = 0; i < bytes.Length; i += 2) + bytes[i] ^= bytes[bytes.Length - i - 1]; + using (FileStream dllStream = File.OpenWrite(dllPath)) + { + dllStream.WriteByte((byte)'L'); + dllStream.WriteByte((byte)'U'); + dllStream.WriteByte((byte)'A'); + dllStream.WriteByte((byte)'C'); + foreach (var t in versionByte) + dllStream.WriteByte(t); - dllStream.Write(bytes, 0, bytes.Length); - } + dllStream.Write(bytes, 0, bytes.Length); + } - Debug.Log("Encrypt Assembly-CSharp.dll Success"); + Debug.Log("Encrypt Assembly-CSharp.dll Success"); - Debug.Log("Encrypt libmonobdwgc-2.0.so Start !!"); + Debug.Log("Encrypt libmonobdwgc-2.0.so Start !!"); - Debug.Log($"Current is : {(EditorUserBuildSettings.development ? "development" : "release")}"); + Debug.Log($"Current is : {(EditorUserBuildSettings.development ? "development" : "release")}"); #if UNITY_2019_4_OR_NEWER - string armv7ASoPath = - $"{pathToBuiltProject}/unityLibrary/src/main/jniLibs/armeabi-v7a/libmonobdwgc-2.0.so"; - string x86SoPath = $"{pathToBuiltProject}/unityLibrary/src/main/jniLibs/x86/libmonobdwgc-2.0.so"; + string armv7ASoPath = + $"{pathToBuiltProject}/unityLibrary/src/main/jniLibs/armeabi-v7a/libmonobdwgc-2.0.so"; + string x86SoPath = $"{pathToBuiltProject}/unityLibrary/src/main/jniLibs/x86/libmonobdwgc-2.0.so"; #else string armv7ASoPath = $"{pathToBuiltProject}/{PlayerSettings.productName}/src/main/jniLibs/armeabi-v7a/libmonobdwgc-2.0.so"; string x86SoPath = $"{pathToBuiltProject}/{PlayerSettings.productName}/src/main/jniLibs/x86/libmonobdwgc-2.0.so"; #endif #if UNITY_2019_4_OR_NEWER - AppendDll(dllPath, $"{pathToBuiltProject}/unityLibrary/src/main/assets/"); + AppendDll(dllPath, $"{pathToBuiltProject}/unityLibrary/src/main/assets/"); #else AppendDll(dllPath, $"{pathToBuiltProject}/{PlayerSettings.productName}/src/main/assets/"); #endif - } - else - { - Debug.LogError(dllPath + " Not Found!!"); - } - } - } + } + else + { + Debug.LogError(dllPath + " Not Found!!"); + } + } + } - string[] dirList = { $"{Environment.CurrentDirectory}/Library/il2cpp_android_armeabi-v7a/il2cpp_cache", $"{Environment.CurrentDirectory}/Library/il2cpp_android_arm64-v8a/il2cpp_cache" }; - foreach (var dir in dirList) - { - if (Directory.Exists(dir)) - { - DirectoryInfo root = new DirectoryInfo(dir); - DirectoryInfo[] dics = root.GetDirectories(); - foreach (var childDir in dics) - { - if (childDir.Name.Contains("linkresult_")) - { - DirectoryInfo directory = new DirectoryInfo(childDir.FullName); - FileInfo[] files = directory.GetFiles(); - for (int i = 0; i < files.Length; i++) - { - if (files[i].Name == "libil2cpp.sym.so") - { - string newPath = null; - if (files[i].FullName.Contains("armeabi-v7a")) - newPath = $"{Environment.CurrentDirectory}/SymbolsTemp/armeabi-v7a"; - else if (files[i].FullName.Contains("arm64-v8a")) - newPath = $"{Environment.CurrentDirectory}/SymbolsTemp/arm64-v8a"; - if (!Directory.Exists(newPath)) - { - Directory.CreateDirectory(newPath); - } + string[] dirList = + { + $"{Environment.CurrentDirectory}/Library/il2cpp_android_armeabi-v7a/il2cpp_cache", $"{Environment.CurrentDirectory}/Library/il2cpp_android_arm64-v8a/il2cpp_cache" + }; + foreach (var dir in dirList) + { + if (Directory.Exists(dir)) + { + DirectoryInfo root = new DirectoryInfo(dir); + DirectoryInfo[] dics = root.GetDirectories(); + foreach (var childDir in dics) + { + if (childDir.Name.Contains("linkresult_")) + { + DirectoryInfo directory = new DirectoryInfo(childDir.FullName); + FileInfo[] files = directory.GetFiles(); + for (int i = 0; i < files.Length; i++) + { + if (files[i].Name == "libil2cpp.sym.so") + { + string newPath = null; + if (files[i].FullName.Contains("armeabi-v7a")) + newPath = $"{Environment.CurrentDirectory}/SymbolsTemp/armeabi-v7a"; + else if (files[i].FullName.Contains("arm64-v8a")) + newPath = $"{Environment.CurrentDirectory}/SymbolsTemp/arm64-v8a"; + if (!Directory.Exists(newPath)) + { + Directory.CreateDirectory(newPath); + } - File.Copy(files[i].FullName, $"{newPath}/libil2cpp.sym.so", true); - } - } - } - } - } - else - { - //TLogger.LogWarning($"文件夹不存在:{dir}"); - } - } - } + File.Copy(files[i].FullName, $"{newPath}/libil2cpp.sym.so", true); + } + } + } + } + } + else + { + //TLogger.LogWarning($"文件夹不存在:{dir}"); + } + } + } - /// - /// 加塞一下dll - /// - /// - /// - static void AppendDll(string dll_path, string des_path) - { - //备份到本地目录 - File.Copy(dll_path, $"{FileSystem.BuildPath}/{"Script.bin"}", true); - //备份到streamAsset目录 - File.Copy(dll_path, $"{des_path}/TEngineResRoot/{"Script.bin"}", true); - } + /// + /// 加塞一下dll + /// + /// + /// + static void AppendDll(string dll_path, string des_path) + { + //备份到本地目录 + File.Copy(dll_path, $"{FileSystem.BuildPath}/{"Script.bin"}", true); + //备份到streamAsset目录 + File.Copy(dll_path, $"{des_path}/TEngineResRoot/{"Script.bin"}", true); + } - /// - /// 设置跳转地址 - /// - internal void SetAppStoreUrl() - { + /// + /// 设置跳转地址 + /// + internal void SetAppStoreUrl() + { #if UNITY_IOS BuilderUtility.SetAppURL(CurBuilderData.appUrl); #endif - } + } - /// - /// 是否首包压缩 - /// - internal void MakeFirstZip() - { - string outputPath = $"{Application.streamingAssetsPath}/{"First.zip"}"; - if (File.Exists(outputPath)) - { - File.Delete(outputPath); - } - } - } -} + /// + /// 是否首包压缩 + /// + internal void MakeFirstZip() + { + string outputPath = $"{Application.streamingAssetsPath}/{"First.zip"}"; + if (File.Exists(outputPath)) + { + File.Delete(outputPath); + } + } + } +} \ No newline at end of file diff --git a/Assets/TEngine/Scripts/Editor/AssetBundleBuild/BuilderInjectorMoment.cs b/Assets/TEngine/Scripts/Editor/AssetBundleBuild/BuilderInjectorMoment.cs index ae05b590..7ea7880c 100644 --- a/Assets/TEngine/Scripts/Editor/AssetBundleBuild/BuilderInjectorMoment.cs +++ b/Assets/TEngine/Scripts/Editor/AssetBundleBuild/BuilderInjectorMoment.cs @@ -1,6 +1,8 @@ using System; +using System.IO; using TEngine.Runtime; using UnityEditor; +using UnityEngine; namespace TEngine.Editor { @@ -74,8 +76,27 @@ namespace TEngine.Editor public static class CusInjectorDemoEditor { + [TEngineBuilderInjector(BuilderInjectorMoment.BeforeCollect_AssetBundle)] + public static void CopyVersion() + { + var innerVersionFile = UnityEngine.Application.streamingAssetsPath + "/TEngine/version.json"; + + string path = FileSystem.ResourceRoot + "/" + GameConfig.CONFIG; + if (System.IO.File.Exists(innerVersionFile)) + { + FileUtil.DeleteFileOrDirectory(innerVersionFile); + FileUtil.CopyFileOrDirectory(path, innerVersionFile); + } + else + { + FileUtil.CopyFileOrDirectory(path, innerVersionFile); + } + + Log.Debug("复制版本信息成功"); + } + [TEngineBuilderInjector(BuilderInjectorMoment.AfterBuild_AssetBundle)] - public static void TestInjector() + public static void GenMd5List() { UnityEngine.Debug.Log($"productName: {PlayerSettings.productName}"); UnityEngine.Debug.Log($"version:{GameConfig.Instance.GameBundleVersion}"); @@ -83,6 +104,7 @@ namespace TEngine.Editor long versionLong = long.Parse(versionStr); UnityEngine.Debug.Log($"versionStr:{versionStr}"); UnityEngine.Debug.LogError("BuilderInjectorMoment.AfterBuild_AssetBundle"); + TEngineCore.Editor.TEngineEditorUtil.GenMd5List(); } } } diff --git a/Assets/TEngine/Scripts/Editor/AssetBundleBuild/Editor/BuilderEditor.cs b/Assets/TEngine/Scripts/Editor/AssetBundleBuild/Editor/BuilderEditor.cs index 40d8ca4c..0dce0217 100644 --- a/Assets/TEngine/Scripts/Editor/AssetBundleBuild/Editor/BuilderEditor.cs +++ b/Assets/TEngine/Scripts/Editor/AssetBundleBuild/Editor/BuilderEditor.cs @@ -1,11 +1,14 @@ using System; +using System.Diagnostics; using System.IO; using TEngine; using TEngine.Editor; using TEngine.Runtime; using UnityEditor; +using UnityEditor.Build.Reporting; using UnityEngine; using UnityEngine.Serialization; +using Debug = UnityEngine.Debug; using Object = UnityEngine.Object; using Type = System.Type; @@ -110,7 +113,7 @@ namespace TEngineCore.Editor [FormerlySerializedAs("_scriptingBackend")] [SerializeField] [BuilderEditor("编译类型", ContentType.Enum, "FlowA:disPlayType:1&platform:0r1r2,CB:SwitchScriptingBackend")] - internal BuilderUtility.ScriptBackend scriptingBackend = BuilderUtility.ScriptBackend.Mono; + internal BuilderUtility.ScriptBackend scriptingBackend = BuilderUtility.ScriptBackend.IL2CPP; #endregion @@ -215,7 +218,7 @@ namespace TEngineCore.Editor [FormerlySerializedAs("_ABVersion")] [SerializeField] - [BuilderEditor("资源版本号", ContentType.TextField, "FlowA:disPlayType:1,CB:ChangeABVersion")] + [BuilderEditor("内部资源版本号", ContentType.TextField, "FlowA:disPlayType:1,CB:ChangeABVersion")] internal string ABVersion = "0"; [BuilderEditor("15", ContentType.Space)] @@ -233,10 +236,10 @@ namespace TEngineCore.Editor [BuilderEditor("Gen Md5(生成MD5)", ContentType.Button, ",CB:GenMd5,FlowA:disPlayType:1")] private int genMd5; - [BuilderEditor("Build", ContentType.Button, "CB:BuildApk")] + [BuilderEditor("Build", ContentType.Button, "CB:BuildActive")] private int build; - [BuilderEditor("直接出包(跳过ab环节)", ContentType.Button, "CB:DirectBuildApk,FlowA:disPlayType:1")] + [BuilderEditor("直接出包(跳过ab环节)", ContentType.Button, "CB:DirectBuild,FlowA:disPlayType:1")] private int directBuild; #endregion @@ -448,8 +451,8 @@ namespace TEngineCore.Editor /// private void ChangeProductName(string args) { - if (!autoUdate) - return; + if (!autoUdate) + return; PlayerSettings.productName = args; } @@ -459,9 +462,10 @@ namespace TEngineCore.Editor /// private void ChangeBundleVersion(string args) { - if (!autoUdate) - return; + if (!autoUdate) + return; PlayerSettings.bundleVersion = args; + GameConfig.Instance.WriteAppVersion(args); } /// @@ -470,8 +474,9 @@ namespace TEngineCore.Editor /// private void ChangeABVersion(string args) { - if (!autoUdate) - return; + if (!autoUdate) + return; + GameConfig.Instance.WriteBaseResVersion(args); GameConfig.Instance.WriteResVersion(args); } @@ -607,7 +612,7 @@ namespace TEngineCore.Editor destFile = Path.Combine(targetFilePath, fileName); File.Copy(s, destFile, true); } - + string[] filefolders = Directory.GetFiles(sourceFilePath); DirectoryInfo dirinfo = new DirectoryInfo(sourceFilePath); @@ -662,7 +667,7 @@ namespace TEngineCore.Editor ApplyArgs(""); BuildAssetsCommand.BuildAndCopyABAOTHotUpdateDlls(); - + TLogger.LogInfoSuccessd("1.生成DLL的bytes成功"); AssetDatabase.Refresh(); @@ -702,29 +707,22 @@ namespace TEngineCore.Editor GUIUtility.ExitGUI(); } - private void BuildApk(string args) + private void BuildActive(string args) { if (EditorApplication.isCompiling) { - EditorUtility.DisplayDialog("Build Apk", "请等待编译完成", "ok"); + EditorUtility.DisplayDialog("Build Active", "请等待编译完成", "ok"); return; } Save(); - if (bundleVersion.Split('.').Length != 2) - { - Debug.LogError("版本号需要两位(*.*)"); - return; - } - if (buildType == (BuilderUtility.BuildType)BuilderUtility.BuildType.Editor) { Debug.LogError("编辑器模式不支持打包,请看描述"); } else { - - if (!BuilderUtility.PolicyEasyCheck(builderBundlePolicy, bundleConfig)) + if (!BuilderUtility.PolicyEasyCheck(builderBundlePolicy, bundleConfig)) { if (!EditorUtility.DisplayDialog("资源检查警告", "发现策略未覆盖到的资源,是否继续", "继续", "退出打包")) { @@ -734,7 +732,8 @@ namespace TEngineCore.Editor ApplyArgs(""); Builder.Instance.SetBuilderConfig(this); - Builder.Instance.Build(false); + Builder.Instance.BuildActive(false); + } @@ -742,25 +741,19 @@ namespace TEngineCore.Editor } /// - /// 直接打APK包 + /// 直接打包 /// /// - private void DirectBuildApk(string args) + private void DirectBuild(string args) { if (EditorApplication.isCompiling) { - EditorUtility.DisplayDialog("Direct Build Apk", "请等待编译完成", "ok"); + EditorUtility.DisplayDialog("Direct Build", "请等待编译完成", "ok"); return; } Save(); - if (bundleVersion.Split('.').Length != 2) - { - Debug.LogError("版本号需要两位(*.*)"); - return; - } - if (buildType == (BuilderUtility.BuildType)BuilderUtility.BuildType.Editor) { Debug.LogError("编辑器模式不支持打包,请看描述"); @@ -775,7 +768,7 @@ namespace TEngineCore.Editor ApplyArgs(""); Builder.Instance.SetBuilderConfig(this); - Builder.Instance.Build(true); + Builder.Instance.BuildActive(true); } GUIUtility.ExitGUI(); diff --git a/Assets/TEngine/Scripts/Runtime/Core/Res/DefaultResourcesHelper/AssetConfig.cs b/Assets/TEngine/Scripts/Runtime/Core/Res/DefaultResourcesHelper/AssetConfig.cs index a386cc0d..aec5d14f 100644 --- a/Assets/TEngine/Scripts/Runtime/Core/Res/DefaultResourcesHelper/AssetConfig.cs +++ b/Assets/TEngine/Scripts/Runtime/Core/Res/DefaultResourcesHelper/AssetConfig.cs @@ -35,6 +35,7 @@ namespace TEngine.Runtime public void Load() { #if ASSETBUNDLE_ENABLE + Log.Debug("AssetBundleData ASSETBUNDLE_ENABLE Mode"); Stream stream = FileSystem.OpenRead(FileSystem.GetAssetBundlePathInVersion(AssetBundleMeta)); BinaryReader reader = new BinaryReader(stream); uint resVersion = reader.ReadUInt32(); @@ -56,7 +57,6 @@ namespace TEngine.Runtime { assetPaths[j] = reader.ReadString(); _assetPath2BundleDatas.Add(assetPaths[j], bundleName); - Log.Error($"Init Ab {assetPaths[j]} bundleName {bundleName}"); } depCount = reader.ReadInt32(); if (!_bundleDatas.TryGetValue(bundleName, out assetBundleData)) @@ -85,6 +85,8 @@ namespace TEngine.Runtime } } stream.Close(); +#else + Log.Debug("AssetBundleData Editor Mode"); #endif } diff --git a/Assets/TEngine/Scripts/Runtime/Core/Res/DefaultResourcesHelper/DefaultResourceHelper.cs b/Assets/TEngine/Scripts/Runtime/Core/Res/DefaultResourcesHelper/DefaultResourceHelper.cs index b6ba58bb..85db8378 100644 --- a/Assets/TEngine/Scripts/Runtime/Core/Res/DefaultResourcesHelper/DefaultResourceHelper.cs +++ b/Assets/TEngine/Scripts/Runtime/Core/Res/DefaultResourcesHelper/DefaultResourceHelper.cs @@ -5,6 +5,11 @@ namespace TEngine.Runtime { public class DefaultResourceHelper : ResourceHelperBase { + private void Start() + { + ResMgr.Instance.Active(); + } + public override GameObject Load(string path) { return ResMgr.Instance.Load(path); diff --git a/Assets/TEngine/Scripts/Runtime/Core/Res/TResource.cs b/Assets/TEngine/Scripts/Runtime/Core/Res/TResource.cs index 189774a5..fcf5e7cc 100644 --- a/Assets/TEngine/Scripts/Runtime/Core/Res/TResource.cs +++ b/Assets/TEngine/Scripts/Runtime/Core/Res/TResource.cs @@ -9,6 +9,7 @@ namespace TEngine.Runtime public class TResources { private static IResourceHelper m_ResourceHelper; + public static bool Initalize => m_ResourceHelper != null; /// /// 设置游戏资源加载辅助器。 diff --git a/Assets/TEngine/Scripts/Runtime/Core/Version/GameConfig.cs b/Assets/TEngine/Scripts/Runtime/Core/Version/GameConfig.cs index 19a88be5..d20f1497 100644 --- a/Assets/TEngine/Scripts/Runtime/Core/Version/GameConfig.cs +++ b/Assets/TEngine/Scripts/Runtime/Core/Version/GameConfig.cs @@ -236,6 +236,24 @@ namespace TEngine.Runtime return InitAppVersionInfo(); } + /// + /// 写入App版本号 + /// + /// + public void WriteAppVersion(string appVersion) + { + if (string.IsNullOrEmpty(appVersion)) + { + TLogger.LogWarning("ResVersion is null or empty,please check!"); + return; + } + + _versionConfig.AppVersion = appVersion; + UpdateConfig(); + SetLoadFilePath(FileSystem.ResourceRoot, ResId); + TLogger.LogInfo("GameConfig,WriteVersion to sdk:" + GameConfig.Instance.GameBundleVersion); + } + /// /// 写入App内部资源版本号 /// diff --git a/Assets/TEngine/Scripts/Runtime/GameProcedure/ProcedureCodeInit.cs b/Assets/TEngine/Scripts/Runtime/GameProcedure/ProcedureCodeInit.cs index 652f8579..9a6605c9 100644 --- a/Assets/TEngine/Scripts/Runtime/GameProcedure/ProcedureCodeInit.cs +++ b/Assets/TEngine/Scripts/Runtime/GameProcedure/ProcedureCodeInit.cs @@ -73,8 +73,6 @@ namespace TEngine.Runtime { base.OnEnter(procedureOwner); - LoadJobManager.Instance.LoadSceneAsync("L2Scene"); - m_procedureOwner = procedureOwner; if (!NeedLoadDll) diff --git a/Assets/TEngine/Scripts/Runtime/GameProcedure/ProcedureResourcesInit.cs b/Assets/TEngine/Scripts/Runtime/GameProcedure/ProcedureResourcesInit.cs index 1d8b92df..25fde986 100644 --- a/Assets/TEngine/Scripts/Runtime/GameProcedure/ProcedureResourcesInit.cs +++ b/Assets/TEngine/Scripts/Runtime/GameProcedure/ProcedureResourcesInit.cs @@ -8,12 +8,12 @@ namespace TEngine.Runtime public class ProcedureResourcesInit : ProcedureBase { public static int OnInitResourceCompleteEvent = StringId.StringToHash("OnInitResourceComplete"); - + private bool m_initResourceComplete = false; protected internal override void OnEnter(IFsm procedureOwner) { - + ResMgr.Instance.Active(); base.OnEnter(procedureOwner); GameEvent.AddEventListener(OnInitResourceCompleteEvent, OnInitResourceComplete); m_initResourceComplete = false; diff --git a/Assets/TEngine/Scripts/Runtime/GameProcedure/ProcedureStartGame.cs b/Assets/TEngine/Scripts/Runtime/GameProcedure/ProcedureStartGame.cs index d39a4efc..e7b02d9a 100644 --- a/Assets/TEngine/Scripts/Runtime/GameProcedure/ProcedureStartGame.cs +++ b/Assets/TEngine/Scripts/Runtime/GameProcedure/ProcedureStartGame.cs @@ -4,7 +4,7 @@ { public static readonly int OnStartGame = StringId.StringToHash("TEngineEvent.OnStartGame"); } - + /// /// 流程加载器 - 终点StartGame /// diff --git a/Assets/TEngine/Scripts/Runtime/HotUpdate/Config.txt b/Assets/TEngine/Scripts/Runtime/HotUpdate/Config.txt index 1cac08df..be357562 100644 --- a/Assets/TEngine/Scripts/Runtime/HotUpdate/Config.txt +++ b/Assets/TEngine/Scripts/Runtime/HotUpdate/Config.txt @@ -1,7 +1,7 @@ { "GameVersion": "0.1.0", "InternalGameVersion": 0, - "CheckVersionUrl": "http://1.12.241.46:8081/TEngine/Demo/{0}Version.txt", + "CheckVersionUrl": "http://127.0.0.1:8081/TEngine/Demo/{0}Version.txt", "WindowsAppUrl": "https://www.game.com", "MacOSAppUrl": "https://www.game.com", "IOSAppUrl": "https://www.game.com", diff --git a/Assets/TEngine/Scripts/Runtime/HotUpdate/Scripts/Logic/DownloadHandlerFileRange.cs b/Assets/TEngine/Scripts/Runtime/HotUpdate/Scripts/Logic/DownloadHandlerFileRange.cs index b3cff529..c9b30056 100644 --- a/Assets/TEngine/Scripts/Runtime/HotUpdate/Scripts/Logic/DownloadHandlerFileRange.cs +++ b/Assets/TEngine/Scripts/Runtime/HotUpdate/Scripts/Logic/DownloadHandlerFileRange.cs @@ -31,6 +31,8 @@ namespace TEngine.Runtime.HotUpdate _path = path; _md5 = md5; + _path = path + "_md5_" + md5; + var dirPath = Path.GetDirectoryName(_path); if (dirPath != null) { @@ -119,7 +121,7 @@ namespace TEngine.Runtime.HotUpdate _unityWebRequest = null; } } - #region + #region public float Progress => _totalFileSize == 0 ? 0 : ((float)_curFileSize) / _totalFileSize; public long TotalSize => _totalFileSize; diff --git a/Assets/TEngine/Scripts/Runtime/HotUpdate/Scripts/Logic/DownloadImpl.cs b/Assets/TEngine/Scripts/Runtime/HotUpdate/Scripts/Logic/DownloadImpl.cs index e853888e..28b47563 100644 --- a/Assets/TEngine/Scripts/Runtime/HotUpdate/Scripts/Logic/DownloadImpl.cs +++ b/Assets/TEngine/Scripts/Runtime/HotUpdate/Scripts/Logic/DownloadImpl.cs @@ -28,15 +28,15 @@ namespace TEngine.Runtime.HotUpdate { StartDownLoad = 0, //开始下载 HeadRequestFail = 1, //请求头失败 - DownLoadRequestFail = 2, //现在请求失败 + DownLoadRequestFail = 2, //现在请求失败 AreadyDownLoaded = 3, //已经下载过而且下载好了 - DownLoading = 4, //下载中 + DownLoading = 4, //下载中 NetChanged = 5, - DownLoaded = 6, //下载完成 - DownLoadingError = 7,//接收数据的那个过程中出错 + DownLoaded = 6, //下载完成 + DownLoadingError = 7,//接收数据的那个过程中出错 HeadRequestError = 8,//获取下载包大小报错 - ReceiveNullData = 9,//接受到空数据 - DownError = 10,//数据没有接受完但是isDone为true + ReceiveNullData = 9,//接受到空数据 + DownError = 10,//数据没有接受完但是isDone为true ReceiveError = 11,//接收数据失败 Md5Wrong = 12,//md5错误 AllDownLoaded = 13//全部下载完成 @@ -119,7 +119,7 @@ namespace TEngine.Runtime.HotUpdate bool _DealWithDownLoadOk(DownLoadResult downloadType, BackgroundDownloadStatus status, LoadResource data) { - string fileLocalPath = _path + data.Url; + string fileLocalPath = _path + data.Url + "_md5_" + data.Md5; if (status == BackgroundDownloadStatus.NetworkError) { diff --git a/Assets/TEngine/Scripts/Runtime/HotUpdate/Scripts/UI/UILoadMgr.cs b/Assets/TEngine/Scripts/Runtime/HotUpdate/Scripts/UI/UILoadMgr.cs index 3aded15c..d259b6f2 100644 --- a/Assets/TEngine/Scripts/Runtime/HotUpdate/Scripts/UI/UILoadMgr.cs +++ b/Assets/TEngine/Scripts/Runtime/HotUpdate/Scripts/UI/UILoadMgr.cs @@ -13,7 +13,7 @@ namespace TEngine.Runtime.HotUpdate /// public static void Initialize() { - _uiLoad = GameObject.Find(FileSystem.AssetFolder); + _uiLoad = GameObject.Find(FileSystem.AssetFolder); if (_uiLoad == null) { var obj = Resources.Load($"{FileSystem.AssetFolder}/UILoad"); @@ -35,8 +35,8 @@ namespace TEngine.Runtime.HotUpdate } } RegisitUI(); - } - + } + public static void RegisitUI() { UIDefine.RegisitUI(_uiList); @@ -60,7 +60,7 @@ namespace TEngine.Runtime.HotUpdate GameObject ui = null; if (!_uiMap.ContainsKey(uiinfo)) - { + { Object obj = Resources.Load(_uiList[uiinfo]); if (obj != null) { @@ -72,14 +72,19 @@ namespace TEngine.Runtime.HotUpdate ui.transform.localPosition = Vector3.zero; RectTransform rect = ui.GetComponent(); rect.sizeDelta = Vector2.zero; - } + } } UIBase compenent = ui.GetComponent(); if (compenent != null) { _uiMap.Add(uiinfo, compenent); - } + } + } + + if (_uiMap[uiinfo] == null || _uiMap[uiinfo].gameObject == null) + { + return; } _uiMap[uiinfo].gameObject.SetActive(true); if (param != null) @@ -89,7 +94,7 @@ namespace TEngine.Runtime.HotUpdate { compenent.OnEnter(param); } - } + } } /// /// 隐藏ui对象 @@ -109,7 +114,7 @@ namespace TEngine.Runtime.HotUpdate _uiMap[uiinfo].gameObject.SetActive(false); Object.DestroyImmediate(_uiMap[uiinfo].gameObject); - _uiMap.Remove(uiinfo); + _uiMap.Remove(uiinfo); } /// diff --git a/Assets/TEngine/Scripts/Runtime/TEngine.Runtime.asmdef b/Assets/TEngine/Scripts/Runtime/TEngine.Runtime.asmdef index 8dee4e4e..4a79db0f 100644 --- a/Assets/TEngine/Scripts/Runtime/TEngine.Runtime.asmdef +++ b/Assets/TEngine/Scripts/Runtime/TEngine.Runtime.asmdef @@ -2,7 +2,8 @@ "name": "TEngine.Runtime", "rootNamespace": "", "references": [ - "GUID:13ba8ce62aa80c74598530029cb2d649" + "GUID:13ba8ce62aa80c74598530029cb2d649", + "GUID:88d491a7059d6f24393c76d9a4cbf684" ], "includePlatforms": [], "excludePlatforms": [],