diff --git a/Assets/YooAsset/Runtime/PatchSystem/Operations/InitializationOperation.cs b/Assets/YooAsset/Runtime/PatchSystem/Operations/InitializationOperation.cs index 636c260..2413e69 100644 --- a/Assets/YooAsset/Runtime/PatchSystem/Operations/InitializationOperation.cs +++ b/Assets/YooAsset/Runtime/PatchSystem/Operations/InitializationOperation.cs @@ -44,7 +44,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = "Dry run build failed, see the detail info on the console window."; + Error = "Simulate build failed, see the detail info on the console window."; return; } if (File.Exists(manifestFilePath) == false) @@ -55,9 +55,10 @@ namespace YooAsset return; } - YooLogger.Log($"Load manifest file in editor play mode : {manifestFilePath}"); + YooLogger.Log($"Load manifest file : {manifestFilePath}"); string jsonContent = FileUtility.ReadFile(manifestFilePath); - _impl.AppPatchManifest = PatchManifest.Deserialize(jsonContent); + var simulatePatchManifest = PatchManifest.Deserialize(jsonContent); + _impl.SetSimulatePatchManifest(simulatePatchManifest); _steps = ESteps.Done; Status = EOperationStatus.Succeed; } @@ -109,7 +110,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Succeed; - _impl.AppPatchManifest = _appManifestLoader.Result; + _impl.SetAppPatchManifest(_appManifestLoader.Result); } } } @@ -182,8 +183,8 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Succeed; - _impl.AppPatchManifest = _appManifestLoader.Result; - _impl.LocalPatchManifest = _appManifestLoader.Result; + _impl.SetAppPatchManifest(_appManifestLoader.Result); + _impl.SetLocalPatchManifest(_appManifestLoader.Result); } } } diff --git a/Assets/YooAsset/Runtime/PatchSystem/Operations/UpdateManifestOperation.cs b/Assets/YooAsset/Runtime/PatchSystem/Operations/UpdateManifestOperation.cs index d5c63a4..9516fb0 100644 --- a/Assets/YooAsset/Runtime/PatchSystem/Operations/UpdateManifestOperation.cs +++ b/Assets/YooAsset/Runtime/PatchSystem/Operations/UpdateManifestOperation.cs @@ -201,7 +201,8 @@ namespace YooAsset { try { - _impl.LocalPatchManifest = PatchManifest.Deserialize(content); + var remotePatchManifest = PatchManifest.Deserialize(content); + _impl.SetLocalPatchManifest(remotePatchManifest); YooLogger.Log("Save remote patch manifest file."); string savePath = PathHelper.MakePersistentLoadPath(YooAssetSettingsData.GetPatchManifestFileName(updateResourceVersion)); @@ -223,7 +224,8 @@ namespace YooAsset YooLogger.Log("Load sandbox patch manifest file."); string filePath = PathHelper.MakePersistentLoadPath(YooAssetSettingsData.GetPatchManifestFileName(updateResourceVersion)); string jsonData = File.ReadAllText(filePath); - _impl.LocalPatchManifest = PatchManifest.Deserialize(jsonData); + var sandboxPatchManifest = PatchManifest.Deserialize(jsonData); + _impl.SetLocalPatchManifest(sandboxPatchManifest); } /// diff --git a/Assets/YooAsset/Runtime/PatchSystem/PatchManifest.cs b/Assets/YooAsset/Runtime/PatchSystem/PatchManifest.cs index 2757251..2152ef4 100644 --- a/Assets/YooAsset/Runtime/PatchSystem/PatchManifest.cs +++ b/Assets/YooAsset/Runtime/PatchSystem/PatchManifest.cs @@ -56,6 +56,10 @@ namespace YooAsset [NonSerialized] public readonly Dictionary AssetPathMapping = new Dictionary(); + // 资源路径映射相关 + private bool _isInitAssetPathMapping = false; + private bool _locationToLower = false; + /// /// 获取内置资源标签列表 @@ -141,11 +145,65 @@ namespace YooAsset return string.Empty; } + /// + /// 初始化资源路径映射 + /// + public void InitAssetPathMapping(bool locationToLower) + { + if (_isInitAssetPathMapping) + return; + _isInitAssetPathMapping = true; + + if (EnableAddressable) + { + if (locationToLower) + YooLogger.Warning("Addressable not support location to lower !"); + + foreach (var patchAsset in AssetList) + { + string location = patchAsset.Address; + if (AssetPathMapping.ContainsKey(location)) + throw new Exception($"Address have existed : {location}"); + else + AssetPathMapping.Add(location, patchAsset.AssetPath); + } + } + else + { + _locationToLower = locationToLower; + foreach (var patchAsset in AssetList) + { + string location = patchAsset.AssetPath; + if (locationToLower) + location = location.ToLower(); + + // 添加原生路径的映射 + if (AssetPathMapping.ContainsKey(location)) + throw new Exception($"AssetPath have existed : {location}"); + else + AssetPathMapping.Add(location, patchAsset.AssetPath); + + // 添加无后缀名路径的映射 + if (Path.HasExtension(location)) + { + string locationWithoutExtension = StringUtility.RemoveExtension(location); + if (AssetPathMapping.ContainsKey(locationWithoutExtension)) + YooLogger.Warning($"AssetPath have existed : {locationWithoutExtension}"); + else + AssetPathMapping.Add(locationWithoutExtension, patchAsset.AssetPath); + } + } + } + } + /// /// 映射为资源路径 /// public string MappingToAssetPath(string location) { + if (_locationToLower) + location = location.ToLower(); + if (AssetPathMapping.TryGetValue(location, out string assetPath)) { return assetPath; @@ -192,42 +250,6 @@ namespace YooAsset patchManifest.Assets.Add(assetPath, patchAsset); } - // AssetPathMapping - if (patchManifest.EnableAddressable) - { - foreach (var patchAsset in patchManifest.AssetList) - { - string address = patchAsset.Address; - if (patchManifest.AssetPathMapping.ContainsKey(address)) - throw new Exception($"Address have existed : {address}"); - else - patchManifest.AssetPathMapping.Add(address, patchAsset.AssetPath); - } - } - else - { - foreach (var patchAsset in patchManifest.AssetList) - { - string assetPath = patchAsset.AssetPath; - - // 添加原生路径的映射 - if (patchManifest.AssetPathMapping.ContainsKey(assetPath)) - throw new Exception($"AssetPath have existed : {assetPath}"); - else - patchManifest.AssetPathMapping.Add(assetPath, assetPath); - - // 添加无后缀名路径的映射 - if (Path.HasExtension(assetPath)) - { - string assetPathWithoutExtension = StringUtility.RemoveExtension(assetPath); - if (patchManifest.AssetPathMapping.ContainsKey(assetPathWithoutExtension)) - YooLogger.Warning($"AssetPath have existed : {assetPathWithoutExtension}"); - else - patchManifest.AssetPathMapping.Add(assetPathWithoutExtension, assetPath); - } - } - } - return patchManifest; } } diff --git a/Assets/YooAsset/Runtime/PatchSystem/PlayMode/EditorSimulateModeImpl.cs b/Assets/YooAsset/Runtime/PatchSystem/PlayMode/EditorSimulateModeImpl.cs index 33b47f0..a564988 100644 --- a/Assets/YooAsset/Runtime/PatchSystem/PlayMode/EditorSimulateModeImpl.cs +++ b/Assets/YooAsset/Runtime/PatchSystem/PlayMode/EditorSimulateModeImpl.cs @@ -6,13 +6,15 @@ namespace YooAsset { internal class EditorSimulateModeImpl : IBundleServices { - internal PatchManifest AppPatchManifest; + private PatchManifest _simulatePatchManifest; + private bool _locationToLower; /// /// 异步初始化 /// - public InitializationOperation InitializeAsync() + public InitializationOperation InitializeAsync(bool locationToLower) { + _locationToLower = locationToLower; var operation = new EditorSimulateModeInitializationOperation(this); OperationSystem.ProcessOperaiton(operation); return operation; @@ -23,9 +25,16 @@ namespace YooAsset /// public int GetResourceVersion() { - if (AppPatchManifest == null) + if (_simulatePatchManifest == null) return 0; - return AppPatchManifest.ResourceVersion; + return _simulatePatchManifest.ResourceVersion; + } + + // 设置资源清单 + internal void SetSimulatePatchManifest(PatchManifest patchManifest) + { + _simulatePatchManifest = patchManifest; + _simulatePatchManifest.InitAssetPathMapping(_locationToLower); } #region IBundleServices接口 @@ -34,9 +43,9 @@ namespace YooAsset if (string.IsNullOrEmpty(bundleName)) return new BundleInfo(string.Empty); - if (AppPatchManifest.Bundles.TryGetValue(bundleName, out PatchBundle patchBundle)) + if (_simulatePatchManifest.Bundles.TryGetValue(bundleName, out PatchBundle patchBundle)) { - string mainAssetPath = AppPatchManifest.TryGetBundleMainAssetPath(bundleName); + string mainAssetPath = _simulatePatchManifest.TryGetBundleMainAssetPath(bundleName); BundleInfo bundleInfo = new BundleInfo(patchBundle, BundleInfo.ELoadMode.LoadFromEditor, mainAssetPath); return bundleInfo; } @@ -49,19 +58,19 @@ namespace YooAsset } AssetInfo[] IBundleServices.GetAssetInfos(string[] tags) { - return PatchHelper.GetAssetsInfoByTag(AppPatchManifest, tags); + return PatchHelper.GetAssetsInfoByTag(_simulatePatchManifest, tags); } string IBundleServices.MappingToAssetPath(string location) { - return AppPatchManifest.MappingToAssetPath(location); + return _simulatePatchManifest.MappingToAssetPath(location); } string IBundleServices.GetBundleName(string assetPath) { - return AppPatchManifest.GetBundleName(assetPath); + return _simulatePatchManifest.GetBundleName(assetPath); } string[] IBundleServices.GetAllDependencies(string assetPath) { - return AppPatchManifest.GetAllDependencies(assetPath); + return _simulatePatchManifest.GetAllDependencies(assetPath); } #endregion } diff --git a/Assets/YooAsset/Runtime/PatchSystem/PlayMode/HostPlayModeImpl.cs b/Assets/YooAsset/Runtime/PatchSystem/PlayMode/HostPlayModeImpl.cs index 811f3d8..ef60c21 100644 --- a/Assets/YooAsset/Runtime/PatchSystem/PlayMode/HostPlayModeImpl.cs +++ b/Assets/YooAsset/Runtime/PatchSystem/PlayMode/HostPlayModeImpl.cs @@ -8,10 +8,11 @@ namespace YooAsset internal class HostPlayModeImpl : IBundleServices { // 补丁清单 - internal PatchManifest AppPatchManifest; - internal PatchManifest LocalPatchManifest; + internal PatchManifest AppPatchManifest { private set; get; } + internal PatchManifest LocalPatchManifest { private set; get; } // 参数相关 + internal bool LocationToLower { private set; get; } internal bool ClearCacheWhenDirty { private set; get; } private string _defaultHostServer; private string _fallbackHostServer; @@ -19,8 +20,9 @@ namespace YooAsset /// /// 异步初始化 /// - public InitializationOperation InitializeAsync(bool clearCacheWhenDirty, string defaultHostServer, string fallbackHostServer) + public InitializationOperation InitializeAsync(bool locationToLower, bool clearCacheWhenDirty, string defaultHostServer, string fallbackHostServer) { + LocationToLower = locationToLower; ClearCacheWhenDirty = clearCacheWhenDirty; _defaultHostServer = defaultHostServer; _fallbackHostServer = fallbackHostServer; @@ -274,6 +276,17 @@ namespace YooAsset return bundleInfo; } + // 设置资源清单 + internal void SetAppPatchManifest(PatchManifest patchManifest) + { + AppPatchManifest = patchManifest; + } + internal void SetLocalPatchManifest(PatchManifest patchManifest) + { + LocalPatchManifest = patchManifest; + LocalPatchManifest.InitAssetPathMapping(LocationToLower); + } + #region IBundleServices接口 BundleInfo IBundleServices.GetBundleInfo(string bundleName) { diff --git a/Assets/YooAsset/Runtime/PatchSystem/PlayMode/OfflinePlayModeImpl.cs b/Assets/YooAsset/Runtime/PatchSystem/PlayMode/OfflinePlayModeImpl.cs index 4b726aa..78c73ab 100644 --- a/Assets/YooAsset/Runtime/PatchSystem/PlayMode/OfflinePlayModeImpl.cs +++ b/Assets/YooAsset/Runtime/PatchSystem/PlayMode/OfflinePlayModeImpl.cs @@ -6,13 +6,15 @@ namespace YooAsset { internal class OfflinePlayModeImpl : IBundleServices { - internal PatchManifest AppPatchManifest; + private PatchManifest _appPatchManifest; + private bool _locationToLower; /// /// 异步初始化 /// - public InitializationOperation InitializeAsync() + public InitializationOperation InitializeAsync(bool locationToLower) { + _locationToLower = locationToLower; var operation = new OfflinePlayModeInitializationOperation(this); OperationSystem.ProcessOperaiton(operation); return operation; @@ -23,9 +25,9 @@ namespace YooAsset /// public int GetResourceVersion() { - if (AppPatchManifest == null) + if (_appPatchManifest == null) return 0; - return AppPatchManifest.ResourceVersion; + return _appPatchManifest.ResourceVersion; } /// @@ -33,18 +35,25 @@ namespace YooAsset /// public PatchUnpackerOperation CreatePatchUnpackerByTags(string[] tags, int fileUpackingMaxNumber, int failedTryAgain) { - List unpcakList = PatchHelper.GetUnpackListByTags(AppPatchManifest, tags); + List unpcakList = PatchHelper.GetUnpackListByTags(_appPatchManifest, tags); var operation = new PatchUnpackerOperation(unpcakList, fileUpackingMaxNumber, failedTryAgain); return operation; } + // 设置资源清单 + internal void SetAppPatchManifest(PatchManifest patchManifest) + { + _appPatchManifest = patchManifest; + _appPatchManifest.InitAssetPathMapping(_locationToLower); + } + #region IBundleServices接口 BundleInfo IBundleServices.GetBundleInfo(string bundleName) { if (string.IsNullOrEmpty(bundleName)) return new BundleInfo(string.Empty); - if (AppPatchManifest.Bundles.TryGetValue(bundleName, out PatchBundle patchBundle)) + if (_appPatchManifest.Bundles.TryGetValue(bundleName, out PatchBundle patchBundle)) { BundleInfo bundleInfo = new BundleInfo(patchBundle, BundleInfo.ELoadMode.LoadFromStreaming); return bundleInfo; @@ -58,19 +67,19 @@ namespace YooAsset } AssetInfo[] IBundleServices.GetAssetInfos(string[] tags) { - return PatchHelper.GetAssetsInfoByTag(AppPatchManifest, tags); + return PatchHelper.GetAssetsInfoByTag(_appPatchManifest, tags); } string IBundleServices.MappingToAssetPath(string location) { - return AppPatchManifest.MappingToAssetPath(location); + return _appPatchManifest.MappingToAssetPath(location); } string IBundleServices.GetBundleName(string assetPath) { - return AppPatchManifest.GetBundleName(assetPath); + return _appPatchManifest.GetBundleName(assetPath); } string[] IBundleServices.GetAllDependencies(string assetPath) { - return AppPatchManifest.GetAllDependencies(assetPath); + return _appPatchManifest.GetAllDependencies(assetPath); } #endregion } diff --git a/Assets/YooAsset/Runtime/YooAssets.cs b/Assets/YooAsset/Runtime/YooAssets.cs index ee13c2b..d940c11 100644 --- a/Assets/YooAsset/Runtime/YooAssets.cs +++ b/Assets/YooAsset/Runtime/YooAssets.cs @@ -35,6 +35,11 @@ namespace YooAsset /// public abstract class CreateParameters { + /// + /// 资源定位地址为小写地址 + /// + public bool LocationToLower = false; + /// /// 资源定位服务接口 /// @@ -123,7 +128,7 @@ namespace YooAsset #if !UNITY_EDITOR if (parameters is EditorSimulateModeParameters) - throw new Exception($"Editor play mode only support unity editor."); + throw new Exception($"Editor simulate mode only support unity editor."); #endif // 创建驱动器 @@ -182,14 +187,14 @@ namespace YooAsset _editorSimulateModeImpl = new EditorSimulateModeImpl(); _bundleServices = _editorSimulateModeImpl; AssetSystem.Initialize(true, parameters.AssetLoadingMaxNumber, parameters.DecryptionServices, _bundleServices); - initializeOperation = _editorSimulateModeImpl.InitializeAsync(); + initializeOperation = _editorSimulateModeImpl.InitializeAsync(parameters.LocationToLower); } else if (_playMode == EPlayMode.OfflinePlayMode) { _offlinePlayModeImpl = new OfflinePlayModeImpl(); _bundleServices = _offlinePlayModeImpl; AssetSystem.Initialize(false, parameters.AssetLoadingMaxNumber, parameters.DecryptionServices, _bundleServices); - initializeOperation = _offlinePlayModeImpl.InitializeAsync(); + initializeOperation = _offlinePlayModeImpl.InitializeAsync(parameters.LocationToLower); } else if (_playMode == EPlayMode.HostPlayMode) { @@ -198,6 +203,7 @@ namespace YooAsset AssetSystem.Initialize(false, parameters.AssetLoadingMaxNumber, parameters.DecryptionServices, _bundleServices); var hostPlayModeParameters = parameters as HostPlayModeParameters; initializeOperation = _hostPlayModeImpl.InitializeAsync( + hostPlayModeParameters.LocationToLower, hostPlayModeParameters.ClearCacheWhenDirty, hostPlayModeParameters.DefaultHostServer, hostPlayModeParameters.FallbackHostServer); @@ -881,7 +887,7 @@ namespace YooAsset /// /// 资源定位地址转换为资源完整路径 /// - public static string MappingToAssetPath(string location) + internal static string MappingToAssetPath(string location) { DebugCheckLocation(location); return _bundleServices.MappingToAssetPath(location);