From 5a05761d810a04fec99b770e1d5b132a2e4a0334 Mon Sep 17 00:00:00 2001 From: TongZiGang <754383023@qq.com> Date: Thu, 24 Jul 2025 12:50:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Scripts/GameLogic/GameLogic.cs | 5 ++ .../Tools/AssetBundle/AssetBundleManager.cs | 84 +++++++++++++++++-- .../Assets/Scripts/GameLogic/UI/UILoader.cs | 76 +++++++++++++++++ .../Scripts/GameLogic/UI/UILoader.cs.meta | 3 + .../Assets/Scripts/GameLogic/UI/UIViewBase.cs | 13 +-- UnityGame/Assets/Scripts/GameStar.cs | 6 ++ 6 files changed, 176 insertions(+), 11 deletions(-) create mode 100644 UnityGame/Assets/Scripts/GameLogic/UI/UILoader.cs create mode 100644 UnityGame/Assets/Scripts/GameLogic/UI/UILoader.cs.meta diff --git a/UnityGame/Assets/Scripts/GameLogic/GameLogic.cs b/UnityGame/Assets/Scripts/GameLogic/GameLogic.cs index 9b377fb..18e2816 100644 --- a/UnityGame/Assets/Scripts/GameLogic/GameLogic.cs +++ b/UnityGame/Assets/Scripts/GameLogic/GameLogic.cs @@ -21,6 +21,11 @@ namespace CreatGame UIManager.Instance.OpenView(UILayer.Main); } + + public void Destroy() + { + AssetBundle.AssetBundleManager.Instance.ReleaseAll(); + } } } diff --git a/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AssetBundleManager.cs b/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AssetBundleManager.cs index 1d96f3d..2c3a5f8 100644 --- a/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AssetBundleManager.cs +++ b/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AssetBundleManager.cs @@ -5,6 +5,7 @@ using UnityEngine.AddressableAssets; using UnityEngine.AddressableAssets.ResourceLocators; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.ResourceManagement.ResourceLocations; +using UnityEngine.U2D; namespace CreatGame.AssetBundle { @@ -15,7 +16,14 @@ namespace CreatGame.AssetBundle public string assetBundleName; public GameObject assetBundle; } - private Dictionary assetBundles; + /// + /// + /// + private Dictionary m_AssetBundles; + /// + /// + /// + private Dictionary m_SpriteAtlasCache; /// /// 是否初始化完成 /// @@ -26,7 +34,10 @@ namespace CreatGame.AssetBundle public AssetBundleManager() { IsInitializeAsync = false; - assetBundles = new Dictionary(); + m_AssetBundles = new Dictionary(); + m_SpriteAtlasCache = new Dictionary(); + + Addressables.InitializeAsync(); } @@ -78,7 +89,7 @@ namespace CreatGame.AssetBundle /// public void LoadGameObjectAsync(string assetBundleName, Action callback) { - if (assetBundles.TryGetValue(assetBundleName, out var bundle)) + if (m_AssetBundles.TryGetValue(assetBundleName, out var bundle)) { callback.Invoke(GameObject.Instantiate(bundle.assetBundle)); return; @@ -105,7 +116,7 @@ namespace CreatGame.AssetBundle /// public GameObject LoadGameObject(string assetBundleName) { - if (assetBundles.TryGetValue(assetBundleName, out var bundle)) + if (m_AssetBundles.TryGetValue(assetBundleName, out var bundle)) { return GameObject.Instantiate(bundle.assetBundle); } @@ -132,8 +143,71 @@ namespace CreatGame.AssetBundle private AssetBundleData CacheAssetBundles(string bundleName, GameObject bundle = null) { var data = new AssetBundleData(){assetBundleName = bundleName, assetBundle = bundle}; - assetBundles.Add(bundleName, data); + m_AssetBundles.Add(bundleName, data); return data; } + /// + /// 同步加载图集 + /// + /// + /// + public SpriteAtlas LoadSpriteAtlas(string atlasName) + { + if (m_SpriteAtlasCache.TryGetValue(atlasName, out var atlas)) + { + return atlas; + } + + var handle = Addressables.LoadAssetAsync(atlasName); + handle.WaitForCompletion(); + if (handle.Status == AsyncOperationStatus.Succeeded) + { + atlas = handle.Result; + Addressables.Release(handle); + m_SpriteAtlasCache.Add(atlasName, atlas); + return atlas; + } + + Debug.LogError($"图集加载失败 atlasName = {atlasName} Status = {handle.Status}"); + return null; + } + /// + /// 异步加载图集 + /// + /// + /// + public void LoadSpriteAsync(string atlasName, Action callback) + { + if (m_SpriteAtlasCache.TryGetValue(atlasName, out var atlas)) + { + callback.Invoke(atlas); + return; + } + Addressables.LoadAssetAsync(atlasName).Completed += (handle) => + { + if (handle.Status == AsyncOperationStatus.Succeeded) + { + atlas = handle.Result; + Addressables.Release(handle); + m_SpriteAtlasCache.Add(atlasName, atlas); + } + else + { + Debug.LogError($"图集加载失败 atlasName = {atlasName} Status = {handle.Status}"); + callback?.Invoke(null); + } + }; + } + /// + /// 释放所有的资源 + /// + public void ReleaseAll() + { + foreach (var mAssetBundle in m_AssetBundles) + { + GameObject.Destroy(mAssetBundle.Value.assetBundle); + } + m_AssetBundles.Clear(); + } } } \ No newline at end of file diff --git a/UnityGame/Assets/Scripts/GameLogic/UI/UILoader.cs b/UnityGame/Assets/Scripts/GameLogic/UI/UILoader.cs new file mode 100644 index 0000000..0ed9349 --- /dev/null +++ b/UnityGame/Assets/Scripts/GameLogic/UI/UILoader.cs @@ -0,0 +1,76 @@ +using UnityEngine; +using CreatGame.AssetBundle; +using System.Collections.Generic; +using UnityEngine.U2D; + +namespace CreatGame.UI +{ + /// + /// ui上的资源加载器 + /// + public class UILoader + { + private List m_GameObjectCache = new List(); + private List m_SpriteCache = new List(); + /// + /// 同步资源加载 + /// + /// + /// + public GameObject LoadGameObject(string name) + { + var gameObj = AssetBundleManager.Instance.LoadGameObject(name); + if (gameObj == null) + { + return null; + } + + m_GameObjectCache.Add(gameObj); + + return gameObj; + } + /// + /// 异步加载预制件 + /// + /// + /// + public void LoadGameObjectAsync(string name, System.Action callback) + { + AssetBundleManager.Instance.LoadGameObjectAsync(name, (obj) => + { + if (obj != null) + { + m_GameObjectCache.Add(obj); + } + callback(obj); + }); + } + /// + /// + /// + /// + /// + /// + public Sprite LoadSprite(string atlasName, string spriteName) + { + var spriteAtlas = AssetBundleManager.Instance.LoadSpriteAtlas(atlasName); + if (spriteAtlas == null) + { + return null; + } + + return spriteAtlas.GetSprite(spriteName); + } + + public void DisposeGameObjectCache() + { + var count = m_GameObjectCache.Count; + for (int i = 0; i < count; i++) + { + var obj = m_GameObjectCache[0]; + m_GameObjectCache.RemoveAt(0); + GameObject.Destroy(obj); + } + } + } +} \ No newline at end of file diff --git a/UnityGame/Assets/Scripts/GameLogic/UI/UILoader.cs.meta b/UnityGame/Assets/Scripts/GameLogic/UI/UILoader.cs.meta new file mode 100644 index 0000000..644a04f --- /dev/null +++ b/UnityGame/Assets/Scripts/GameLogic/UI/UILoader.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dd77ddfde9dc430eb31244ee82bc2147 +timeCreated: 1753323201 \ No newline at end of file diff --git a/UnityGame/Assets/Scripts/GameLogic/UI/UIViewBase.cs b/UnityGame/Assets/Scripts/GameLogic/UI/UIViewBase.cs index b75f44e..b640545 100644 --- a/UnityGame/Assets/Scripts/GameLogic/UI/UIViewBase.cs +++ b/UnityGame/Assets/Scripts/GameLogic/UI/UIViewBase.cs @@ -2,7 +2,7 @@ namespace CreatGame.UI { - public class UIViewBase + public class UIViewBase : UILoader { /// /// 预制件的Addressables地址 @@ -16,7 +16,7 @@ namespace CreatGame.UI /// /// 导出脚本 /// - protected UIViewExport MViewExport; + protected UIViewExport m_ViewExport; /// /// 是否加载完成 /// @@ -27,7 +27,7 @@ namespace CreatGame.UI public virtual void PreLoad(GameObject viewObject) { m_ViewObject = viewObject; - MViewExport = viewObject.GetComponent(); + m_ViewExport = viewObject.GetComponent(); IsPreLoad = true; } /// @@ -42,16 +42,17 @@ namespace CreatGame.UI /// public virtual void CloseView() { + DisposeGameObjectCache(); GameObject.Destroy(m_ViewObject); } protected GameObject GetGameObject(string name) { - for (int i = 0; i < MViewExport.entries.Count; i++) + for (int i = 0; i < m_ViewExport.entries.Count; i++) { - if (MViewExport.entries[i].key == name) + if (m_ViewExport.entries[i].key == name) { - return MViewExport.entries[i].prefab; + return m_ViewExport.entries[i].prefab; } } diff --git a/UnityGame/Assets/Scripts/GameStar.cs b/UnityGame/Assets/Scripts/GameStar.cs index f23baaa..c0ee24b 100644 --- a/UnityGame/Assets/Scripts/GameStar.cs +++ b/UnityGame/Assets/Scripts/GameStar.cs @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -17,4 +18,9 @@ public class GameStar : MonoBehaviour { } + + private void OnDestroy() + { + CreatGame.GameLogic.Instance.Destroy(); + } }