hexiaojie 8 месяцев назад
Родитель
Сommit
aa626186f4

+ 13 - 3
GameClient/Assets/Game/HotUpdate/Assets/PrefabManager.cs

@@ -217,9 +217,19 @@ namespace GFGGame
                 preDrawDic[resPath] = list;
             }
 
-            var t = PrefabManager.Instance.SpawnSync(resPath);
-            t.transform.SetParent(preDrawRoot.transform, false);
-            list.Add(t);
+            // 将SpawnSync改为SpawnAsync
+            SpawnAsync(resPath, (go) =>
+            {
+                if (go != null)
+                {
+                    go.transform.SetParent(preDrawRoot.transform, false);
+                    list.Add(go);
+                }
+                else
+                {
+                    Debug.LogError($"PreDraw加载失败: {resPath}");
+                }
+            });
         }
 
         public GameObject GetPreDrawObj(string resPath)

+ 1 - 1
GameClient/Assets/Game/HotUpdate/Controller/GameController.cs

@@ -78,7 +78,7 @@ namespace GFGGame
                     //界面
                     try
                     {
-                        UGUIManager.Instance.Init();
+                        UGUIManager.Instance.StartInitialization();
                     }
                     catch (Exception e)
                     {

+ 56 - 28
GameClient/Assets/Game/HotUpdate/DressUp/DressUpLayerOperation.cs

@@ -264,14 +264,13 @@ namespace GFGGame
             _steps = EDressUpSteps.Done;
             Status = EOperationStatus.Succeed;
         }
-
-
+        
         private void UpdateLayer(Action onComplete = null)
         {
             //LogUtil.LogEditor($"add UpdateLayer {itemCfg.id} layerId {layerId}");
             int sortingOrder = ItemTypeCfgArray.Instance.GetSortingOrder(itemCfg.SubType, layerId);
 
-            // 清理旧的
+            // 清理旧的资源
             var spritObjName = DressUpUtil.GetSpriteName(itemCfg, layerId);
             DressUpUtil.TryRemoveSprite(parentObj, spritObjName);
             var aniObjName = string.Format(DressUpUtil.FORMAT_ANIMATION_NAME, itemCfg.Id, layerId);
@@ -316,28 +315,28 @@ namespace GFGGame
                         needSetMask,
                         (gameObj) =>
                         {
-                            if (gameObj != null)
-                            {
-                                mainResAdded = true;
-                            }
-
+                            mainResAdded = gameObj != null;
                             asyncOperationCount--;
                             CheckComplete();
                         });
                 }
             }
 
-            // 检查并处理特效资源(改为同步方式)
+            // 检查并处理特效资源(改为异步方式)
             if (!string.IsNullOrEmpty(effectResPath))
             {
-                var effectObj = DressUpUtil.TryAddEffectObj(effectResPath, effectObjName, parentObj, sortingOrder);
-                effectResAdded = effectObj != null;
-            }
-
-            // 如果没有异步操作,直接调用完成回调
-            if (asyncOperationCount == 0)
-            {
-                onComplete?.Invoke();
+                asyncOperationCount++;
+                DressUpUtil.TryAddEffectObjAsync(
+                    effectResPath,
+                    effectObjName,
+                    parentObj,
+                    sortingOrder,
+                    (gameObj) =>
+                    {
+                        effectResAdded = gameObj != null;
+                        asyncOperationCount--;
+                        CheckComplete();
+                    });
             }
 
             // 检查所有异步操作是否完成
@@ -348,11 +347,16 @@ namespace GFGGame
                     onComplete?.Invoke();
                 }
             }
+
+            // 如果没有异步操作,直接调用完成回调
+            if (asyncOperationCount == 0)
+            {
+                onComplete?.Invoke();
+            }
         }
 
         private void UpdateBody(Action onComplete = null)
         {
-            //LogUtil.LogEditor("update UpdateBody");
             var spritObjName = DressUpUtil.BODY_SPRITE_NAME;
             var aniObjName = DressUpUtil.BODY_ANIMATION_NAME;
             var effectObjName = DressUpUtil.BODY_EFFECT_OBJ_NAME;
@@ -374,12 +378,22 @@ namespace GFGGame
                 if (this.showAni)
                 {
                     // 异步加载动画
+                    asyncOperationCount++;
                     DressUpUtil.AddAnimationObjAsync(
                         resPath,
                         aniObjName,
                         parentObj,
                         sortingOrder,
-                        (gameObj) => { mainResAdded = true; });
+                        (gameObj) =>
+                        {
+                            if (gameObj != null)
+                            {
+                                mainResAdded = true;
+                            }
+
+                            asyncOperationCount--;
+                            CheckComplete();
+                        });
                 }
                 else
                 {
@@ -411,18 +425,25 @@ namespace GFGGame
                 }
             }
 
-            // 处理特效资源(假设TryAddEffectObj保持同步
+            // 处理特效资源(改为异步方式
             if (!string.IsNullOrEmpty(effectResPath))
             {
-                DressUpUtil.TryAddEffectObj(effectResPath, effectObjName, parentObj, sortingOrder);
-                effectResAdded = true;
-            }
+                asyncOperationCount++;
+                DressUpUtil.TryAddEffectObjAsync(
+                    effectResPath,
+                    effectObjName,
+                    parentObj,
+                    sortingOrder,
+                    (gameObj) =>
+                    {
+                        if (gameObj != null)
+                        {
+                            effectResAdded = true;
+                        }
 
-            // 如果没有异步操作且需要执行位置重置(动画切换情况)
-            if (asyncOperationCount == 0 && !this.showAni && removeBodyAni)
-            {
-                parentObj.transform.localPosition = Vector3.zero;
-                parentObj.transform.localRotation = Quaternion.identity;
+                        asyncOperationCount--;
+                        CheckComplete();
+                    });
             }
 
             // 检查所有异步操作是否完成
@@ -430,6 +451,13 @@ namespace GFGGame
             {
                 if (asyncOperationCount <= 0)
                 {
+                    // 额外检查:如果是从动画切换到精灵且移除了动画
+                    if (!this.showAni && removeBodyAni && asyncOperationCount == 0)
+                    {
+                        parentObj.transform.localPosition = Vector3.zero;
+                        parentObj.transform.localRotation = Quaternion.identity;
+                    }
+
                     onComplete?.Invoke();
                 }
             }

+ 39 - 25
GameClient/Assets/Game/HotUpdate/DressUp/DressUpUtil.cs

@@ -483,41 +483,55 @@ namespace GFGGame
         //     return gameObj;
         // }
 
-        public static GameObject TryAddEffectObj(string resPath, string objName, GameObject parentObj, int sortingOrder)
+        public static void TryAddEffectObjAsync(string resPath, string objName, GameObject parentObj, int sortingOrder,
+            Action<GameObject> callback)
         {
+            // 检查是否已存在相同对象
             var gameObj = GetGameObjExisted(parentObj, objName, resPath);
             if (gameObj != null)
             {
-                return gameObj;
+                callback?.Invoke(gameObj);
+                return;
             }
 
-            gameObj = PrefabManager.Instance.SpawnSync(resPath);
-            if (gameObj == null)
+            // 异步加载预制体
+            PrefabManager.Instance.SpawnAsync(resPath, (loadedObj) =>
             {
-                return null;
-            }
+                if (loadedObj == null)
+                {
+                    callback?.Invoke(null);
+                    return;
+                }
 
-            DressUpOffsetInfo dressUpOffsetInfo = gameObj.GetComponent<DressUpOffsetInfo>();
-            if (dressUpOffsetInfo == null)
-            {
-                //这里因为特效资源初始是有位移偏移的,记录下来每次设置为初始位置和角度,以防unity自身的坐标转换导致位置偏移
-                dressUpOffsetInfo = gameObj.AddComponent<DressUpOffsetInfo>();
-                dressUpOffsetInfo.OffsetPosition = gameObj.transform.localPosition;
-                dressUpOffsetInfo.Rotation = gameObj.transform.localRotation;
-            }
+                // 处理DressUpOffsetInfo组件
+                DressUpOffsetInfo dressUpOffsetInfo = loadedObj.GetComponent<DressUpOffsetInfo>();
+                if (dressUpOffsetInfo == null)
+                {
+                    dressUpOffsetInfo = loadedObj.AddComponent<DressUpOffsetInfo>();
+                    dressUpOffsetInfo.OffsetPosition = loadedObj.transform.localPosition;
+                    dressUpOffsetInfo.Rotation = loadedObj.transform.localRotation;
+                }
 
-            gameObj.transform.localPosition = dressUpOffsetInfo.OffsetPosition;
-            gameObj.transform.rotation = dressUpOffsetInfo.Rotation;
-            gameObj.transform.SetParent(parentObj.transform, false);
-            gameObj.name = objName;
-            var sortingGroup = gameObj.transform.GetComponent<SortingGroup>();
-            if (sortingGroup != null)
-            {
-                GameObject.Destroy(sortingGroup);
-            }
+                // 设置位置和旋转
+                loadedObj.transform.localPosition = dressUpOffsetInfo.OffsetPosition;
+                loadedObj.transform.rotation = dressUpOffsetInfo.Rotation;
+
+                // 设置父对象和名称
+                loadedObj.transform.SetParent(parentObj.transform, false);
+                loadedObj.name = objName;
+
+                // 处理SortingGroup组件
+                var sortingGroup = loadedObj.GetComponent<SortingGroup>();
+                if (sortingGroup != null)
+                {
+                    GameObject.Destroy(sortingGroup);
+                }
 
-            SetRenderersOrder(gameObj, sortingOrder + 1); //特效层默认高一个层级
-            return gameObj;
+                // 设置渲染层级
+                SetRenderersOrder(loadedObj, sortingOrder + 1); //特效层默认高一个层级
+
+                callback?.Invoke(loadedObj);
+            });
         }
 
         public static bool TryRemoveObj(GameObject parentObj, string objName)

Разница между файлами не показана из-за своего большого размера
+ 426 - 346
GameClient/Assets/Game/HotUpdate/ETCodes/PreGeneratedTypes.cs


+ 33 - 19
GameClient/Assets/Game/HotUpdate/Effect/EffectUI.cs

@@ -1,4 +1,5 @@
-using FairyGUI;
+using System;
+using FairyGUI;
 using UnityEngine;
 
 namespace GFGGame
@@ -10,12 +11,13 @@ namespace GFGGame
         public bool Released;
 
 
-        public void Reset(GGraph holder, string uiName, string resName, float scale = 100, EffectUIType effectUIType = EffectUIType.UI )
+        public void Reset(GGraph holder, string uiName, string resName, float scale = 100,
+            EffectUIType effectUIType = EffectUIType.UI, Action onComplete = null)
         {
             if (!Released) Release();
             Released = false;
             string resPath;
-            switch(effectUIType)
+            switch (effectUIType)
             {
                 case EffectUIType.Card:
                     resPath = ResPathUtil.GetCardAnimationPath(resName);
@@ -24,22 +26,32 @@ namespace GFGGame
                     resPath = ResPathUtil.GetViewEffectPath(uiName, resName);
                     break;
             }
-            _gameObject = PrefabManager.Instance.SpawnSync(resPath);
-            if(_gameObject == null)
+
+            PrefabManager.Instance.SpawnAsync(resPath, (go) =>
             {
-                return;
-            }
-            _gameObject.transform.localScale = new Vector3(scale, scale, scale);
+                if (go == null)
+                {
+                    onComplete?.Invoke(); // 即使失败也通知
+                    return;
+                }
 
-            _wrapper = new GoWrapper(_gameObject);
-            holder.SetNativeObject(_wrapper);
-            var obj = _gameObject.GetComponent<BoxCollider2D>();
-            if (obj != null) {
-                CardDataManager.CardResInitWidth = (int)(obj.size.x * 100);
-                CardDataManager.CardResInitHight = (int)(obj.size.y * 100);
-                holder.x = CardDataManager.CardResInitWidth / 2 - obj.offset.x * 100;
-                holder.y = CardDataManager.CardResInitHight / 2 - obj.offset.y * 100;
-            }
+                _gameObject = go;
+                _gameObject.transform.localScale = new Vector3(scale, scale, scale);
+
+                _wrapper = new GoWrapper(_gameObject);
+                holder.SetNativeObject(_wrapper);
+
+                var obj = _gameObject.GetComponent<BoxCollider2D>();
+                if (obj != null)
+                {
+                    CardDataManager.CardResInitWidth = (int)(obj.size.x * 100);
+                    CardDataManager.CardResInitHight = (int)(obj.size.y * 100);
+                    holder.x = CardDataManager.CardResInitWidth / 2 - obj.offset.x * 100;
+                    holder.y = CardDataManager.CardResInitHight / 2 - obj.offset.y * 100;
+                }
+
+                onComplete?.Invoke();
+            });
         }
 
         public void Release()
@@ -51,12 +63,14 @@ namespace GFGGame
                 //GameObject.DestroyImmediate(_gameObject);
                 _gameObject = null;
             }
+
             if (_wrapper != null)
             {
-                if(_wrapper.wrapTarget != null)
+                if (_wrapper.wrapTarget != null)
                 {
                     _wrapper.wrapTarget = null;
                 }
+
                 _wrapper.Dispose();
                 _wrapper = null;
             }
@@ -67,4 +81,4 @@ namespace GFGGame
             return _gameObject;
         }
     }
-}
+}

+ 76 - 80
GameClient/Assets/Game/HotUpdate/FairyGUI/GFGUIPackage.cs

@@ -44,7 +44,7 @@ namespace GFGGame
         //     _packages.Add(descFilePath, uiPackage);
         // }
 
-        public static async Task AddPackageAsync(string descFilePath)
+        public static void AddPackage(string descFilePath, Action onComplete = null, Action<string> onError = null)
         {
             // 打印开始加载信息
             Debug.Log($"开始加载UI包: {descFilePath}");
@@ -54,108 +54,104 @@ namespace GFGGame
             {
                 _assetCount[descFilePath] = count + 1;
                 Debug.Log($"{descFilePath} 已引用,引用计数+1 (当前: {count + 1})");
+                onComplete?.Invoke();
                 return;
             }
 
             _assetCount.Add(descFilePath, count + 1);
 
-            try
-            {
-                // 加载主资源
-                Debug.Log($"正在加载描述文件: {descFilePath}_fui.bytes");
-                var handle = YooAssets.LoadAssetAsync<TextAsset>($"{descFilePath}_fui.bytes");
-                await handle.Task;
+            // 加载主资源
+            Debug.Log($"正在加载描述文件: {descFilePath}_fui.bytes");
+            var handle = YooAssets.LoadAssetAsync<TextAsset>($"{descFilePath}_fui.bytes");
 
-                if (handle.Status == EOperationStatus.Succeed)
+            handle.Completed += (mainHandle) =>
+            {
+                if (mainHandle.Status != EOperationStatus.Succeed)
                 {
-                    Debug.Log($"描述文件加载成功: {descFilePath}_fui.bytes");
-                    TextAsset textAsset = handle.AssetObject as TextAsset;
-                    CacheAssetHandle(descFilePath, handle);
-
-                    // 添加UI包
-                    Debug.Log($"正在添加UI包: {descFilePath}");
-                    var uiPackage = UIPackage.AddPackage(textAsset.bytes, descFilePath,
-                        (string name, string extension, System.Type type, PackageItem item) =>
+                    string error = $"描述文件加载失败: {descFilePath}_fui.bytes, 错误: {mainHandle.LastError}";
+                    Debug.LogError(error);
+                    onError?.Invoke(error);
+                    return;
+                }
+
+                Debug.Log($"描述文件加载成功: {descFilePath}_fui.bytes");
+                TextAsset textAsset = mainHandle.AssetObject as TextAsset;
+                CacheAssetHandle(descFilePath, mainHandle);
+
+                // 添加UI包
+                Debug.Log($"正在添加UI包: {descFilePath}");
+                var uiPackage = UIPackage.AddPackage(textAsset.bytes, descFilePath,
+                    (string name, string extension, System.Type type, PackageItem item) =>
+                    {
+                        string location = name + extension;
+                        Debug.Log($"正在加载依赖资源: {location}");
+
+                        if (!YooAssets.CheckResExist(location))
                         {
-                            string location = name + extension;
-                            Debug.Log($"正在加载依赖资源: {location}");
+                            Debug.LogWarning($"依赖资源不存在: {location}");
+                            return;
+                        }
 
-                            if (!YooAssets.CheckResExist(location))
+                        AssetOperationHandle depHandle = YooAssets.LoadAssetAsync(location, type);
+                        CacheAssetHandle(descFilePath, depHandle);
+                        depHandle.Completed += (depHandle) =>
+                        {
+                            if (depHandle.Status != EOperationStatus.Succeed)
                             {
-                                Debug.LogWarning($"依赖资源不存在: {location}");
+                                Debug.LogError($"依赖资源加载失败: {location}");
                                 return;
                             }
 
-                            AssetOperationHandle handle = YooAssets.LoadAssetAsync(location, type);
-                            CacheAssetHandle(descFilePath, handle);
-                            handle.Completed += (handle) =>
+                            if (depHandle.AssetObject == null)
                             {
-                                if (handle.Status != EOperationStatus.Succeed)
-                                {
-                                    Debug.LogError($"依赖资源加载失败: {location}");
-                                    return;
-                                }
+                                Debug.LogWarning($"依赖资源为空: {location}");
+                                return;
+                            }
 
-                                if (handle.AssetObject == null)
-                                {
-                                    Debug.LogWarning($"依赖资源为空: {location}");
-                                    return;
-                                }
+                            Debug.Log($"依赖资源加载成功: {location}");
+                            Texture tex = depHandle.AssetObject as Texture;
+                            if (tex != null)
+                            {
+                                string alphaLocation = name + "!a" + extension;
+                                Debug.Log($"检测透明通道资源: {alphaLocation}");
 
-                                Debug.Log($"依赖资源加载成功: {location}");
-                                Texture tex = handle.AssetObject as Texture;
-                                if (tex != null)
+                                if (YooAssets.CheckResExist(alphaLocation))
                                 {
-                                    string location = name + "!a" + extension;
-                                    Debug.Log($"检测透明通道资源: {location}");
-
-                                    if (YooAssets.CheckResExist(location))
+                                    AssetOperationHandle alphaHandle = YooAssets.LoadAssetAsync(alphaLocation, type);
+                                    CacheAssetHandle(descFilePath, alphaHandle);
+                                    alphaHandle.Completed += (alphaHandle) =>
                                     {
-                                        AssetOperationHandle handleAlpha = YooAssets.LoadAssetAsync(location, type);
-                                        CacheAssetHandle(descFilePath, handleAlpha);
-                                        handleAlpha.Completed += (handle1) =>
+                                        if (alphaHandle.Status != EOperationStatus.Succeed)
+                                        {
+                                            Debug.LogError($"透明通道资源加载失败: {alphaLocation}");
+                                            return;
+                                        }
+
+                                        if (alphaHandle.AssetObject == null)
                                         {
-                                            if (handle1.Status != EOperationStatus.Succeed)
-                                            {
-                                                Debug.LogError($"透明通道资源加载失败: {location}");
-                                                return;
-                                            }
-
-                                            if (handle1.AssetObject == null)
-                                            {
-                                                Debug.LogWarning($"透明通道资源为空: {location}");
-                                                return;
-                                            }
-
-                                            Debug.Log($"透明通道资源加载成功: {location}");
-                                            Texture alphaTex = handle1.AssetObject as Texture;
-                                            item.owner.SetItemAsset(item, tex, alphaTex, DestroyMethod.None);
-                                        };
-                                        return;
-                                    }
+                                            Debug.LogWarning($"透明通道资源为空: {alphaLocation}");
+                                            return;
+                                        }
+
+                                        Debug.Log($"透明通道资源加载成功: {alphaLocation}");
+                                        Texture alphaTex = alphaHandle.AssetObject as Texture;
+                                        item.owner.SetItemAsset(item, tex, alphaTex, DestroyMethod.None);
+                                    };
+                                    return;
                                 }
+                            }
 
-                                item.owner.SetItemAsset(item, handle.AssetObject, null, DestroyMethod.None);
-                            };
-                        });
+                            item.owner.SetItemAsset(item, depHandle.AssetObject, null, DestroyMethod.None);
+                        };
+                    });
 
-                    _packages.Add(descFilePath, uiPackage);
-                    Debug.Log($"UI包添加完成: {descFilePath}");
-                    CheckRemovePackage(descFilePath);
-                }
-                else
-                {
-                    Debug.LogError($"描述文件加载失败: {descFilePath}_fui.bytes, 错误: {handle.LastError}");
-                }
-            }
-            catch (Exception ex)
-            {
-                Debug.LogError($"加载UI包异常: {descFilePath}, 错误: {ex.Message}");
-                throw;
-            }
+                _packages.Add(descFilePath, uiPackage);
+                Debug.Log($"UI包添加完成: {descFilePath}");
+                CheckRemovePackage(descFilePath);
+                onComplete?.Invoke();
+            };
         }
-
-
+        
         public static void ReleasePackage(string descFilePath)
         {
             _assetCount.TryGetValue(descFilePath, out var count);

+ 1 - 1
GameClient/Assets/Game/HotUpdate/GameConfig.cs

@@ -32,7 +32,7 @@ namespace GFGGame
             var result = JsonMapper.ToObject<Result>(json);
             LoginAddress = result.loginApiUrl;
             //LoginAddress = "43.139.184.240:10003";
-            LoginAddress = "192.168.1.191:11005";//测试地址
+            //LoginAddress = "129.204.4.238:10013";//测试地址
             showGM = int.Parse(result.showGM);
             if(!string.IsNullOrEmpty(result.openTime))
             {

+ 60 - 12
GameClient/Assets/Game/HotUpdate/UGUI/UGUIManager.cs

@@ -8,30 +8,78 @@ namespace GFGGame
     public class UGUIManager : SingletonBase<UGUIManager>
     {
         public GameObject desktop;
+        private bool _otherSystemsInitialized = false;
+        private bool _uiPackagesLoaded = false;
 
-        public async void Init()
+        public void StartInitialization(Action onComplete = null, Action<string> onError = null)
         {
-            // 1. 加载 UI Canvas
+            // 1. 异步加载 UI Canvas 预制体
             var handle = YooAssets.LoadAssetAsync<GameObject>(ResPathUtil.GetUUIPrefabPath("UICanvas"));
-            await handle.Task;
-            var canvas = handle.InstantiateSync();
-            GameObject.DontDestroyOnLoad(canvas);
-            desktop = canvas.transform.Find("Desktop").gameObject;
 
-            // 2. 按顺序加载 FairyGUI 包
+            handle.Completed += (assetHandle) =>
+            {
+                if (assetHandle.Status != EOperationStatus.Succeed)
+                {
+                    onError?.Invoke($"UICanvas加载失败: {assetHandle.LastError}");
+                    return;
+                }
+
+                // 2. 实例化Canvas并设置为常驻对象
+                var canvas = GameObject.Instantiate(assetHandle.GetAssetObject<GameObject>());
+                GameObject.DontDestroyOnLoad(canvas);
+                desktop = canvas.transform.Find("Desktop").gameObject;
+
+                // 3. 开始初始化其他系统
+                InitializeOtherSystems(
+                    () =>
+                    {
+                        Debug.Log("所有系统初始化完成");
+                        onComplete?.Invoke();
+                    },
+                    error => onError?.Invoke(error)
+                );
+            };
+        }
+
+        private void InitializeOtherSystems(Action onComplete, Action<string> onError)
+        {
+            // 先初始化ViewManager(异步加载UI包)
+            ViewManager.Init(
+                () =>
+                {
+                    _uiPackagesLoaded = true;
+                    InitializeRemainingSystems();
+                    CheckAllInitialized(onComplete);
+                },
+                error => { onError?.Invoke($"UI包加载失败: {error}"); }
+            );
+        }
+
+        private void InitializeRemainingSystems()
+        {
             try
             {
-                // 3. 初始化其他逻辑(确保资源已加载)
-                ViewManager.Init();
+                // 这些系统可以同步初始化
                 LogController.Instance.Init();
                 GameGlobal.Init();
                 QDManager.Init();
-                ViewGlobal.CreatClickEffect(); // 此时资源已就绪
+                ViewGlobal.CreatClickEffect();
                 GetGameCfg();
+
+                _otherSystemsInitialized = true;
+            }
+            catch (Exception e)
+            {
+                Debug.LogError($"系统初始化异常: {e}");
+                throw;
             }
-            catch (System.Exception e)
+        }
+
+        private void CheckAllInitialized(Action onComplete)
+        {
+            if (_uiPackagesLoaded && _otherSystemsInitialized)
             {
-                Debug.LogError($"初始化失败: {e}");
+                onComplete?.Invoke();
             }
         }
 

+ 40 - 13
GameClient/Assets/Game/HotUpdate/Views/MainUI/MainUIView.cs

@@ -1107,6 +1107,7 @@ namespace GFGGame
         private async void CardBgRes()
         {
             await RoleInfoSProxy.GetThemeID();
+
             if (_effectUI1 != null)
             {
                 EffectUIPool.Recycle(_effectUI1);
@@ -1123,22 +1124,48 @@ namespace GFGGame
             ItemCfg cardItem = CommonDataManager.Tables.TblItemCfg.GetOrDefault(MainDataManager.Instance.CardBgID);
             string resName = cardItem.Res;
             string resPath = ResPathUtil.GetCardAnimationPath(resName);
+
             var _cardData = CardDataManager.GetCardDataById(MainDataManager.Instance.CardBgID);
-            Vector2 omCardImgResTargetSize =
-                new Vector2(
-                    (ViewGlobal.GetRealTopOffset() + _ui.target.height) * CardDataManager.CardResInitWidth /
-                    CardDataManager.CardResInitHight, (ViewGlobal.GetRealTopOffset() + _ui.target.height));
-            if (_cardData != null && _cardData.itemCfg.AnimationCardStar > 0
-                                  && _cardData.star >= _cardData.itemCfg.AnimationCardStar
-                                  && YooAssets.CheckResExist(resPath))
+            Vector2 omCardImgResTargetSize = new Vector2(
+                (ViewGlobal.GetRealTopOffset() + _ui.target.height) * CardDataManager.CardResInitWidth /
+                CardDataManager.CardResInitHight,
+                (ViewGlobal.GetRealTopOffset() + _ui.target.height)
+            );
+
+            if (_cardData != null &&
+                _cardData.itemCfg.AnimationCardStar > 0 &&
+                _cardData.star >= _cardData.itemCfg.AnimationCardStar &&
+                YooAssets.CheckResExist(resPath))
             {
                 await LoadManager.Instance.CheckResExsitedOrDownload(resPath);
-                _effectUI1 = new EffectUI();
-                _effectUI1.Reset(_ui.m_cardBg.m_comCardHolder.m_holder, resName, resName, 110, EffectUIType.Card);
-                float offY = GRoot.inst.height / 1000;
-                _ui.m_cardBg.target.visible = true;
-                _ui.m_cardBgIcon.target.visible = false;
-                _ui.m_cardBg.m_comCardHolder.m_holder.y = _ui.m_cardBg.m_comCardHolder.m_holder.y + (offY * 50);
+
+                // 定义回调函数
+                Action onResetComplete = () =>
+                {
+                    _effectUI1 = new EffectUI();
+                    _effectUI1.Reset(
+                        _ui.m_cardBg.m_comCardHolder.m_holder,
+                        resName,
+                        resName,
+                        110,
+                        EffectUIType.Card
+                    );
+
+                    float offY = GRoot.inst.height / 1000;
+                    _ui.m_cardBg.target.visible = true;
+                    _ui.m_cardBgIcon.target.visible = false;
+                    _ui.m_cardBg.m_comCardHolder.m_holder.y = _ui.m_cardBg.m_comCardHolder.m_holder.y + (offY * 50);
+                };
+
+                // 调用 Reset,并传入回调
+                _effectUI1.Reset(
+                    _ui.m_cardBg.m_comCardHolder.m_holder,
+                    resName,
+                    resName,
+                    110,
+                    EffectUIType.Card,
+                    onResetComplete
+                );
             }
             else
             {

+ 1 - 1
GameClient/Assets/Game/HotUpdate/Views/UIView.cs

@@ -54,7 +54,7 @@ namespace GFGGame
             set
             {
                 _descFilePath = ResPathUtil.GetUIPackagePath(value);
-                GFGUIPackage.AddPackageAsync(_descFilePath);
+                GFGUIPackage.AddPackage(_descFilePath);
             }
         }
         /// <summary>

+ 5 - 0
GameClient/Assets/Game/HotUpdate/Views/ViewGlobal.cs

@@ -14,12 +14,17 @@ namespace GFGGame
         {
             if (comHolder == null)
             {
+                Debug.Log($"CreatClickEffect1");
                 comHolder = UI_ComHolder.Create();
+                Debug.Log($"CreatClickEffect2");
                 comHolder.target.touchable = false;
                 ViewManager.AddChildToFloatLayer(comHolder.target);
                 comHolder.target.SetPosition(-100, -100, 0);
+                Debug.Log($"CreatClickEffect3");
                 GRoot.inst.onTouchBegin.Add(SetClickPos);
+                Debug.Log($"CreatClickEffect4");
                 _effectUI1 = EffectUIPool.CreateEffectUI(comHolder.m_holder, "ui_dj", "DJ");
+                Debug.Log($"CreatClickEffect5");
             }
         }
 

+ 93 - 65
GameClient/Assets/Game/HotUpdate/Views/ViewManager.cs

@@ -40,82 +40,108 @@ namespace GFGGame
             _viewStack.Clear();
         }
 
-        public static async void Init()
+        private static int _packagesLoaded = 0;
+        private static int _totalPackagesToLoad = 0;
+        private static Action _onAllPackagesLoaded;
+        private static Action<string> _onPackageError;
+
+        public static void Init(Action onComplete, Action<string> onError = null)
         {
             //设置CustomLoader
             UIObjectFactory.SetLoaderExtension(typeof(GFGGLoader));
-            //通用资源,单独加,增加一次引用,不会被释放
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Login"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Common"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("CommonGame"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("ActivityAfternoonTea"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("ActivityAFuGift"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("ActivityDay7"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("ActivityGetYuanXiao"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("ActivityHuaRongDao"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("ActivityMain"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("ActivityThemeLuckyBox"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("ActivityWanShiLi"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Arena"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Bag"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("BlindBox"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("BornLimit"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Card"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("CardSynthetic"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("ClothingDecompose"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("ClothingFoster"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("ClothingShop"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("ClothingSynthetic"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("ClothingUpgrade"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("CreateRole"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("DailyWelfare"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("DeleteAccount"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("DressUp"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("EnduringGiftBox"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Field"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("FieldGuide"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("FieldWork"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Friend"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Guide"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("InstanceZones"));
-            // await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Launcher"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("League"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Loading"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("LuckyBox"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Mail"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Main"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("MatchingCompetition"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("MiniGame"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("NewYearLogin"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("NewYearRedEnvelope"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Notice"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("OpenServerActivity"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Poem"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("PopWindow"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("RoleInfo"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("RoleLvUp"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Share"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Store"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Studio"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Task"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("TimeTracing"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Travel"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("TurnTable"));
-            await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("XiuFang"));
-            //await GFGUIPackage.AddPackageAsync(ResPathUtil.GetUIPackagePath("Common"));
-            UIConfig.buttonSound = (NAudioClip)UIPackage.GetItemAsset("Common", "click");
 
-            //统一修改文字字体需要填写路径 ResIn/Font/FZKTJW--GB1-0
+            _onAllPackagesLoaded = onComplete;
+            _onPackageError = onError;
+            _packagesLoaded = 0;
+
+            string[] packagePaths = new string[]
+            {
+                "Login",
+                "Common",
+                "CommonGame",
+                "ActivityAfternoonTea",
+                "ActivityAFuGift",
+                "ActivityDay7",
+                "ActivityGetYuanXiao",
+                "ActivityHuaRongDao",
+                "ActivityMain",
+                "ActivityThemeLuckyBox",
+                "ActivityWanShiLi",
+                "Arena",
+                "Bag",
+                "BlindBox",
+                "BornLimit",
+                "Card",
+                "CardSynthetic",
+                "ClothingDecompose",
+                "ClothingFoster",
+                "ClothingShop",
+                "ClothingSynthetic",
+                "ClothingUpgrade",
+                "CreateRole",
+                "DailyWelfare",
+                "DeleteAccount",
+                "DressUp",
+                "EnduringGiftBox",
+                "Field",
+                "FieldGuide",
+                "FieldWork",
+                "Friend",
+                "Guide",
+                "InstanceZones",
+                "League",
+                "Loading",
+                "LuckyBox",
+                "Mail",
+                "Main",
+                "MatchingCompetition",
+                "MiniGame",
+                "NewYearLogin",
+                "NewYearRedEnvelope",
+                "Notice",
+                "OpenServerActivity",
+                "Poem",
+                "PopWindow",
+                "RoleInfo",
+                "RoleLvUp",
+                "Share",
+                "Store",
+                "Studio",
+                "Task",
+                "TimeTracing",
+                "Travel",
+                "TurnTable",
+                "XiuFang"
+            };
+
+            _totalPackagesToLoad = packagePaths.Length;
+
+            foreach (var package in packagePaths)
+            {
+                string path = ResPathUtil.GetUIPackagePath(package);
+                GFGUIPackage.AddPackage(path, () =>
+                    {
+                        _packagesLoaded++;
+                        if (_packagesLoaded == _totalPackagesToLoad)
+                        {
+                            FinalizeInit();
+                        }
+                    },
+                    (error) => { _onPackageError?.Invoke(error); });
+            }
+        }
+
+        private static void FinalizeInit()
+        {
+            UIConfig.buttonSound = (NAudioClip)UIPackage.GetItemAsset("Common", "click");
             UIConfig.defaultFont = "FZKTJW--GB1-0";
-            //默认关闭点击窗口移至顶层的功能,不可打开,如哪个界面需要在界面中单独设置
             UIConfig.bringWindowToFrontOnClick = false;
 
             _viewDic = new Dictionary<string, IUIView>();
-
             _viewStack = new List<ViewStructure>();
+
             //初始化视图层容器
             _bottomLayer = CreateLayer("BottomLayer");
-            //_bottomLayer.sortingOrder = ConstSortingOrder.Bottom;
             _topLayer = CreateLayer("TopLayer");
             _topLayer.sortingOrder = ConstViewLayerSortingOrder.TOP;
             _guideLayer = CreateLayer("GuideLayer");
@@ -130,6 +156,8 @@ namespace GFGGame
             _floatLayer = CreateLayer("FloatLayer");
             _floatLayer.sortingOrder = ConstViewLayerSortingOrder.Float;
             SetMaskAlpha(0.6f);
+
+            _onAllPackagesLoaded?.Invoke();
         }
 
         public static void AddChildToBottomLayer(GObject gObject)

+ 2 - 0
GameClient/GameClient.sln.DotSettings.user

@@ -7,6 +7,8 @@
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEditorUtility_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F8d4895b259be41298a685a0c9b42357576b400_003F3f_003Fa805acc1_003FEditorUtility_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFile_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F695d1cc93cca45069c528c15c9fdd7493e2800_003Fc3_003F83d8926e_003FFile_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIEnumerator_00601_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F3789ee403a53437cbb6b5d9ab6311f51573620_003F4e_003Faad6c3b2_003FIEnumerator_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
+	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AList_00601_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F3789ee403a53437cbb6b5d9ab6311f51573620_003Fa3_003F60d291b6_003FList_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
+	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ALogType_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F683a2b31bf9142429c44f02c75dbc6c913ce00_003F75_003Fd87ba9d0_003FLogType_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMemberInfo_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F9c2967a135e648bdb993c5397a44991b573620_003F69_003F4bdfd6bb_003FMemberInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMethodInfo_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb18a8b3398e74bca86895881dd02956c573648_003F94_003Fb7912d02_003FMethodInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMonoBehaviour_002Ecs_002Fl_003AC_0021_003FUsers_003Fadmin_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F683a2b31bf9142429c44f02c75dbc6c913ce00_003F2e_003F343a2d95_003FMonoBehaviour_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>

Некоторые файлы не были показаны из-за большого количества измененных файлов