From 97de31e9a015cf139f5293a22e1575a43dfb6733 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期五, 24 四月 2026 14:16:02 +0800
Subject: [PATCH] WEBGL ANDROID适配

---
 Main/Manager/ManagerBase.cs                                                    |    4 
 Main/System/CustomizedGift/CustomizedGiftChooseWin.cs                          |    2 
 Main/System/HeroReturn/HeroReturnRankCell.cs                                   |    9 
 Main/System/Qunying/QYAchievementCell.cs                                       |    2 
 Main/System/Qunying/QYBattleWin.cs                                             |    4 
 Main/System/Chat/ChatPlayerMineCell.cs                                         |    2 
 Main/System/Mail/MailInfoAwardCell.cs                                          |    2 
 Main/System/Arena/ArenaPlayerRankCell.cs                                       |    4 
 Main/System/Login/ServerListWin.cs                                             |    6 
 Main/System/InternalAffairs/GoldRushLeader.cs                                  |    2 
 Main/System/HeroDebut/HeroDebutCallRateHeroCell.cs                             |    4 
 Main/System/Guild/GuildBossWin.cs                                              |    2 
 Main/System/HeroReturn/HeroReturnStarUpWin.cs                                  |   11 
 Main/System/OSActivity/OSGalaChangeCell.cs                                     |    2 
 Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs                          |    2 
 Main/Component/UI/Common/CyclicScroll.cs                                       |   22 
 Main/System/Message/RichText.cs                                                |    4 
 Main/System/HeroReturn/HeroReturnCallWin.cs                                    |   21 
 Main/System/Guild/GuildApplyListCell.cs                                        |    2 
 Main/System/HeroUI/HeroScenePosCell.cs                                         |    2 
 Main/Utility/AsyncLazy.cs.meta                                                 |   11 
 Main/System/HeroReturn/HeroReturnCallChangeItem.cs                             |    3 
 Main/System/Message/WordAnalysis.cs                                            |    6 
 Main/System/KnapSack/New/CommonItemBaisc.cs                                    |   33 +
 Main/System/HeroReturn/HeroReturnPopWin.cs                                     |    5 
 Main/System/KnapSack/New/ItemCell.cs                                           |   11 
 Main/System/Mail/MailCell.cs                                                   |    1 
 Main/System/TianziBillborad/TianziBillboradWin.cs                              |    4 
 Main/System/Store/HeroSkinGiftWin.cs                                           |    4 
 Main/System/PlayerProfile/PlayerProfileWin.cs                                  |    2 
 Main/System/Sound/SoundPlayer.cs                                               |    5 
 Main/System/HeroReturn/HeroReturnStarUpChangeWin.cs                            |    7 
 Main/System/BillboardRank/PlayerRankCell.cs                                    |    4 
 Main/Component/UI/Common/DynamicCyclicScroll.cs                                |    5 
 Main/System/Tip/ItemsConfirmCell.cs                                            |    2 
 Main/System/HeroReturn/HeroReturnWin.cs                                        |   21 
 Main/System/HeroDebut/HeroDebutRankAwardCell.cs                                |    4 
 Main/System/Arena/ArenaAwardWin.cs                                             |    2 
 Main/System/OSActivity/OSRankMainLeveAwardCell.cs                              |    2 
 Main/System/TianziBillborad/TianziBillboradPlayerRankCell.cs                   |    4 
 Main/System/OSActivity/OSRankHeroCallGiftCell.cs                               |    4 
 Main/System/HeroReturn/HeroReturnCell.cs                                       |    3 
 Main/System/Battle/BaseBattleWin.cs                                            |    2 
 Main/System/ItemTip/ChooseItemsCell.cs                                         |    2 
 Main/System/Battle/Define/BattleDmgInfo.cs                                     |    2 
 Main/Core/GameEngine/Launch/CheckAssetValidTask.cs                             |   36 
 Main/System/TimingGift/TimingGiftAwardCell.cs                                  |    4 
 Main/System/FirstCharge/FirstChargeWin.cs                                      |    6 
 Main/System/UIBase/UIJumpManager.cs                                            |    2 
 Main/System/Guild/GuildMemberCell.cs                                           |    2 
 Main/System/HeroDebut/HeroDebutCallChangeItem.cs                               |    3 
 Main/System/Message/HrefAnalysis.cs                                            |    6 
 Main/System/Qunying/QYBattleVictoryWin.cs                                      |    4 
 Main/Core/ResModule/GameObjectPoolManager.cs                                   |    2 
 Main/SDK/SDKUtils.cs                                                           |    7 
 Main/Manager/StageManager.cs                                                   |   67 +
 Main/System/Guild/GuildBossHurtRankCell.cs                                     |    2 
 Main/System/HeroUI/HeroCollectionCardCell.cs                                   |   50 
 Main/System/Qunying/QYNoteCell.cs                                              |    5 
 Main/System/Battle/BattleHUDWin.cs                                             |    2 
 Main/System/HeroReturn/HeroReturnSkinWin.cs                                    |    7 
 Main/Component/UI/Effect/EllipseMask.cs                                        |  102 ++-
 Main/System/OfficialRank/OfficialTitleCell.cs                                  |   24 
 Main/System/DailySpecials/DailySpecialsBaseWin.cs                              |    2 
 Main/Core/GameEngine/Launch/LaunchInHot.cs                                     |    8 
 Main/System/OSActivity/OSGalaGiftCell.cs                                       |    4 
 Main/System/HeroDebut/HeroDebutCallRateItem.cs                                 |    6 
 Main/System/HeroFates/HeroFatesCell.cs                                         |    4 
 Main/System/Arena/ArenaAwardCell.cs                                            |    4 
 Main/System/Main/MainWin.cs                                                    |    9 
 Main/System/HeroDebut/HeroDebutCallResultCell.cs                               |    4 
 Main/System/HeroReturn/HeroReturnManager.cs                                    |   10 
 Main/System/OSActivity/OSRankAwardBaseCell.cs                                  |    4 
 Main/System/WarlordPavilion/WarlordPavilionManager.cs                          |    4 
 Main/Utility/UniTaskExtension.cs                                               |   14 
 Main/System/HappyXB/HeroCallHopeSelectCell.cs                                  |    3 
 Main/System/Guild/GuildBossOtherPlayer.cs                                      |    3 
 Main/ResModule/YooAssetService.cs                                              |   51 +
 Main/System/HeroUI/HeroCollectionLvUpWin.cs                                    |    3 
 Main/Core/GameEngine/Launch/YooAssetInitTask.cs                                |   14 
 Main/System/Arena/ArenaRecordCell.cs                                           |    2 
 Main/System/ClientVersion/VersionUtility.cs                                    |    2 
 Main/System/HeroReturn/HeroReturnCallRateItem.cs                               |    9 
 Main/System/HappyXB/HappyXBModel.cs                                            |    2 
 Main/ResModule/ResManager.cs                                                   |  416 ++++++++------
 Main/System/Battle/BattleField/StoryBattleField.cs                             |    4 
 Main/System/FirstCharge/FirstChargeDayAward.cs                                 |    4 
 Main/System/Battle/SkillEffect/SkillEffectFactory.cs                           |    2 
 Main/System/HeroReturn/HeroReturnRankTop3Cell.cs                               |    5 
 Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs                            |    6 
 Main/System/Message/ColorAnalysis.cs                                           |    4 
 Main/System/UIBase/OneLevelWin.cs                                              |    2 
 Main/System/PlayerProfile/ExchangeCodeWin.cs                                   |    9 
 Main/System/HeroReturn/HeroReturnShopCell.cs                                   |    3 
 Main/System/WarlordPavilion/WarlordPavilionWin.cs                              |    2 
 Main/Component/UI/Common/AutoSelectCyclicScroll.cs                             |    5 
 Main/System/Qunying/QYRankAwardWin.cs                                          |    4 
 Main/System/HeroUI/HeroAwakeSelectGiftWin.cs                                   |    3 
 Main/System/FunctionPreview/FunctionPreviewCell.cs                             |    4 
 Main/System/HeroReturn/HeroReturnCallChooseWin.cs                              |    5 
 Main/System/HeroUI/HeroRebornCell.cs                                           |    2 
 Main/System/Arena/ArenaBattleVictoryWin.cs                                     |    4 
 Main/System/BoneField/BoneFieldWin.cs                                          |    4 
 Main/Core/NetworkPackage/GameNetSystem.cs                                      |    3 
 Main/System/HeroReturn/HeroReturnCallResultWin.cs                              |    7 
 Main/System/Login/ServerListCenter.cs                                          |    4 
 Main/System/HeroUI/HeroCollectionWin.cs                                        |    1 
 Main/System/Guild/GuildPreviewWin.cs                                           |    2 
 Main/System/HeroDebut/HeroDebutRankCell.cs                                     |    4 
 Main/System/CustomizedGift/CustomizedRechargeModel.cs                          |    4 
 Main/System/AssetVersion/DownloadHotMgr.cs                                     |   54 +
 Main/System/Guild/GuildDonateDetailCell.cs                                     |    2 
 Main/System/WarlordPavilion/WarlordPavilionPlayerRankCell.cs                   |    4 
 Main/Core/GameEngine/Launch/AssetBundleInitTask.cs                             |    3 
 Main/System/DailySpecials/DailySpecialsItem.cs                                 |    4 
 Main/System/HeroReturn/HeroReturnGiftCell.cs                                   |    5 
 Main/System/HeroReturn/HeroReturnStarUpChangeItem.cs                           |    3 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs |    2 
 Main/System/OtherPlayerDetail/OtherNPCDetailWin.cs                             |    2 
 Main/System/HeroReturn/HeroReturnCallResultCell.cs                             |    4 
 Main/System/MainLevel/MainBossEnterWin.cs                                      |    2 
 Main/System/HeroReturn/HeroReturnRankAwardCell.cs                              |    4 
 Main/System/Mail/MailWin.cs                                                    |    2 
 Main/System/TianziBillborad/TianziBillboradAwardCell.cs                        |    4 
 Main/System/Arena/ArenaChallengeCell.cs                                        |    6 
 Main/System/HeroReturn/HeroReturnCallRateHeroCell.cs                           |    4 
 Main/System/InternalAffairs/GoldRushTentCell.cs                                |    2 
 Main/System/Arena/ArenaBattleFailWin.cs                                        |    4 
 Main/System/Settlement/SettlementAwardCell.cs                                  |    2 
 Main/Utility/OperationLogCollect.cs                                            |   11 
 Main/System/HeroDebut/HeroDebutCallResultWin.cs                                |    4 
 Main/System/HeroReturn/HeroReturnCallChooseItem.cs                             |    3 
 Main/System/Battle/BattleDebug.cs                                              |    2 
 Main/System/Message/SuitNameAnalysis.cs                                        |    6 
 Main/System/CustomizedGift/CustomizedGiftCell.cs                               |    2 
 Main/System/HeroReturn/HeroReturnCheckInWin.cs                                 |    3 
 Main/Main.cs                                                                   |   36 
 Main/System/PhantasmPavilion/AvatarCell.cs                                     |   37 +
 Main/System/HeroReturn/HeroReturnCallChangeWin.cs                              |    5 
 Main/System/OSActivity/OSRankHeroCallAwardCell.cs                              |    2 
 Main/System/Qunying/QYRankAwardCell.cs                                         |    4 
 Main/System/AssetVersion/AssetVersionUtility.cs                                |   11 
 Main/System/Qunying/QYBattleFailWin.cs                                         |    4 
 Main/System/Hero/UIHeroController.cs                                           |    9 
 Main/System/Battle/BattleManager.cs                                            |    2 
 Main/System/CustomizedGift/CustomizedGiftChooseCell.cs                         |    2 
 Main/System/DailySpecials/DailySpecialsDayGiftCell.cs                          |    4 
 Main/System/DailySpecials/DailySpecialsWin.cs                                  |    4 
 Main/System/HeroUI/HeroBestWin.cs                                              |    2 
 Main/Utility/AsyncLazy.cs                                                      |   77 ++
 Main/System/DailySpecials/DailySpecialsWeekGiftCell.cs                         |    4 
 Main/System/Chat/ChatPlayerOtherCell.cs                                        |    2 
 Main/System/TianziBillborad/TianziBillboradRankWin.cs                          |    2 
 Main/System/KnapSack/Logic/CommonGetItem.cs                                    |    2 
 Main/ResModule/AssetBundle/AssetBundleUtility.cs                               |    7 
 Main/System/Equip/BlessLVWin.cs                                                |    2 
 Main/System/Tip/ScrollTipWin.cs                                                |    2 
 Main/System/OSActivity/OSRankGiftBaseCell.cs                                   |    6 
 Main/System/Battle/ArenaBattleWin.cs                                           |    4 
 159 files changed, 1,017 insertions(+), 621 deletions(-)

diff --git a/Main/Component/UI/Common/AutoSelectCyclicScroll.cs b/Main/Component/UI/Common/AutoSelectCyclicScroll.cs
index 873e34f..63464dd 100644
--- a/Main/Component/UI/Common/AutoSelectCyclicScroll.cs
+++ b/Main/Component/UI/Common/AutoSelectCyclicScroll.cs
@@ -6,6 +6,7 @@
 using System.Collections;
 using UnityEngine.UI;
 using UnityEngine.EventSystems;
+using Cysharp.Threading.Tasks;
 
 
     public class AutoSelectCyclicScroll : CyclicScroll
@@ -31,9 +32,9 @@
         }
 
         [ContextMenu("Arrange")]
-        public override void ReArrange()
+        public override async UniTask ReArrange()
         {
-            base.ReArrange();
+            await base.ReArrange();
 
             foreach (var item in infiniteItems)
             {
diff --git a/Main/Component/UI/Common/CyclicScroll.cs b/Main/Component/UI/Common/CyclicScroll.cs
index 86c5717..bb32537 100644
--- a/Main/Component/UI/Common/CyclicScroll.cs
+++ b/Main/Component/UI/Common/CyclicScroll.cs
@@ -143,10 +143,10 @@
 
     public void LuaInit(int[] indexs, bool stepByStep)
     {
-        Init(new List<int>(indexs), stepByStep);
+        Init(new List<int>(indexs), stepByStep).Forget();
     }
 
-    public virtual void Init<T>(List<T> _datas, bool _stepByStep = false)
+    public virtual async UniTaskVoid Init<T>(List<T> _datas, bool _stepByStep = false)
     {
         if (_datas == null || _datas.Count == 0)
         {
@@ -156,7 +156,7 @@
 
         datas = _datas;
 
-        ReArrange();
+        await ReArrange();
         FillBatchData(0);
 
         if (_stepByStep)
@@ -197,7 +197,7 @@
 
         if (_stepByStep)
         {
-            Co_StepByStepAppear();
+            Co_StepByStepAppear().Forget();
             // StartCoroutine("Co_StepByStepAppear");
         }
     }
@@ -580,16 +580,16 @@
     }
 
     [ContextMenu("Arrange")]
-    public virtual void ReArrange()
+    public virtual async UniTask ReArrange()
     {
         velocity = 0f;
         autoLerp = false;
-        CreateElements();
+        await CreateElements();
         ElementsMatch();
         Arrange(align);
     }
 
-    private void CreateElements()
+    private async UniTask CreateElements()
     {
         var items = this.content.GetComponentsInChildren<ScrollItem>(true);
         if (items.Length < m_ChildCount)
@@ -597,9 +597,10 @@
             var dif = m_ChildCount - items.Length;
             if (!string.IsNullOrEmpty(m_ChildPrefabName) && !string.IsNullOrEmpty(m_ChildDisplayName))
             {
+                var tasks = new List<UniTask>(dif);
                 for (var i = 0; i < dif; i++)
                 {
-                    UIUtility.CreateWidget(m_ChildPrefabName, m_ChildDisplayName).ContinueWith(instance =>
+                    tasks.Add(UIUtility.CreateWidget(m_ChildPrefabName, m_ChildDisplayName).ContinueWith(instance =>
                     {
                         if (this == null)
                         {
@@ -614,9 +615,10 @@
                             return;
                         }
                         instance.transform.SetParentEx(this.m_Content, Vector3.zero, Quaternion.identity, Vector3.one);
-                    }).Forget();
-                    
+                        instance.SetActive(false);
+                    }));
                 }
+                await UniTask.WhenAll(tasks);
             }
         }
     }
diff --git a/Main/Component/UI/Common/DynamicCyclicScroll.cs b/Main/Component/UI/Common/DynamicCyclicScroll.cs
index 37c4288..d1d858b 100644
--- a/Main/Component/UI/Common/DynamicCyclicScroll.cs
+++ b/Main/Component/UI/Common/DynamicCyclicScroll.cs
@@ -6,13 +6,14 @@
 using System.Collections;
 using UnityEngine.UI;
 using System.Collections.Generic;
+using Cysharp.Threading.Tasks;
 
 
     public class DynamicCyclicScroll : CyclicScroll
     {
         [SerializeField] int m_MaxDynamicElements;
 
-        public override void Init<T>(List<T> _datas, bool _stepByStep = false)
+        public override async UniTaskVoid Init<T>(List<T> _datas, bool _stepByStep = false)
         {
             var maxCount = Mathf.Min(m_MaxDynamicElements, _datas.Count);
             var beyond = _datas.Count > m_MaxDynamicElements;
@@ -31,7 +32,7 @@
             }
 
             this.enabled = beyond;
-            base.Init(_datas, _stepByStep);
+            base.Init(_datas, _stepByStep).Forget();
         }
 
     }
diff --git a/Main/Component/UI/Effect/EllipseMask.cs b/Main/Component/UI/Effect/EllipseMask.cs
index de4b87d..4001b7c 100644
--- a/Main/Component/UI/Effect/EllipseMask.cs
+++ b/Main/Component/UI/Effect/EllipseMask.cs
@@ -1,30 +1,33 @@
-using UnityEngine;
+锘縰sing UnityEngine;
 using UnityEngine.UI;
 using System.Collections.Generic;
 using Cysharp.Threading.Tasks;
 
 /// <summary>
-/// 妞渾褰㈤伄缃╃粍浠�
-/// 鍩轰簬妯℃澘娴嬭瘯瀹炵幇妞渾褰㈤伄缃╂晥鏋�
+/// 濡烆厼娓捐ぐ銏や紕缂冣晝绮嶆禒?
+/// 閸╄桨绨Ο鈩冩緲濞村鐦�圭偟骞囧顓炴妇瑜般垽浼勭純鈺傛櫏閺�?
 /// </summary>
 [RequireComponent(typeof(RectTransform))]
 [AddComponentMenu("UI/Effects/Ellipse Mask")]
 [ExecuteInEditMode]
 public class EllipseMask : MonoBehaviour
 {
-    [Header("妞渾鍙傛暟")]
+
+
+    [Header("濡烆厼娓鹃崣鍌涙殶")]
     [SerializeField] private Vector2 m_EllipseCenter = new Vector2(0.5f, 0.5f);
     [SerializeField] private Vector2 m_EllipseRadius = new Vector2(0.5f, 0.5f);
-    [SerializeField] [Range(0, 0.5f)] private float m_Softness = 0f;    //鏆傛棤鏁堟灉
-    [SerializeField] private int m_StencilID = 1;   //澶氫釜閬僵鏃�
+    [SerializeField] [Range(0, 0.5f)] private float m_Softness = 0f;    //閺嗗倹妫ら弫鍫熺亯
+    [SerializeField] private int m_StencilID = 1;   //婢舵矮閲滈柆顔惧兊閺�?
     [SerializeField] private bool m_ShowMaskGraphic = false;
 
     private Material m_MaskMaterial;
     private Image m_MaskImage;
     private RectTransform m_RectTransform;
     private List<Graphic> m_MaskedChildren = new List<Graphic>();
-    // 缂撳瓨GetComponentsInChildren缁撴灉锛岄伩鍏嶆瘡娆nEnable鍒嗛厤鏁扮粍
+    // 缂傛挸鐡℅etComponentsInChildren缂佹挻鐏夐敍宀勪缉閸忓秵鐦″▎顡昻Enable閸掑棝鍘ら弫鎵矋
     private static List<Graphic> _graphicCacheList = new List<Graphic>();
+    private bool m_MaskShaderLoading = false;
 
     public Vector2 EllipseCenter
     {
@@ -98,10 +101,10 @@
         StencilID = order;
         m_RectTransform = GetComponent<RectTransform>();
         
-        // 鍒涘缓閬僵鍥惧儚
+        // 閸掓稑缂撻柆顔惧兊閸ユ儳鍎�
         CreateMaskImage();
         
-        // 鍒涘缓閬僵鏉愯川
+        // 閸掓稑缂撻柆顔惧兊閺夋劘宸�
         CreateMaskMaterial();
         
         UpdateMask();
@@ -112,7 +115,7 @@
         CreateMaskMaterial();
         UpdateMask();
         
-        // 涓烘墍鏈夊瓙瀵硅薄娣诲姞妯℃澘娴嬭瘯
+        // 娑撶儤澧嶉張澶婄摍鐎电钖勫ǎ璇插濡剝婢樺ù瀣槸
         UpdateChildrenStencil();
     }
 
@@ -123,8 +126,9 @@
             DestroyImmediate(m_MaskMaterial);
             m_MaskMaterial = null;
         }
+        m_MaskShaderLoading = false;
         
-        // 绉婚櫎瀛愬璞$殑妯℃澘娴嬭瘯
+        // 缁夊娅庣�涙劕顕挒锛勬畱濡剝婢樺ù瀣槸
         RemoveChildrenStencil();
     }
 
@@ -137,7 +141,7 @@
     }
 
     /// <summary>
-    /// 鍒涘缓閬僵鍥惧儚
+    /// 閸掓稑缂撻柆顔惧兊閸ユ儳鍎�
     /// </summary>
     private void CreateMaskImage()
     {
@@ -150,25 +154,36 @@
                 m_MaskImage.color = Color.white;
             }
         }
+        #if !UNITY_EDITOR
+        // 閸︹暞hader瀵倹顒為崝鐘烘祰鐎瑰本鍨氶崜宥堫啎娑撳搫鍙忛柅蹇旀閿涘矂妲诲銏ょ帛鐠侇槞hader濞撳弶鐓嬮崙铏规閼硅尙鐓╄ぐ?
+        if (m_MaskMaterial == null)
+        {
+            m_MaskImage.color = Color.clear;
+        }
+        #endif
     }
 
     /// <summary>
-    /// 鍒涘缓閬僵鏉愯川
+    /// 閸掓稑缂撻柆顔惧兊閺夋劘宸�
     /// </summary>
     private void CreateMaskMaterial()
     {
         #if !UNITY_EDITOR
-        if (m_MaskMaterial == null)
+        if (m_MaskMaterial == null && !m_MaskShaderLoading)
         {
+            m_MaskShaderLoading = true;
             ResManager.Instance.LoadAssetAsync<Shader>("Shader", "GUI_EllipseMask").ContinueWith(ellipseShader =>
             {
+                m_MaskShaderLoading = false;
+                if (this == null) { return; }
                 if (ellipseShader != null)
                 {
                     m_MaskMaterial = new Material(ellipseShader);
-                }
-                else
-                {
-                    Debug.LogError("EllipseMask shader not found!");
+                    // shader浣跨敤ColorMask 0锛屾仮澶峜olor涓嶄細鏄剧ず棰滆壊锛屼絾淇濊瘉Canvas鎻愪氦DrawCall鍐欏叆stencil
+                    if (m_MaskImage != null)
+                        m_MaskImage.color = Color.white;
+                    UpdateMask();
+                    UpdateChildrenStencil();
                 }
             }).Forget();
         }
@@ -181,7 +196,7 @@
     }
 
     /// <summary>
-    /// 鏇存柊閬僵
+    /// 閺囧瓨鏌婇柆顔惧兊
     /// </summary>
     private void UpdateMask()
     {
@@ -189,16 +204,16 @@
         {
             UpdateMaterialProperties();
             
-            // 璁剧疆鏉愯川鍒癐mage
+            // 鐠佸墽鐤嗛弶鎰窛閸掔檺mage
             m_MaskImage.material = m_MaskMaterial;
             
-            // 寮哄埗閲嶇粯
+            // 瀵搫鍩楅柌宥囩帛
             m_MaskImage.SetMaterialDirty();
         }
     }
 
     /// <summary>
-    /// 鏇存柊鏉愯川灞炴��
+    /// 閺囧瓨鏌婇弶鎰窛鐏炵偞鈧�?
     /// </summary>
     private void UpdateMaterialProperties()
     {
@@ -212,7 +227,7 @@
     }
 
     /// <summary>
-    /// 鏇存柊閬僵鍙鎬�
+    /// 閺囧瓨鏌婇柆顔惧兊閸欘垵顫嗛幀?
     /// </summary>
     private void UpdateMaskVisibility()
     {
@@ -223,24 +238,24 @@
     }
 
     /// <summary>
-    /// 涓哄瓙瀵硅薄娣诲姞妯℃澘娴嬭瘯
+    /// 娑撳搫鐡欑�电钖勫ǎ璇插濡剝婢樺ù瀣槸
     /// </summary>
     public void UpdateChildrenStencil()
     {
-        // 娓呴櫎涔嬪墠鐨勫垪琛�
+        // 濞撳懘娅庢稊瀣閻ㄥ嫬鍨悰?
         m_MaskedChildren.Clear();
         
-        // 浣跨敤闈欐�佺紦瀛樺垪琛ㄩ伩鍏嶆瘡娆″垎閰嶆暟缁�
+        // 娴h法鏁ら棃娆愨偓浣虹处鐎涙ê鍨悰銊╀缉閸忓秵鐦″▎鈥冲瀻闁板秵鏆熺紒?
         _graphicCacheList.Clear();
         GetComponentsInChildren(false, _graphicCacheList);
         for (int i = 0; i < _graphicCacheList.Count; i++)
         {
             var graphic = _graphicCacheList[i];
-            // 璺宠繃閬僵鏈韩
+            // 鐠哄疇绻冮柆鍍甸張闊�
             if (graphic.gameObject == this.gameObject)
                 continue;
-                
-            // 涓哄瓙瀵硅薄鍒涘缓閬僵鏉愯川
+            
+            // 娑撳搫鐡欑�电钖勯崚娑樼紦闁喚鍍甸弶鎰窛
             CreateChildMaskMaterial(graphic);
             m_MaskedChildren.Add(graphic);
         }
@@ -248,7 +263,7 @@
     }
 
     /// <summary>
-    /// 涓哄瓙瀵硅薄鍒涘缓閬僵鏉愯川
+    /// 娑撳搫鐡欑�电钖勯崚娑樼紦闁喚鍍甸弶鎰窛
     /// </summary>
     private void CreateChildMaskMaterial(Graphic graphic)
     {
@@ -256,15 +271,16 @@
         {
 
 #if !UNITY_EDITOR            
-            // Shader maskedShader = Shader.Find("GUI/EllipseMaskedContent");
             ResManager.Instance.LoadAssetAsync<Shader>("Shader", "GUI_EllipseMaskedContent").ContinueWith(maskedShader =>
             {
+                if (this == null || graphic == null) { return; }
                 if (maskedShader != null)
                 {
                     Material maskedMaterial = new Material(maskedShader);
                     maskedMaterial.SetInt("_Stencil", m_StencilID);
                     maskedMaterial.SetInt("_StencilComp", 3); // Equal
                     graphic.material = maskedMaterial;
+                    graphic.SetMaterialDirty();
                 }
             }).Forget();
 #else
@@ -280,13 +296,13 @@
         }
         else
         {
-            // 鏇存柊鐜版湁鏉愯川鐨勬ā鏉縄D
+            // 閺囧瓨鏌婇悳鐗堟箒閺夋劘宸濋惃鍕侀弶绺凞
             graphic.material.SetInt("_Stencil", m_StencilID);
         }
     }
 
     /// <summary>
-    /// 绉婚櫎瀛愬璞$殑妯℃澘娴嬭瘯
+    /// 缁夊娅庣�涙劕顕挒锛勬畱濡剝婢樺ù瀣槸
     /// </summary>
     private void RemoveChildrenStencil()
     {
@@ -294,7 +310,7 @@
         {
             if (graphic != null && graphic.material != null)
             {
-                // 閲嶇疆鏉愯川
+                // 闁插秶鐤嗛弶鎰窛
                 graphic.material = null;
             }
         }
@@ -302,11 +318,11 @@
     }
 
     /// <summary>
-    /// 璁剧疆妞渾鍙傛暟
+    /// 鐠佸墽鐤嗗顓炴妇閸欏倹鏆�
     /// </summary>
-    /// <param name="center">妞渾涓績锛堝綊涓�鍖栧潗鏍囷級</param>
-    /// <param name="radius">妞渾鍗婂緞锛堝綊涓�鍖栧潗鏍囷級</param>
-    /// <param name="softness">杈圭紭鏌斿寲绋嬪害</param>
+    /// <param name="center">濡烆厼娓炬稉顓炵妇閿涘牆缍婃稉鈧崠鏍ф綏閺嶅浄绱�</param>
+    /// <param name="radius">濡烆厼娓鹃崡濠傜窞閿涘牆缍婃稉鈧崠鏍ф綏閺嶅浄绱�</param>
+    /// <param name="softness">鏉堝湱绱弻鏂垮缁嬪瀹�</param>
     public void SetEllipseParameters(Vector2 center, Vector2 radius, float softness = 0.1f)
     {
         m_EllipseCenter = center;
@@ -316,11 +332,11 @@
     }
 
     /// <summary>
-    /// 璁剧疆鍦嗗舰鍙傛暟锛堢壒娈婃儏鍐电殑妞渾锛�
+    /// 鐠佸墽鐤嗛崷鍡楄埌閸欏倹鏆熼敍鍫㈠濞堝﹥鍎忛崘鐢垫畱濡烆厼娓鹃敍?
     /// </summary>
-    /// <param name="center">鍦嗗績锛堝綊涓�鍖栧潗鏍囷級</param>
-    /// <param name="radius">鍗婂緞锛堝綊涓�鍖栧潗鏍囷級</param>
-    /// <param name="softness">杈圭紭鏌斿寲绋嬪害</param>
+    /// <param name="center">閸﹀棗绺鹃敍鍫濈秺娑撯偓閸栨牕娼楅弽鍥风礆</param>
+    /// <param name="radius">閸楀﹤绶為敍鍫濈秺娑撯偓閸栨牕娼楅弽鍥风礆</param>
+    /// <param name="softness">鏉堝湱绱弻鏂垮缁嬪瀹�</param>
     public void SetCircleParameters(Vector2 center, float radius, float softness = 0.1f)
     {
         SetEllipseParameters(center, new Vector2(radius, radius), softness);
@@ -336,4 +352,4 @@
         }
     }
 #endif
-}
\ No newline at end of file
+}
diff --git a/Main/Core/GameEngine/Launch/AssetBundleInitTask.cs b/Main/Core/GameEngine/Launch/AssetBundleInitTask.cs
index 65965b8..2d000cc 100644
--- a/Main/Core/GameEngine/Launch/AssetBundleInitTask.cs
+++ b/Main/Core/GameEngine/Launch/AssetBundleInitTask.cs
@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.IO;
+using Cysharp.Threading.Tasks;
 using UnityEngine;
 
 /// <summary>
@@ -23,7 +24,7 @@
         duration = Mathf.Max(0.5f, expectTime);
         if (AssetSource.isUseAssetBundle)
         {
-            AssetBundleUtility.Instance.Initialize();
+            AssetBundleUtility.Instance.Initialize().Forget();
             done = false;
             progress = 0f;
         }
diff --git a/Main/Core/GameEngine/Launch/CheckAssetValidTask.cs b/Main/Core/GameEngine/Launch/CheckAssetValidTask.cs
index 0ad6355..edc0453 100644
--- a/Main/Core/GameEngine/Launch/CheckAssetValidTask.cs
+++ b/Main/Core/GameEngine/Launch/CheckAssetValidTask.cs
@@ -27,31 +27,37 @@
         {
             if (VersionUtility.Instance.NeedDownAsset())
             {
-                var remoteURL = StringUtility.Concat(VersionUtility.Instance.versionInfo.GetResourcesURL(config.branch), Language.fixPath, "/config/PriorBundle.txt");
-                var localURL = StringUtility.Concat(ResourcesPath.Instance.ExternalStorePath, "config/PriorBundle.txt");
-                var downloadTask = new DownloadHotTask(remoteURL, localURL);
-                downloadTask.BeginDownload(AssetVersionUtility.OnDownLoadPriorBundle);
-
-
-                remoteURL = StringUtility.Concat(VersionUtility.Instance.versionInfo.GetResourcesURL(config.branch), Language.fixPath, $"/config/{config.appId}OPConfig.txt");
-                localURL = StringUtility.Concat(ResourcesPath.Instance.ExternalStorePath, "config/OPConfig.txt");
-                var downloadTask2 = new DownloadHotTask(remoteURL, localURL);
-                downloadTask2.BeginDownload(AssetVersionUtility.OnDownLoadOPConfig);
-                //AssetVersionUtility.GetAssetVersionFile();
                 done = false;
                 progress = 0f;
+                // 閫氳繃 YooAsset锛圕onfigManager锛夊姞杞介厤缃紝涓嶅啀璧版棫鐨� HTTP 涓嬭浇
+                LoadConfigsViaYooAsset().Forget();
             }
             else
             {
-                //if (Application.isEditor)
-                //    PatchLoader.InitLocalPatchAsset();
                 done = true;
             }
-
-
         }).Forget();
+    }
 
+    private async UniTaskVoid LoadConfigsViaYooAsset()
+    {
+        try
+        {
+            // 骞惰鍔犺浇 PriorBundle 鍜� OPConfig锛堥�氳繃 YooAsset / ConfigManager锛�
+            var t1 = PriorBundleConfig.LazyInitAsync();
+            var t2 = OPConfigConfig.LazyInitAsync();
+            await UniTask.WhenAll(t1, t2);
+            Debug.Log("[CheckAssetValidTask] PriorBundle 鍜� OPConfig 閫氳繃 YooAsset 鍔犺浇瀹屾垚");
 
+            // YooAsset 宸插湪 Launch 闃舵瀹屾垚璧勬簮鐗堟湰妫�鏌ュ拰涓嬭浇
+            // 涓嶅啀闇�瑕佹棫鐨� AssetsVersion.txt 涓嬭浇 + 鏂囦欢鏍¢獙娴佺▼
+            AssetVersionUtility.ForceCompleteCheck();
+        }
+        catch (Exception ex)
+        {
+            Debug.LogError($"[CheckAssetValidTask] YooAsset 鍔犺浇閰嶇疆澶辫触: {ex}");
+            AssetVersionUtility.ForceCompleteCheck();
+        }
     }
 
     public override void End()
diff --git a/Main/Core/GameEngine/Launch/LaunchInHot.cs b/Main/Core/GameEngine/Launch/LaunchInHot.cs
index bb29ec1..17d3c03 100644
--- a/Main/Core/GameEngine/Launch/LaunchInHot.cs
+++ b/Main/Core/GameEngine/Launch/LaunchInHot.cs
@@ -11,6 +11,14 @@
     public static LaunchStage m_CurrentStage = LaunchStage.None;
     public static LaunchProgressInfo progressInfo { get; private set; }
 
+    /// <summary>
+    /// 澶栭儴璁剧疆杩涘害淇℃伅锛堢敤浜� Launch 娴佹按绾跨粨鏉熷悗缁х画鏄剧ず config 鍔犺浇杩涘害锛�
+    /// </summary>
+    public static void SetProgressInfo(LaunchProgressInfo info)
+    {
+        progressInfo = info;
+    }
+
     float timer = 0f;
     Queue<LaunchTask> tasks = new Queue<LaunchTask>();
     LaunchTask currentTask = null;
diff --git a/Main/Core/GameEngine/Launch/YooAssetInitTask.cs b/Main/Core/GameEngine/Launch/YooAssetInitTask.cs
index 8667c27..2abe10c 100644
--- a/Main/Core/GameEngine/Launch/YooAssetInitTask.cs
+++ b/Main/Core/GameEngine/Launch/YooAssetInitTask.cs
@@ -55,8 +55,18 @@
                 // Editor 闈� WebGL target + AB 妯″紡锛氫粠鏈湴 StreamingAssets 鍔犺浇宸叉瀯寤虹殑 AB
                 playMode = EPlayMode.OfflinePlayMode;
 #else
-                // 鍏朵粬骞冲彴 AB 妯″紡
-                playMode = EPlayMode.OfflinePlayMode;
+                // 闈� WebGL 姝e紡鍖咃細涓� Launch 闃舵淇濇寔涓�鑷�
+                // 鏈� cdnUrl 鈫� HostPlayMode锛堥殢鍖� + 杩滅▼涓嬭浇锛夛紝鏃� 鈫� OfflinePlayMode
+                string cdnUrl = VersionConfigEx.config?.cdnUrl;
+                if (!string.IsNullOrEmpty(cdnUrl))
+                {
+                    playMode = EPlayMode.HostPlayMode;
+                    remoteServices = new UrlRemoteServices(cdnUrl);
+                }
+                else
+                {
+                    playMode = EPlayMode.OfflinePlayMode;
+                }
 #endif
             }
 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs
index 665129e..6bf08c2 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs
@@ -72,7 +72,7 @@
         if (!isAfterPlayerDataInitialize)
         {
             //鍙湁鍥炵櫥褰曠晫闈㈠悗鐨勬柇绾块噸杩� 鍜屽垵娆$櫥褰曟墠鍔犺浇娓告垙鍦烘櫙
-            StageManager.Instance.ToGameScene();
+            StageManager.Instance.ToGameScene().Forget();
             DayRemind.Instance.SetDayRemind(DayRemind.DJQTip, false);
         }
         isAfterPlayerDataInitialize = true;
diff --git a/Main/Core/NetworkPackage/GameNetSystem.cs b/Main/Core/NetworkPackage/GameNetSystem.cs
index 64b8d2a..e43d534 100644
--- a/Main/Core/NetworkPackage/GameNetSystem.cs
+++ b/Main/Core/NetworkPackage/GameNetSystem.cs
@@ -2,6 +2,7 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
+using Cysharp.Threading.Tasks;
 
 
 public class GameNetSystem : Singleton<GameNetSystem>
@@ -299,7 +300,7 @@
 
             LoginManager.Instance.busy = false;
 
-            StageManager.Instance.ReturnToLoginScene();
+            StageManager.Instance.ReturnToLoginScene().Forget();
             NetLinkWin.Hide();
         }
     }
diff --git a/Main/Core/ResModule/GameObjectPoolManager.cs b/Main/Core/ResModule/GameObjectPoolManager.cs
index 46d3f34..b4e8459 100644
--- a/Main/Core/ResModule/GameObjectPoolManager.cs
+++ b/Main/Core/ResModule/GameObjectPoolManager.cs
@@ -187,7 +187,7 @@
         }
 
         // 鍚姩瀹氭湡妫�鏌ユ睜鐨勫崗绋�
-        CheckPoolUsage();
+        CheckPoolUsage().Forget();
     }
 
     private async UniTask CheckPoolUsage()
diff --git a/Main/Main.cs b/Main/Main.cs
index ef27b78..481b314 100644
--- a/Main/Main.cs
+++ b/Main/Main.cs
@@ -29,26 +29,42 @@
     public static void Init()
     {
         Debug.Log("Main.Init() 琚皟鐢�");
-        var launchWin = UIManager.Instance.GetUI<LaunchWin>();
-        if (launchWin != null)
-        {
-            launchWin.FadeOut();
-        }
+        // 涓嶅叧闂� LaunchWin锛屼繚鐣欏埌 config 鍔犺浇瀹屾垚鍚庡啀鍏抽棴
         SwitchToLoginScene().Forget();
     }
 
     private static async UniTask SwitchToLoginScene()
     {
-        // Debug.Log("鎵撳紑鐧诲綍鐣岄潰");
-        // UIManager.Instance.OpenWindowAsync<LoginWin>().Forget();
-        Debug.Log("鍒囨崲鍒扮櫥褰曞満鏅�");
-        await ConfigManager.Instance.Init();
+        Debug.Log("鍒囨崲鍒扮櫥褰曞満鏅� - 寮�濮嬪姞杞藉叏閲忛厤缃�");
+
+        // 鍦� LaunchWin 涓婃樉绀� config 鍔犺浇杩涘害
+        LaunchInHot.m_CurrentStage = LaunchStage.ConfigInit;
+        LaunchInHot.SetProgressInfo(new LaunchProgressInfo(LaunchStage.ConfigInit, 1, 0f, 0f));
+
+        // 鍚姩鍏ㄩ噺閰嶇疆鍔犺浇
+        var configInitTask = ConfigManager.Instance.Init();
+
+        // 鎸佺画鏇存柊杩涘害锛岀洿鍒板姞杞藉畬鎴�
+        while (!ConfigManager.Instance.isLoadFinished)
+        {
+            float p = ConfigManager.Instance.GetLoadingProgress();
+            LaunchInHot.SetProgressInfo(new LaunchProgressInfo(LaunchStage.ConfigInit, 1, p, p));
+            await UniTask.Yield();
+        }
+        await configInitTask;
+
+        // 閰嶇疆鍔犺浇瀹屾垚锛屽叧闂� LaunchWin
+        var launchWin = UIManager.Instance.GetUI<LaunchWin>();
+        if (launchWin != null)
+        {
+            launchWin.FadeOut();
+        }
+
         GeneralDefine.Init();
 #if UNITY_EDITOR
         SysNotifyMgr.Instance.BeforePlayerDataInitializeEvent();
 #endif
         StageManager.Instance.ToLoginScene().Forget();
-
     }
 
     public static async UniTask InitManagers()
diff --git a/Main/Manager/ManagerBase.cs b/Main/Manager/ManagerBase.cs
index 45c985c..4e52f98 100644
--- a/Main/Manager/ManagerBase.cs
+++ b/Main/Manager/ManagerBase.cs
@@ -3,9 +3,9 @@
 
 public class ManagerBase<T> : Singleton<T>, IManager where T : ManagerBase<T>, new()
 {
-    public virtual async UniTask Init()
+    public virtual UniTask Init()
     {
-
+        return UniTask.CompletedTask;
     }
 
     public virtual void Release()
diff --git a/Main/Manager/StageManager.cs b/Main/Manager/StageManager.cs
index 43ecc22..da801c2 100644
--- a/Main/Manager/StageManager.cs
+++ b/Main/Manager/StageManager.cs
@@ -4,6 +4,7 @@
 using UnityEngine;
 using UnityEngine.SceneManagement;
 using ProjSG.Resource;
+using YooAsset;
 
 public enum StageName
 {
@@ -22,9 +23,10 @@
     // public Action OnSwitchAccount;
     private LaunchWinData launchWinData = null;
 
-    public async UniTask Init()
+    public UniTask Init()
     {
         UIManager.Instance.OnCloseWindow += OnCloseWindow;
+        return UniTask.CompletedTask;
     }
 
     public void Release()
@@ -42,18 +44,29 @@
         LoadingWin loadingWin = await UIManager.Instance.OpenWindowAsync<LoadingWin>();
         InitLoadingWinData(loadingWin);
 
-        // Phase 1 (0% ~ 60%): Scene loading
-        AsyncOperation asyncOperation = SceneManager.LoadSceneAsync("Login");
-        asyncOperation.allowSceneActivation = false;
-
-        while (!asyncOperation.isDone)
+        // Phase 1 (0% ~ 50%): Scene loading
+        if (AssetSource.isUseAssetBundle)
         {
-            if (asyncOperation.progress >= 0.9f)
+            var handle = YooAssetService.Instance.BeginLoadScene("Assets/ResourcesOut/Scenes/Login.unity", LoadSceneMode.Single, LocalPhysicsMode.None, true);
+            while (!handle.IsDone)
             {
-                asyncOperation.allowSceneActivation = true;
+                if (handle.Progress >= 0.9f)
+                    handle.UnSuspend();
+                loadingWin.SetProgress(handle.Progress * 0.5f);
+                await UniTask.Yield();
             }
-            loadingWin.SetProgress(asyncOperation.progress * 0.5f);
-            await UniTask.Yield();
+        }
+        else
+        {
+            var asyncOp = SceneManager.LoadSceneAsync("Login");
+            asyncOp.allowSceneActivation = false;
+            while (!asyncOp.isDone)
+            {
+                if (asyncOp.progress >= 0.9f)
+                    asyncOp.allowSceneActivation = true;
+                loadingWin.SetProgress(asyncOp.progress * 0.5f);
+                await UniTask.Yield();
+            }
         }
 
         // Phase 2 (50% ~ 100%): Manager initialization
@@ -89,7 +102,10 @@
     {
         UIManager.Instance.DestroyAllUI();
 
-        await SceneManager.LoadSceneAsync("Login");
+        if (AssetSource.isUseAssetBundle)
+            await YooAssetService.Instance.LoadSceneAsync("Assets/ResourcesOut/Scenes/Login.unity");
+        else
+            await SceneManager.LoadSceneAsync("Login");
 
         Main.OnSwitchToLoginScene();
         currentStage = StageName.Login;
@@ -149,18 +165,29 @@
 
         SoundPlayer.Instance.StopBackGroundMusic();
 
-        // Phase 1 (0% ~ 60%): Scene loading
-        AsyncOperation asyncOperation = SceneManager.LoadSceneAsync("Game");
-        asyncOperation.allowSceneActivation = false;
-
-        while (!asyncOperation.isDone)
+        // Phase 1 (0% ~ 50%): Scene loading
+        if (AssetSource.isUseAssetBundle)
         {
-            if (asyncOperation.progress >= 0.9f)
+            var handle = YooAssetService.Instance.BeginLoadScene("Assets/ResourcesOut/Scenes/Game.unity", LoadSceneMode.Single, LocalPhysicsMode.None, true);
+            while (!handle.IsDone)
             {
-                asyncOperation.allowSceneActivation = true;
+                if (handle.Progress >= 0.9f)
+                    handle.UnSuspend();
+                loadingWin.SetProgress(handle.Progress * 0.5f);
+                await UniTask.Yield();
             }
-            loadingWin.SetProgress(asyncOperation.progress * 0.5f);
-            await UniTask.Yield();
+        }
+        else
+        {
+            var asyncOp = SceneManager.LoadSceneAsync("Game");
+            asyncOp.allowSceneActivation = false;
+            while (!asyncOp.isDone)
+            {
+                if (asyncOp.progress >= 0.9f)
+                    asyncOp.allowSceneActivation = true;
+                loadingWin.SetProgress(asyncOp.progress * 0.5f);
+                await UniTask.Yield();
+            }
         }
 
         // Phase 2 (50% ~ 100%): Manager data ready
diff --git a/Main/ResModule/AssetBundle/AssetBundleUtility.cs b/Main/ResModule/AssetBundle/AssetBundleUtility.cs
index 6f8890b..f5ae8c6 100644
--- a/Main/ResModule/AssetBundle/AssetBundleUtility.cs
+++ b/Main/ResModule/AssetBundle/AssetBundleUtility.cs
@@ -119,7 +119,7 @@
         initialized = true;
     }
 
-    private async UniTask Co_LoadMainfestFile(string _category)
+    private UniTask Co_LoadMainfestFile(string _category)
     {
         var path = AssetVersionUtility.GetAssetFilePath(StringUtility.Concat(AssetVersionUtility.EncodeFileName(_category), "_assetbundle"), false);
         var _assetBundle = AssetBundle.LoadFromFile(path);
@@ -127,14 +127,14 @@
         if (_assetBundle == null)
         {
             Debug.LogErrorFormat("AssetBundleManifest鐨勫寘鏂囦欢涓虹┖鎴栬�呭姞杞藉嚭閿�.  Path:{0}", path);
-            return;
+            return UniTask.CompletedTask;
         }
 
         AssetBundleManifest _assetBundleManifest = _assetBundle.LoadAsset<AssetBundleManifest>(ResourcesPath.AssetDependentFileAssetName);
         if (_assetBundleManifest == null)
         {
             Debug.LogErrorFormat("AssetBundleManifest鐨勫寘鏂囦欢涓虹┖鎴栬�呭姞杞藉嚭閿�.  Path:{0}", path);
-            return;
+            return UniTask.CompletedTask;
         }
 
         string[] _assetBundleNames = _assetBundleManifest.GetAllAssetBundles();
@@ -148,6 +148,7 @@
 
         _assetBundle.Unload(true);
         _assetBundle = null;
+        return UniTask.CompletedTask;
     }
 
     public AssetBundleInfo GetAssetBundleInfo(string assetBundleName)
diff --git a/Main/ResModule/ResManager.cs b/Main/ResModule/ResManager.cs
index 47471ba..88f84ee 100644
--- a/Main/ResModule/ResManager.cs
+++ b/Main/ResModule/ResManager.cs
@@ -1,4 +1,4 @@
-锘縰sing UnityEngine;
+using UnityEngine;
 using System.Collections.Generic;
 using System;
 using UnityEngine.U2D;
@@ -10,10 +10,6 @@
 using System.Threading;
 using ProjSG.Resource;
 using YooAsset;
-
-
-
-
 
 
 #if UNITY_EDITOR
@@ -131,142 +127,130 @@
     }
 #endif
 
-    //  // needExt 鏄惁闇�瑕佸嚱鏁板唴閮ㄦ坊鍔犲悗缂�
-    // [System.Obsolete("US2: Use LoadAssetAsync<T>(directory, name, needExt) returning UniTask<T> instead.")]
-    // public T LoadAsset<T>(string directory, string name, bool needExt = true) where T : UnityEngine.Object
-    // {
-    //     directory = directory.Replace("\\", "/");
-    //     name = name.Replace("\\", "/");
-    //     //  鐗规畩澶勭悊 鍥犱负鏈変竴灞傚浘闆嗙殑鍏崇郴 directory瑕佷紶鍏ョ殑搴旇鏄痑tlas鐨勫悕瀛�
-    //     if (typeof(T) == typeof(Sprite))
-    //     {
-    //         return LoadSprite(directory, name) as T;
-    //     }
-    //     else if (typeof(T) == typeof(SkeletonDataAsset))
-    //     {
-    //         //鏂囦欢鐩綍璋冩暣锛宯ame涓寘鍚簡璺緞
-    //         if (name.Contains("/"))
-    //         {
-    //             directory += name.Substring(0, name.LastIndexOf("/"));
-    //             name = name.Substring(name.LastIndexOf("/") + 1);
-    //         }
+    // ====================================================================
+    // 鍚屾鏂规硶锛堜粎闈� WebGL 骞冲彴锛�
+    // ====================================================================
+#if !UNITY_WEBGL
+    //needExt 鏄惁闇�瑕佸嚱鏁板唴閮ㄦ坊鍔犲悗缂�
+    public T LoadAsset<T>(string directory, string name, bool needExt = true) where T : UnityEngine.Object
+    {
+        directory = directory.Replace("\\", "/");
+        name = name.Replace("\\", "/");
+        //  鐗规畩澶勭悊 鍥犱负鏈変竴灞傚浘闆嗙殑鍏崇郴 directory瑕佷紶鍏ョ殑搴旇鏄痑tlas鐨勫悕瀛�
+        if (typeof(T) == typeof(Sprite))
+        {
+            return LoadSprite(directory, name) as T;
+        }
+        else if (typeof(T) == typeof(SkeletonDataAsset))
+        {
+            //鏂囦欢鐩綍璋冩暣锛宯ame涓寘鍚簡璺緞
+            if (name.Contains("/"))
+            {
+                directory += name.Substring(0, name.LastIndexOf("/"));
+                name = name.Substring(name.LastIndexOf("/") + 1);
+            }
+        }
 
-    //     }
+        return LoadAssetInternal<T>(directory, name, needExt);
+    }
 
-    //     return LoadAssetInternal<T>(directory, name, needExt);
-    // }
+    //needExt 鏄惁闇�瑕佸嚱鏁板唴閮ㄦ坊鍔犲悗缂�
+    private T LoadAssetInternal<T>(string directory, string name, bool needExt = true) where T : UnityEngine.Object
+    {
+        T asset = null;
+        var path = ($"Assets/ResourcesOut/{directory}/{name}" + (needExt ? GetExtension(typeof(T)) : "")).Replace("//", "/").Trim().Replace("\\", "/");
 
-    // //needExt 鏄惁闇�瑕佸嚱鏁板唴閮ㄦ坊鍔犲悗缂�
-    // private T LoadAssetInternal<T>(string directory, string name, bool needExt = true) where T : UnityEngine.Object
-    // {
-    //     // 宸茬鐢ㄥ悓姝ュ姞杞斤紝寮哄埗涓氬姟鍏ㄩ儴璧板紓姝PI銆�
-    //     throw new NotSupportedException("鍚屾璧勬簮鍔犺浇宸茬鐢紝璇蜂娇鐢ㄥ紓姝ユ帴鍙�");
-    // }
+        if (!AssetSource.isUseAssetBundle)
+        {
+#if UNITY_EDITOR
+            asset = UnityEditor.AssetDatabase.LoadAssetAtPath<T>(path);
+#endif
+        }
+        else
+        {
+            asset = YooAssetService.Instance.LoadAssetSync<T>(path);
+        }
 
-//     [System.Obsolete("US2: Use LoadConfigAsync returning UniTask<string[]> instead.")]
-//     public string[] LoadConfig(string name)
-//     {
-//         string path = string.Empty;
-// #if UNITY_EDITOR
-//         if (!AssetSource.isUseAssetBundle)
-//         {
-//             path = ResourcesPath.CONFIG_FODLER + "/" + name + ".txt";
-//         }
-//         else
-// #endif
-//         {
-//             path = AssetVersionUtility.GetAssetFilePath($"config/{name}.txt");
-//         }
+        if (asset == null)
+        {
+            Debug.LogErrorFormat("LoadAsset() => 鍔犺浇涓嶅埌璧勬簮: {0}", path);
+        }
 
-//         return File.ReadAllLines(path);
-//     }
+        return asset;
+    }
 
+    public string[] LoadConfig(string name)
+    {
+#if UNITY_EDITOR
+        if (!AssetSource.isUseAssetBundle)
+        {
+            string path = ResourcesPath.CONFIG_FODLER + "/" + name + ".txt";
+            return File.ReadAllLines(path);
+        }
+#endif
+        // AB 妯″紡锛氶�氳繃 YooAsset 鍚屾鍔犺浇 TextAsset
+        var location = $"Assets/ResourcesOut/Config/{name}.txt";
+        var textAsset = YooAssetService.Instance.LoadAssetSync<TextAsset>(location);
+        if (textAsset != null && !string.IsNullOrEmpty(textAsset.text))
+            return textAsset.text.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None);
+        Debug.LogError($"[ResManager] LoadConfig failed for '{name}'");
+        return Array.Empty<string>();
+    }
+
+    private Sprite LoadSprite(string atlasName, string spriteName)
+    {
+        if (!AssetSource.isUseAssetBundle)
+        {
+            SpriteAtlas atlas = LoadAsset<SpriteAtlas>("Sprite", atlasName.Replace("Sprite/", ""));
+            if (null == atlas)
+            {
+                return null;
+            }
+            return atlas.GetSprite(spriteName);
+        }
+        else
+        {
+            // YooAsset 浣跨敤瀹屾暣璺緞鐩存帴鍔犺浇 Sprite
+            var path = $"Assets/ResourcesOut/{atlasName}/{spriteName}.png".Replace("//", "/");
+            return YooAssetService.Instance.LoadAssetSync<Sprite>(path);
+        }
+    }
+#endif
+
+    // ====================================================================
+    // 寮傛鍔犺浇鏂规硶锛堟墍鏈夊钩鍙扮粺涓�锛�
+    // ====================================================================
+
+    //needExt 鏄惁闇�瑕佸嚱鏁板唴閮ㄦ坊鍔犲悗缂�锛堝洖璋冪増鏈級
+    public void LoadAssetAsync<T>(string directory, string name, Action<bool, UnityEngine.Object> callBack, bool needExt = true) where T : UnityEngine.Object
+    {
+        directory = directory.Replace("\\", "/");
+        name = name.Replace("\\", "/");
+
+        //  鐗规畩澶勭悊 鍥犱负鏈変竴灞傚浘闆嗙殑鍏崇郴 directory瑕佷紶鍏ョ殑搴旇鏄痑tlas鐨勫悕瀛�
+        if (typeof(T) == typeof(Sprite))
+        {
+            LoadSpriteAsync<T>(directory, name, callBack);
+            return;
+        }
+        else if (typeof(T) == typeof(SkeletonDataAsset))
+        {
+            //鏂囦欢鐩綍璋冩暣锛宯ame涓寘鍚簡璺緞
+            if (name.Contains("/"))
+            {
+                directory += name.Substring(0, name.LastIndexOf("/"));
+                name = name.Substring(name.LastIndexOf("/") + 1);
+            }
+        }
+
+        LoadAssetAsyncInternal<T>(directory, name, callBack, needExt);
+    }
 
     public async UniTask<T> LoadAssetAsync<T>(string directory, string name) where T : UnityEngine.Object
     {
         return await LoadAssetAsync<T>(directory, name, needExt: true);
     }
 
-    public async UniTask<T> LoadAssetAsync<T>(string directory, string name, bool needExt = true) where T : UnityEngine.Object
-    {
-        return await LoadAssetAsync<T>(directory, name, needExt, CancellationToken.None);
-    }
-
-    private void LoadSpriteAsync<T>(string atlasName, string spriteName, Action<bool, UnityEngine.Object> callBack) where T : UnityEngine.Object
-    {
-        if (!AssetSource.isUseAssetBundle)
-        {
-            // Editor 妯″紡涓嬪彲鐩存帴鍔犺浇 sprite
-            LoadAssetAsyncInternal<T>(atlasName, spriteName, callBack);
-        }
-        else
-        {
-            // AB 妯″紡涓嬬洿鎺ュ姞杞藉崟鐙殑 Sprite 鏂囦欢锛圷ooAsset 鑷姩澶勭悊 SpriteAtlas 渚濊禆锛�
-            LoadAssetAsyncInternal<Sprite>(atlasName, spriteName, (isLoaded, sprite) =>
-            {
-                callBack?.Invoke(isLoaded, sprite);
-            });
-        }
-    }
-
-    private void LoadAssetAsyncInternal<T>(string directory, string name, Action<bool, UnityEngine.Object> callBack, bool needExt = true) where T : UnityEngine.Object
-    {
-        var path = string.Concat($"Assets/ResourcesOut/{directory}/{name}", (needExt ? GetExtension(typeof(T)) : "")).Replace("//", "/");
-
-        if (!AssetSource.isUseAssetBundle)
-        {
-#if UNITY_EDITOR
-            var asset = UnityEditor.AssetDatabase.LoadAssetAtPath<T>(path);
-            callBack?.Invoke(asset != null, asset);
-#endif
-        }
-        else
-        {
-            // US1: Route through YooAssetService async
-            CoLoadViaYooAsset<T>(path, callBack).Forget();
-        }
-    }
-
-    private async UniTaskVoid CoLoadViaYooAsset<T>(string path, Action<bool, UnityEngine.Object> callBack, CancellationToken ct = default) where T : UnityEngine.Object
-    {
-        try
-        {
-            var asset = await YooAssetService.Instance.LoadAssetAsync<T>(path, ct: ct);
-            callBack?.Invoke(asset != null, asset);
-        }
-        catch (Exception ex)
-        {
-            Debug.LogError($"[ResManager] Async load via YooAsset failed: {ex.Message}");
-            callBack?.Invoke(false, null);
-        }
-    }
-
-    public void UnloadAsset(string directory, string assetName)
-    {
-        directory = directory.Replace("\\", "/").TrimEnd('/');
-        assetName = assetName.Replace("\\", "/");
-        string path = ($"Assets/ResourcesOut/{directory}/{assetName}").Replace("//", "/");
-        YooAssetService.Instance.UnloadAsset(path);
-    }
-
-    public string GetAssetFilePath(string _assetKey)
-    {
-        var path = Path.Combine(ExternalStorePath, _assetKey);
-        if (!File.Exists(path))
-        {
-            path = Path.Combine(StreamingAssetPath, _assetKey);
-        }
-
-        return path;
-    }
-
-    // ====================================================================
-    // US1: New UniTask-based async variants
-    // ====================================================================
-
-    /// <summary>
-    /// 寮傛鍔犺浇璧勬簮锛圲niTask 鐗堟湰锛孶S1 鏂板锛夈��
-    /// </summary>
     public async UniTask<T> LoadAssetAsync<T>(string directory, string name, bool needExt = true, CancellationToken ct = default) where T : UnityEngine.Object
     {
         directory = directory.Replace("\\", "/");
@@ -307,8 +291,126 @@
         return await YooAssetService.Instance.LoadAssetAsync<T>(path, ct: ct);
     }
 
+    // ====================================================================
+    // 寮傛鍐呴儴瀹炵幇锛堢粺涓�锛�
+    // ====================================================================
+
+    private void LoadSpriteAsync<T>(string atlasName, string spriteName, Action<bool, UnityEngine.Object> callBack) where T : UnityEngine.Object
+    {
+        if (!AssetSource.isUseAssetBundle)
+        {
+            // Editor 妯″紡涓嬪彲鐩存帴鍔犺浇 sprite
+            LoadAssetAsyncInternal<T>(atlasName, spriteName, callBack);
+        }
+        else
+        {
+            // AB 妯″紡涓嬬洿鎺ュ姞杞藉崟鐙殑 Sprite 鏂囦欢锛圷ooAsset 鑷姩澶勭悊 SpriteAtlas 渚濊禆锛�
+            LoadAssetAsyncInternal<Sprite>(atlasName, spriteName, (isLoaded, sprite) =>
+            {
+                callBack?.Invoke(isLoaded, sprite);
+            });
+        }
+    }
+
+    private void LoadAssetAsyncInternal<T>(string directory, string name, Action<bool, UnityEngine.Object> callBack, bool needExt = true) where T : UnityEngine.Object
+    {
+        var path = string.Concat($"Assets/ResourcesOut/{directory}/{name}", (needExt ? GetExtension(typeof(T)) : "")).Replace("//", "/");
+
+        if (!AssetSource.isUseAssetBundle)
+        {
+#if UNITY_EDITOR
+            var asset = UnityEditor.AssetDatabase.LoadAssetAtPath<T>(path);
+            callBack?.Invoke(asset != null, asset);
+#endif
+        }
+        else
+        {
+            CoLoadViaYooAsset<T>(path, callBack).Forget();
+        }
+    }
+
+    private async UniTaskVoid CoLoadViaYooAsset<T>(string path, Action<bool, UnityEngine.Object> callBack, CancellationToken ct = default) where T : UnityEngine.Object
+    {
+        try
+        {
+            var asset = await YooAssetService.Instance.LoadAssetAsync<T>(path, ct: ct);
+            callBack?.Invoke(asset != null, asset);
+        }
+        catch (Exception ex)
+        {
+            Debug.LogError($"[ResManager] Async load via YooAsset failed: {ex.Message}");
+            callBack?.Invoke(false, null);
+        }
+    }
+
+    public void UnloadAsset(string directory, string assetName)
+    {
+        if (!AssetSource.isUseAssetBundle)
+            return;
+
+        directory = directory.Replace("\\", "/").TrimEnd('/');
+        assetName = assetName.Replace("\\", "/");
+        string path = ($"Assets/ResourcesOut/{directory}/{assetName}").Replace("//", "/");
+        YooAssetService.Instance.UnloadAsset(path);
+    }
+
+    public string GetAssetFilePath(string _assetKey)
+    {
+        var path = Path.Combine(ExternalStorePath, _assetKey);
+        if (!File.Exists(path))
+        {
+            path = Path.Combine(StreamingAssetPath, _assetKey);
+        }
+
+        return path;
+    }
+
+    // ====================================================================
+    // LoadConfigAsync锛堟墍鏈夊钩鍙扮粺涓�锛�
+    // ====================================================================
+
     /// <summary>
-    /// US4: 寮傛鍔犺浇璧勬簮骞惰蛋缂撳瓨灞傦紙缂撳瓨鍛戒腑鐩存帴杩斿洖锛屾湭鍛戒腑鍒欏姞杞藉苟缂撳瓨锛夈��
+    /// 寮傛鍔犺浇閰嶇疆鏂囦欢銆�
+    /// AB 妯″紡浣跨敤 YooAsset 寮傛鍔犺浇 TextAsset锛岄潪 AB 妯″紡鐩存帴璇绘枃浠躲��
+    /// </summary>
+    public async UniTask<string[]> LoadConfigAsync(string name, bool needExt = true, CancellationToken ct = default)
+    {
+        if (AssetSource.isUseAssetBundle)
+        {
+            if (name.EndsWith(".txt") && needExt)
+            {
+                name = name.Substring(0, name.Length - 4);
+            }
+            var location = $"Assets/ResourcesOut/Config/{name}" + (needExt ? ".txt" : "");
+            try
+            {
+                var asset = await YooAssetService.Instance.LoadAssetAsync(
+                    location, typeof(TextAsset), 0, ct) as TextAsset;
+                if (asset != null && !string.IsNullOrEmpty(asset.text))
+                    return asset.text.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None);
+            }
+            catch (Exception ex)
+            {
+                Debug.LogError($"[ResManager] LoadConfigAsync YooAsset failed for '{name}': {ex.Message}");
+            }
+            return Array.Empty<string>();
+        }
+
+        // 闈� AB 妯″紡: 鐩存帴璇绘枃浠讹紙Editor 寮�鍙戞ā寮忥級
+#if UNITY_EDITOR
+        string path = ResourcesPath.CONFIG_FODLER + "/" + name + (needExt ? ".txt" : "");
+        return await UniTask.RunOnThreadPool(() => File.ReadAllLines(path));
+#else
+        return Array.Empty<string>();
+#endif
+    }
+
+    // ====================================================================
+    // 缂撳瓨鍔犺浇 & Sprite 寮傛鍔犺浇锛堟墍鏈夊钩鍙帮級
+    // ====================================================================
+
+    /// <summary>
+    /// 寮傛鍔犺浇璧勬簮骞惰蛋缂撳瓨灞傦紙缂撳瓨鍛戒腑鐩存帴杩斿洖锛屾湭鍛戒腑鍒欏姞杞藉苟缂撳瓨锛夈��
     /// </summary>
     public async UniTask<T> LoadAssetCachedAsync<T>(string directory, string name, bool needExt = true, CancellationToken ct = default) where T : UnityEngine.Object
     {
@@ -317,7 +419,7 @@
 
         var path = ($"Assets/ResourcesOut/{directory}/{name}" + (needExt ? GetExtension(typeof(T)) : ""))
             .Replace("//", "/").Trim().Replace("\\", "/");
-        // 闊抽鏂囦欢鎵╁睍鍚嶇粺涓�杞皬鍐欙紝閬垮厤 .WAV/.MP3 澶у皬鍐欎笉鍖归厤
+        // 闊抽鏂囦欢鎵╁睍鍚嶇粺涓�杞皬鍐�
         if (typeof(T) == typeof(AudioClip))
         {
             var pathExt2 = System.IO.Path.GetExtension(path);
@@ -348,58 +450,10 @@
             var path = $"Assets/ResourcesOut/{atlasName}/{spriteName}.png"
                 .Replace("//", "/").Trim().Replace("\\", "/");
             var sprite = await YooAssetService.Instance.LoadAssetAsync<Sprite>(path, ct: ct);
-#if UNITY_WEBGL
             if (sprite == null)
-                Debug.LogWarning($"[ResManager][WebGL-Diag] Sprite load returned NULL: path={path}");
-#endif
+                Debug.LogWarning($"[ResManager] Sprite load returned NULL: path={path}");
             return sprite;
         }
     }
 
-    /// <summary>
-    /// 寮傛鍔犺浇閰嶇疆鏂囦欢锛圲niTask 鐗堟湰锛夈��
-    /// AB 妯″紡浣跨敤 YooAsset RawFile 寮傛鍔犺浇锛岄潪 AB 妯″紡鐩存帴璇绘枃浠躲��
-    /// </summary>
-    public async UniTask<string[]> LoadConfigAsync(string name, bool needExt = true, CancellationToken ct = default)
-    {
-        // AB 妯″紡锛堝惈 WebGL锛�: 浣跨敤 YooAsset 鍔犺浇閰嶇疆鏂囦欢
-        if (AssetSource.isUseAssetBundle)
-        {
-            // 鍒ゆ柇涓�涓嬫槸鍚﹀師鏉ュ凡缁忓寘鍚�.txt 閰嶅悎 needExt 鍋氬吋瀹癸紝閬垮厤璋冪敤鏂逛紶鍏ラ噸澶嶅悗缂�瀵艰嚧璺緞閿欒
-            if (name.EndsWith(".txt") && needExt)
-            {
-                name = name.Substring(0, name.Length - 4);
-            }
-            var location = $"Assets/ResourcesOut/Config/{name}" + (needExt ? ".txt" : "");
-            try
-            {
-#if UNITY_WEBGL
-                // WebGL: WebServerFileSystem 涓嶆敮鎸� LoadRawFileAsync锛屾敼鐢� LoadAssetAsync<TextAsset>
-                // .txt 鏂囦欢鍦� Unity 涓互 TextAsset 褰㈠紡瀵煎叆锛學ebGL 鏀寔姝ゅ姞杞芥柟寮�
-                var asset = await ProjSG.Resource.YooAssetService.Instance.LoadAssetAsync(
-                    location, typeof(UnityEngine.TextAsset), 0, ct) as UnityEngine.TextAsset;
-                if (asset != null && !string.IsNullOrEmpty(asset.text))
-                    return asset.text.Split(new[] { "\r\n", "\n" }, System.StringSplitOptions.None);
-#else
-                var textAsset = await ProjSG.Resource.YooAssetService.Instance.LoadAssetAsync<TextAsset>(location, 0, ct);
-                if (textAsset != null && !string.IsNullOrEmpty(textAsset.text))
-                    return textAsset.text.Split(new[] { "\r\n", "\n" }, System.StringSplitOptions.None);
-#endif
-            }
-            catch (System.Exception ex)
-            {
-                UnityEngine.Debug.LogError($"[ResManager] LoadConfigAsync YooAsset failed for '{name}': {ex.Message}");
-            }
-            return System.Array.Empty<string>();
-        }
-
-        // 闈� AB 妯″紡: 鐩存帴璇绘枃浠讹紙Editor 寮�鍙戞ā寮忥級
-#if UNITY_EDITOR
-        string path = ResourcesPath.CONFIG_FODLER + "/" + name + (needExt ? ".txt" : "");
-        return await UniTask.RunOnThreadPool(() => File.ReadAllLines(path));
-#else
-        return System.Array.Empty<string>();
-#endif
-    }
-
-}
\ No newline at end of file
+}
diff --git a/Main/ResModule/YooAssetService.cs b/Main/ResModule/YooAssetService.cs
index b501d7f..994ee58 100644
--- a/Main/ResModule/YooAssetService.cs
+++ b/Main/ResModule/YooAssetService.cs
@@ -102,7 +102,8 @@
 
                             if (initOp.Status != EOperationStatus.Succeed)
                             {
-                                Debug.LogWarning($"[YooAssetService] Package '{pkgName}' re-init failed: {initOp.Error}");
+                                Debug.LogError($"[YooAssetService] Package '{pkgName}' re-init failed: {initOp.Error}");
+                                try { var d = package.DestroyAsync(); await d.ToUniTask(); YooAssets.RemovePackage(pkgName); } catch { }
                                 continue;
                             }
 
@@ -122,7 +123,14 @@
 
                         if (initOp.Status != EOperationStatus.Succeed)
                         {
-                            Debug.LogWarning($"[YooAssetService] Package '{pkgName}' init failed: {initOp.Error}");
+                            Debug.LogError($"[YooAssetService] Package '{pkgName}' init failed: {initOp.Error}");
+                            try
+                            {
+                                var dOp = package.DestroyAsync();
+                                await dOp.ToUniTask();
+                                YooAssets.RemovePackage(pkgName);
+                            }
+                            catch { }
                             continue;
                         }
 
@@ -238,10 +246,12 @@
                 }
                 case EPlayMode.HostPlayMode:
                 {
+                    bool hasBuildin = YooAssetInitializer.HasBuildinPackage(packageName);
                     return new HostPlayModeParameters
                     {
-                        BuildinFileSystemParameters = FileSystemParameters
-                            .CreateDefaultBuildinFileSystemParameters(),
+                        BuildinFileSystemParameters = hasBuildin
+                            ? FileSystemParameters.CreateDefaultBuildinFileSystemParameters()
+                            : null,
                         CacheFileSystemParameters = FileSystemParameters
                             .CreateDefaultCacheFileSystemParameters(remoteServices)
                     };
@@ -478,12 +488,27 @@
         }
 
         /// <summary>
-        /// 鍚屾鍔犺浇璧勪骇锛堜粎鍦ㄩ潪 WebGL 骞冲彴杩囨浮鏈熶娇鐢級銆�
+        /// 鍚屾鍔犺浇璧勪骇锛堥潪 WebGL 骞冲彴浣跨敤锛夈��
+        /// WebGL 涓嶆敮鎸佸悓姝ュ姞杞斤紝璇蜂娇鐢� LoadAssetAsync銆�
         /// </summary>
-        [System.Obsolete("Use LoadAssetAsync instead. Sync loading will be removed in US2.")]
         public T LoadAssetSync<T>(string location) where T : UnityEngine.Object
         {
-            throw new NotSupportedException("鍚屾璧勬簮鍔犺浇鎺ュ彛宸茬鐢紝璇蜂娇鐢ㄥ紓姝PI");
+            ThrowIfNotInitialized();
+
+            if (string.IsNullOrEmpty(location))
+            {
+                Debug.LogError("[YooAssetService] LoadAssetSync: location is null or empty.");
+                return null;
+            }
+
+            var package = FindPackageForAsset(location);
+            var handle = package.LoadAssetSync<T>(location);
+            if (handle.Status != EOperationStatus.Succeed)
+            {
+                Debug.LogError($"[YooAssetService] LoadAssetSync failed for '{location}': {handle.LastError}");
+                return null;
+            }
+            return handle.GetAssetObject<T>();
         }
 
         /// <inheritdoc />
@@ -592,6 +617,18 @@
         // Scene Loading
         // ====================================================================
 
+        /// <summary>
+        /// 寮�濮嬪姞杞藉満鏅紝杩斿洖 SceneHandle 渚涜皟鐢ㄦ柟鑷鎺у埗杩涘害鍜屾寕璧枫��
+        /// 涓嶄細绛夊緟鍔犺浇瀹屾垚銆�
+        /// </summary>
+        public SceneHandle BeginLoadScene(string location, LoadSceneMode sceneMode = LoadSceneMode.Single,
+            LocalPhysicsMode physicsMode = LocalPhysicsMode.None, bool suspendLoad = false, uint priority = 0)
+        {
+            ThrowIfNotInitialized();
+            var package = FindPackageForAsset(location);
+            return package.LoadSceneAsync(location, sceneMode, physicsMode, suspendLoad, priority);
+        }
+
         /// <inheritdoc />
         public async UniTask<SceneHandle> LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single,
             LocalPhysicsMode physicsMode = LocalPhysicsMode.None, bool suspendLoad = false, uint priority = 0, CancellationToken ct = default)
diff --git a/Main/SDK/SDKUtils.cs b/Main/SDK/SDKUtils.cs
index 1390f4b..a839df2 100644
--- a/Main/SDK/SDKUtils.cs
+++ b/Main/SDK/SDKUtils.cs
@@ -239,7 +239,7 @@
                 }
             }
 
-            yield return WaitForSecondsCache.Wait1;
+            yield return new WaitForSeconds(1f);
             // yield return WaitingForSecondConst.WaitMS1000;
         }
     }
@@ -554,7 +554,10 @@
                 }
             case CodeA2U.FreePlatformInitOk:
 
-                channelSign = _json["channelSign"].ToString();
+                if (_json.Keys.Contains("channelSign"))
+                {
+                    channelSign = _json["channelSign"].ToString();
+                }
                 if (onFreePlatformInitOk != null)
                 {
                     onFreePlatformInitOk();
diff --git a/Main/System/Arena/ArenaAwardCell.cs b/Main/System/Arena/ArenaAwardCell.cs
index 08db90e..30b797d 100644
--- a/Main/System/Arena/ArenaAwardCell.cs
+++ b/Main/System/Arena/ArenaAwardCell.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using System.Linq;
 using UnityEngine;
 
@@ -44,7 +44,7 @@
                 int itemCellIndex = i;
                 itemCell.SetActive(true);
                 itemCell.Init(new ItemCellModel(rewardArr[i][0], true, rewardArr[i][1]));
-                itemCell.button.SetListener(() => ItemTipUtility.Show(rewardArr[itemCellIndex][0]));
+                itemCell.SetClickListener(() => ItemTipUtility.Show(rewardArr[itemCellIndex][0]));
             }
             else
             {
diff --git a/Main/System/Arena/ArenaAwardWin.cs b/Main/System/Arena/ArenaAwardWin.cs
index d0180fb..ee24e2c 100644
--- a/Main/System/Arena/ArenaAwardWin.cs
+++ b/Main/System/Arena/ArenaAwardWin.cs
@@ -68,7 +68,7 @@
     }
 
 
-    protected override async void OpenSubUIByTabIndex()
+    protected override void OpenSubUIByTabIndex()
     {
         ArenaManager.Instance.nowAwardTabIndex = functionOrder;
         Display();
diff --git a/Main/System/Arena/ArenaBattleFailWin.cs b/Main/System/Arena/ArenaBattleFailWin.cs
index 79e6b61..1d6bc75 100644
--- a/Main/System/Arena/ArenaBattleFailWin.cs
+++ b/Main/System/Arena/ArenaBattleFailWin.cs
@@ -69,8 +69,8 @@
 
         myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                 PlayerDatas.Instance.baseData.face,
-                                                PlayerDatas.Instance.baseData.facePic));
-        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
+                                                PlayerDatas.Instance.baseData.facePic)).Forget();
+        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic)).Forget();
         enemyAvatarCell.SetOnLoaded(() =>
         {
             if (this == null) return;
diff --git a/Main/System/Arena/ArenaBattleVictoryWin.cs b/Main/System/Arena/ArenaBattleVictoryWin.cs
index 4a47ea3..b31f782 100644
--- a/Main/System/Arena/ArenaBattleVictoryWin.cs
+++ b/Main/System/Arena/ArenaBattleVictoryWin.cs
@@ -63,8 +63,8 @@
 
         myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                 PlayerDatas.Instance.baseData.face,
-                                                PlayerDatas.Instance.baseData.facePic));
-        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
+                                                PlayerDatas.Instance.baseData.facePic)).Forget();
+        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic)).Forget();
         enemyAvatarCell.SetOnLoaded(() =>
         {
             if (this == null) return;
diff --git a/Main/System/Arena/ArenaChallengeCell.cs b/Main/System/Arena/ArenaChallengeCell.cs
index 85788b7..3a44e6c 100644
--- a/Main/System/Arena/ArenaChallengeCell.cs
+++ b/Main/System/Arena/ArenaChallengeCell.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using Cysharp.Threading.Tasks;
 using UnityEngine;
 
@@ -33,7 +33,7 @@
             return;
         arenaMatchInfo = list[index];
 
-        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaMatchInfo.PlayerID, (int)arenaMatchInfo.Face, (int)arenaMatchInfo.FacePic));
+        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaMatchInfo.PlayerID, (int)arenaMatchInfo.Face, (int)arenaMatchInfo.FacePic)).Forget();
         avatarCell.SetOnLoaded(() =>
         {
             avatarCell.SetListener(() =>
@@ -57,7 +57,7 @@
                 int itemCellIndex = i;
                 itemCell.SetActive(true);
                 itemCell.Init(new ItemCellModel(rewards[i][0], true, rewards[i][1]));
-                itemCell.button.SetListener(() => ItemTipUtility.Show(rewards[itemCellIndex][0]));
+                itemCell.SetClickListener(() => ItemTipUtility.Show(rewards[itemCellIndex][0]));
             }
             else
             {
diff --git a/Main/System/Arena/ArenaPlayerRankCell.cs b/Main/System/Arena/ArenaPlayerRankCell.cs
index 71aad77..285a625 100644
--- a/Main/System/Arena/ArenaPlayerRankCell.cs
+++ b/Main/System/Arena/ArenaPlayerRankCell.cs
@@ -29,7 +29,7 @@
                 //鍙栫帺瀹惰嚜宸辩殑鏁版嵁
                 avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                 PlayerDatas.Instance.baseData.face,
-                                                PlayerDatas.Instance.baseData.facePic));
+                                                PlayerDatas.Instance.baseData.facePic)).Forget();
                 rankText.text = Language.Get("L1045");
                 rankValueText.text = ArenaManager.Instance.score.ToString();
                 nameText.text = PlayerDatas.Instance.baseData.PlayerName;
@@ -51,7 +51,7 @@
             officialTitleCell.SetActive(true);
             officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2).Forget();
             avatarCell.SetActive(true);
-            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
+            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4)).Forget();
             avatarCell.SetOnLoaded(() =>
             {
                 avatarCell.SetListener(() =>
diff --git a/Main/System/Arena/ArenaRecordCell.cs b/Main/System/Arena/ArenaRecordCell.cs
index 4c6714b..9484c25 100644
--- a/Main/System/Arena/ArenaRecordCell.cs
+++ b/Main/System/Arena/ArenaRecordCell.cs
@@ -65,7 +65,7 @@
             }
 
         }
-        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaGameRec.Value3, (int)arenaGameRec.Value5, (int)arenaGameRec.Value6));
+        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaGameRec.Value3, (int)arenaGameRec.Value5, (int)arenaGameRec.Value6)).Forget();
         avatarCell.SetOnLoaded(() =>
         {
             avatarCell.SetListener(() =>
diff --git a/Main/System/AssetVersion/AssetVersionUtility.cs b/Main/System/AssetVersion/AssetVersionUtility.cs
index d4a0d95..9a6d2a6 100644
--- a/Main/System/AssetVersion/AssetVersionUtility.cs
+++ b/Main/System/AssetVersion/AssetVersionUtility.cs
@@ -64,6 +64,15 @@
     static List<AssetVersion> unpriorDownLoadAssetVersions = new List<AssetVersion>();
     public static bool checkAssetCompleted { get; private set; }
     private static string assetVerUrl;
+
+    public static void ForceCompleteCheck()
+    {
+        m_PriorAssetDownLoadDone = true;
+        m_UnPriorAssetDownLoadDone = true;
+        checkAssetCompleted = true;
+        Debug.Log("[AssetVersionUtility] ForceCompleteCheck - YooAsset 宸叉帴绠¤祫婧愮鐞嗭紝璺宠繃鏃х増鏈鏌�");
+    }
+
     public static void Init()
     {
 
@@ -108,7 +117,7 @@
             var assetVersionUrl = StringUtility.Concat(VersionUtility.Instance.versionInfo.GetResourcesURL(config.branch), Language.fixPath, "/AssetsVersion.txt");
             assetVerUrl = assetVersionUrl;
             Debug.Log("http鍦板潃:assetVersionUrl  " + assetVersionUrl);
-            HttpRequest.Instance.UnityWebRequestGet(assetVersionUrl, 5, OnGetAssetVersionFile);
+            HttpRequest.Instance.UnityWebRequestGet(assetVersionUrl, 5, OnGetAssetVersionFile).Forget();
         }).Forget();
 
     }
diff --git a/Main/System/AssetVersion/DownloadHotMgr.cs b/Main/System/AssetVersion/DownloadHotMgr.cs
index 497331e..807f947 100644
--- a/Main/System/AssetVersion/DownloadHotMgr.cs
+++ b/Main/System/AssetVersion/DownloadHotMgr.cs
@@ -329,30 +329,41 @@
         this.state = TaskState.Working;
         FileExtersion.MakeSureDirectory(tempFile);
         Debug.LogFormat("寮�濮嬭幏鍙栧ご淇℃伅锛歿0}", remoteUrl);
-        using (var www = UnityWebRequest.Head(remoteUrl))
+        try
         {
-            www.timeout = DownloadHotMgr.TimeOut;
-            await www.SendWebRequest();
-            if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError)
+            using (var www = UnityWebRequest.Head(remoteUrl))
             {
-                Debug.LogErrorFormat("澶翠俊鎭幏鍙栧け璐ワ細{0}锛沞rror锛歿1}", remoteUrl, www.error);
-                requestHeaderOk = false;
-                SetFailed(www.error);
+                www.timeout = DownloadHotMgr.TimeOut;
+                await www.SendWebRequest();
+                if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError)
+                {
+                    Debug.LogErrorFormat("澶翠俊鎭幏鍙栧け璐ワ細{0}锛沞rror锛歿1}", remoteUrl, www.error);
+                    requestHeaderOk = false;
+                    SetFailed(www.error);
+                    www.Dispose();
+                    return;
+                }
+                long.TryParse(www.GetResponseHeader(HttpHeader.ContentLength), out this.remoteLength);
+                this.remoteLastModified = DateTime.Parse(www.GetResponseHeader(HttpHeader.LastModified));
+                var acceptRange = www.GetResponseHeader(HttpHeader.AcceptRanges);
+                this.isAcceptRange = acceptRange != "none";
+                Debug.LogFormat("澶翠俊鎭幏鍙栨垚鍔燂細{0}锛涘ぇ灏忥細{1}锛涗慨鏀规椂闂达細{2}锛涙槸鍚︽敮鎸佺画浼狅細{3}", remoteUrl, remoteLength, remoteLastModified, acceptRange);
+                requestHeaderOk = true;
+                state = TaskState.Wait;
                 www.Dispose();
-                await UniTask.CompletedTask;
             }
-            long.TryParse(www.GetResponseHeader(HttpHeader.ContentLength), out this.remoteLength);
-            this.remoteLastModified = DateTime.Parse(www.GetResponseHeader(HttpHeader.LastModified));
-            var acceptRange = www.GetResponseHeader(HttpHeader.AcceptRanges);
-            this.isAcceptRange = acceptRange != "none";
-            Debug.LogFormat("澶翠俊鎭幏鍙栨垚鍔燂細{0}锛涘ぇ灏忥細{1}锛涗慨鏀规椂闂达細{2}锛涙槸鍚︽敮鎸佺画浼狅細{3}", remoteUrl, remoteLength, remoteLastModified, acceptRange);
-            requestHeaderOk = true;
-            state = TaskState.Wait;
-            www.Dispose();
+        }
+        catch (Exception e)
+        {
+            Debug.LogError("[DownloadHotTask] Co_GetHeader 寮傚父\nURL: " + remoteUrl + "\nlocalFile: " + localFile + "\n閿欒: " + e.Message + "\n" + e.StackTrace);
+            requestHeaderOk = false;
+            SetFailed(e.Message);
         }
     }
     private async UniTask Co_DownloadFile()
     {
+        try
+        {
         state = TaskState.Working;
         while (TimeUtility.AllSeconds < beginTickCount + 5)//闄愬埗閲嶆柊涓嬭浇鐨勬椂闂撮棿闅�
         {
@@ -367,7 +378,7 @@
         if (!requestHeaderOk)//澶存枃浠惰幏鍙栧け璐�
         {
             onCompleted?.Invoke(this);
-            await UniTask.CompletedTask;
+            return;
         }
         try
         {
@@ -422,7 +433,7 @@
         Debug.LogFormat("涓嬭浇璇锋眰鑼冨洿锛歿0} 锛沚ytes={1}", remoteUrl, LocalLength);
         var localLength = LocalLength;
         this.downloadedBytes = localLength;
-        fileRequest.SendWebRequest();
+        _ = fileRequest.SendWebRequest();
         while (!fileRequest.isDone)
         {
             var length = localLength + (long)fileRequest.downloadedBytes;//鏈湴鏂囦欢澶у皬+鏈涓嬭浇鐨勬暟鎹ぇ灏�
@@ -470,6 +481,13 @@
             SetFailed("涓嬭浇瀹屾垚浣嗘槸鏂囦欢涓嶅瓨鍦�");
         }
         onCompleted?.Invoke(this);
+        }
+        catch (Exception e)
+        {
+            Debug.LogError("[DownloadHotTask] Co_DownloadFile 寮傚父\nURL: " + remoteUrl + "\nlocalFile: " + localFile + "\n閿欒: " + e.Message + "\n" + e.StackTrace);
+            SetFailed(e.Message);
+            onCompleted?.Invoke(this);
+        }
     }
 
     private async UniTask Move(string sourceFile, string destFile)
diff --git a/Main/System/Battle/ArenaBattleWin.cs b/Main/System/Battle/ArenaBattleWin.cs
index a1ad183..e4ab385 100644
--- a/Main/System/Battle/ArenaBattleWin.cs
+++ b/Main/System/Battle/ArenaBattleWin.cs
@@ -204,7 +204,7 @@
         txtEnemyLV.text = Language.Get("Arena22", info.Lv);
         txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
         txtEnemyFightPonit.text = UIHelper.ReplaceLargeArtNum(GetFightPonit(enemyTeam));
-        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)info.PlayerID, (int)info.Face, (int)info.FacePic));
+        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)info.PlayerID, (int)info.Face, (int)info.FacePic)).Forget();
         enemyAvatarCell.SetOnLoaded(() =>
         {
             enemyAvatarCell.SetListener(() =>
@@ -219,7 +219,7 @@
         txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
         long myFightPower = GetFightPonit(myTeam);
         txtMyFightPonit.text = UIHelper.ReplaceLargeArtNum(myFightPower);
-        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID, PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic));
+        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID, PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic)).Forget();
         team = GetTeamHeroList(myTeam);
         myCountry.RefreshOnTeamCountry(team, true);
 
diff --git a/Main/System/Battle/BaseBattleWin.cs b/Main/System/Battle/BaseBattleWin.cs
index 064383d..fa2ff19 100644
--- a/Main/System/Battle/BaseBattleWin.cs
+++ b/Main/System/Battle/BaseBattleWin.cs
@@ -167,7 +167,7 @@
             {
                 var buff = buffList[i];
                 cells[i].SetActive(true);
-                cells[i].Init(buffList[i], () => OnClickMinggeBuff(cell, buff));
+                cells[i].Init(buffList[i], () => OnClickMinggeBuff(cell, buff)).Forget();
             }
             else
             {
diff --git a/Main/System/Battle/BattleDebug.cs b/Main/System/Battle/BattleDebug.cs
index caa6a06..c51b6c2 100644
--- a/Main/System/Battle/BattleDebug.cs
+++ b/Main/System/Battle/BattleDebug.cs
@@ -10,6 +10,8 @@
 		{
 			Debug.LogWarning("BattleLog: " + _logMessage);
 		}
+#elif UNITY_WEBGL && !UNITY_EDITOR
+		WebGLDebug.LogError("BattleLog: " + _logMessage);
 #endif
 	}
 }
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/StoryBattleField.cs b/Main/System/Battle/BattleField/StoryBattleField.cs
index e61e9ed..7728058 100644
--- a/Main/System/Battle/BattleField/StoryBattleField.cs
+++ b/Main/System/Battle/BattleField/StoryBattleField.cs
@@ -194,7 +194,7 @@
     protected void ReloadTeam()
     {
         PreloadResources(new List<TeamBase>() { TeamManager.Instance.GetTeam(BattlePreSetType.Story) }, null);
-        battleObjMgr.ReloadTeam(TeamManager.Instance.GetTeam(BattlePreSetType.Story), BattleCamp.Red);
+        battleObjMgr.ReloadTeam(TeamManager.Instance.GetTeam(BattlePreSetType.Story), BattleCamp.Red).Forget();
     }
 
     // public override void OnBattleEnd(JsonData turnFightStateData)
@@ -323,7 +323,7 @@
         return false;
     }
 
-    public override async void ShowWindow(HB424_tagSCTurnFightInit vNetData)
+    public override void ShowWindow(HB424_tagSCTurnFightInit vNetData)
     {
         BattleWin battleWin = UIManager.Instance.GetUI<BattleWin>();
         if (null != battleWin)
diff --git a/Main/System/Battle/BattleHUDWin.cs b/Main/System/Battle/BattleHUDWin.cs
index fbb0cc0..9caf522 100644
--- a/Main/System/Battle/BattleHUDWin.cs
+++ b/Main/System/Battle/BattleHUDWin.cs
@@ -84,7 +84,7 @@
     }
 
 
-    public async void SetBattleField(BattleField _battleField)
+    public void SetBattleField(BattleField _battleField)
     {
         CleanupBattleField();
         ClearContent(string.Empty, true);
diff --git a/Main/System/Battle/BattleManager.cs b/Main/System/Battle/BattleManager.cs
index 3835e4c..537317b 100644
--- a/Main/System/Battle/BattleManager.cs
+++ b/Main/System/Battle/BattleManager.cs
@@ -121,7 +121,7 @@
             vNetData.MapID = (uint)MapID;
             vNetData.FuncLineID = (uint)FuncLineID;
 
-            CreateBattleField(string.Empty, vNetData, extendData, redTeamList, blueTeamList);
+            CreateBattleField(string.Empty, vNetData, extendData, redTeamList, blueTeamList).Forget();
         }
         else
         {
diff --git a/Main/System/Battle/Define/BattleDmgInfo.cs b/Main/System/Battle/Define/BattleDmgInfo.cs
index 439ebe4..a3cae1c 100644
--- a/Main/System/Battle/Define/BattleDmgInfo.cs
+++ b/Main/System/Battle/Define/BattleDmgInfo.cs
@@ -495,7 +495,7 @@
 
     public bool IsRealdamage()
     {
-        return skillConfig.HurtType / 10 == 1;
+        return skillConfig.HurtType / 10 == 1 || IsType(DamageType.Realdamage);
     }
 
     public bool IsDamage()
diff --git a/Main/System/Battle/SkillEffect/SkillEffectFactory.cs b/Main/System/Battle/SkillEffect/SkillEffectFactory.cs
index c25adb1..84b6db6 100644
--- a/Main/System/Battle/SkillEffect/SkillEffectFactory.cs
+++ b/Main/System/Battle/SkillEffect/SkillEffectFactory.cs
@@ -25,8 +25,6 @@
             default:
                 UnityEngine.Debug.LogError("Unknown Skill Effect Type " + skillSkinConfig.effectType + " skill id is " + skillConfig.SkillID);
                 return new NoEffect(skillBase, skillConfig, skillSkinConfig, caster, tagUseSkillAttack);
-                break;
         }
-        return null;
     }
 }
\ No newline at end of file
diff --git a/Main/System/BillboardRank/PlayerRankCell.cs b/Main/System/BillboardRank/PlayerRankCell.cs
index c10d122..3ac8d4a 100644
--- a/Main/System/BillboardRank/PlayerRankCell.cs
+++ b/Main/System/BillboardRank/PlayerRankCell.cs
@@ -44,7 +44,7 @@
                 //鍙栫帺瀹惰嚜宸辩殑鏁版嵁
                 avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                 PlayerDatas.Instance.baseData.face,
-                                                PlayerDatas.Instance.baseData.facePic));
+                                                PlayerDatas.Instance.baseData.facePic)).Forget();
                 rankText.text = Language.Get("L1045");
                 rankValueText.text = "";//Language.Get("L1125");
                 nameText.text = PlayerDatas.Instance.baseData.PlayerName;
@@ -65,7 +65,7 @@
             officialTitleCell.SetActive(true);
             officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2).Forget();
             avatarCell.SetActive(true);
-            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
+            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4)).Forget();
             viewPlayerId = (int)rankData.id;
             nameText.text = rankData.name1;
             rankValueText.text = RankModel.Instance.GetCmpValueStr(rankType, rankData.cmpValue); ;
diff --git a/Main/System/BoneField/BoneFieldWin.cs b/Main/System/BoneField/BoneFieldWin.cs
index 02f9480..8b81be6 100644
--- a/Main/System/BoneField/BoneFieldWin.cs
+++ b/Main/System/BoneField/BoneFieldWin.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
 using Cysharp.Threading.Tasks;
@@ -264,7 +264,7 @@
                 int index = i;
                 itemCells[i].SetActive(true);
                 itemCells[i].Init(new ItemCellModel(items[i][0], true, items[i][1]));
-                itemCells[i].button.SetListener(() =>
+                itemCells[i].SetClickListener(() =>
                 {
                     ItemTipUtility.Show(items[index][0]);
                 });
diff --git a/Main/System/Chat/ChatPlayerMineCell.cs b/Main/System/Chat/ChatPlayerMineCell.cs
index e72673f..7f368ad 100644
--- a/Main/System/Chat/ChatPlayerMineCell.cs
+++ b/Main/System/Chat/ChatPlayerMineCell.cs
@@ -23,7 +23,7 @@
 
         avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                 PlayerDatas.Instance.baseData.face,
-                                                PlayerDatas.Instance.baseData.facePic));
+                                                PlayerDatas.Instance.baseData.facePic)).Forget();
 
         title.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID).Forget();
         if (manager.nowChatTab == ChatChannel.World)
diff --git a/Main/System/Chat/ChatPlayerOtherCell.cs b/Main/System/Chat/ChatPlayerOtherCell.cs
index 4a49d9e..c016a36 100644
--- a/Main/System/Chat/ChatPlayerOtherCell.cs
+++ b/Main/System/Chat/ChatPlayerOtherCell.cs
@@ -22,7 +22,7 @@
         bool hasNewPlayerInfo = manager.TryGetNewPlayerInfoByPlayerID(nowData.PlayerID, out TalkData newPlayerInfo);
         TalkData data = hasNewPlayerInfo ? newPlayerInfo : nowData;
 
-        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)data.PlayerID, (int)data.Face, (int)data.FacePic, data.Job));
+        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)data.PlayerID, (int)data.Face, (int)data.FacePic, data.Job)).Forget();
 
         title.InitUI(data.RealmLV, (int)data.TitleID).Forget();
         int bubbleID = ChatBubbleHelper.GetOtherChatBubbleID(data.Job, (int)data.BubbleBox);
diff --git a/Main/System/ClientVersion/VersionUtility.cs b/Main/System/ClientVersion/VersionUtility.cs
index 433fe22..3c1bc55 100644
--- a/Main/System/ClientVersion/VersionUtility.cs
+++ b/Main/System/ClientVersion/VersionUtility.cs
@@ -256,7 +256,7 @@
                 return false;
             }
         }
-        catch (System.Exception ex)
+        catch (System.Exception)
         {
             return false;
         }
diff --git a/Main/System/CustomizedGift/CustomizedGiftCell.cs b/Main/System/CustomizedGift/CustomizedGiftCell.cs
index a1eedb4..08ec571 100644
--- a/Main/System/CustomizedGift/CustomizedGiftCell.cs
+++ b/Main/System/CustomizedGift/CustomizedGiftCell.cs
@@ -53,7 +53,7 @@
                     itemCells[i].SetActive(true);
                     var itemData = new ItemCellModel((int)award.ItemID, false, award.ItemCount);
                     itemCells[i].Init(itemData);
-                    itemCells[i].button.SetListener(() =>
+                    itemCells[i].SetClickListener(() =>
                     {
                         ItemTipUtility.Show((int)award.ItemID);
                     });
diff --git a/Main/System/CustomizedGift/CustomizedGiftChooseCell.cs b/Main/System/CustomizedGift/CustomizedGiftChooseCell.cs
index a48bb20..e3b2459 100644
--- a/Main/System/CustomizedGift/CustomizedGiftChooseCell.cs
+++ b/Main/System/CustomizedGift/CustomizedGiftChooseCell.cs
@@ -30,7 +30,7 @@
                 images[i].SetActive(CustomizedRechargeModel.Instance.GetChooseSubIndex(CustomizedRechargeModel.Instance.chooseWinIndex) - 1 == i);
                 itemCells[i].SetActive(true);
                 itemCells[i].Init(itemData);
-                itemCells[i].button.SetListener(() =>
+                itemCells[i].SetClickListener(() =>
                 {
                     CustomizedRechargeModel.Instance.chooseIndexDict[CustomizedRechargeModel.Instance.chooseWinIndex] = itemIndex + 1;
                     //閫変腑鍚庤烦涓嬩竴涓�
diff --git a/Main/System/CustomizedGift/CustomizedGiftChooseWin.cs b/Main/System/CustomizedGift/CustomizedGiftChooseWin.cs
index ec98e16..d3e930e 100644
--- a/Main/System/CustomizedGift/CustomizedGiftChooseWin.cs
+++ b/Main/System/CustomizedGift/CustomizedGiftChooseWin.cs
@@ -119,7 +119,7 @@
                 }
 
                 int index = i;
-                itemCellList[i].button.SetListener(() =>
+                itemCellList[i].SetClickListener(() =>
                 {
                     if (CustomizedRechargeModel.Instance.chooseWinIndex != index)
                     {
diff --git a/Main/System/CustomizedGift/CustomizedRechargeModel.cs b/Main/System/CustomizedGift/CustomizedRechargeModel.cs
index fc33518..00d879b 100644
--- a/Main/System/CustomizedGift/CustomizedRechargeModel.cs
+++ b/Main/System/CustomizedGift/CustomizedRechargeModel.cs
@@ -146,7 +146,7 @@
                     var award = awards[i];
                     var itemData = new ItemCellModel(award.id, false, award.countEx);
                     itemCells[i].Init(itemData);
-                    itemCells[i].button.SetListener(() =>
+                    itemCells[i].SetClickListener(() =>
                     {
                         if (index < goodsCount)
                             ItemTipUtility.Show(award.id);
@@ -163,7 +163,7 @@
                 else
                 {
                     itemCells[i].Init(null);
-                    itemCells[i].button.SetListener(() =>
+                    itemCells[i].SetClickListener(() =>
                     {
                         chooseWinIndex = index - goodsCount;
                         chooseCTGID = ctgID;
diff --git a/Main/System/DailySpecials/DailySpecialsBaseWin.cs b/Main/System/DailySpecials/DailySpecialsBaseWin.cs
index 2af1778..d97dd88 100644
--- a/Main/System/DailySpecials/DailySpecialsBaseWin.cs
+++ b/Main/System/DailySpecials/DailySpecialsBaseWin.cs
@@ -120,7 +120,7 @@
 
         bool isReceived = manager.IsReceived(shopId);
         freeItem.Init(new ItemCellModel(itemId, false, itemCount));
-        freeItem.button.SetListener(() =>
+        freeItem.SetClickListener(() =>
         {
             if (!isReceived)
             {
diff --git a/Main/System/DailySpecials/DailySpecialsDayGiftCell.cs b/Main/System/DailySpecials/DailySpecialsDayGiftCell.cs
index ebad308..6b1c245 100644
--- a/Main/System/DailySpecials/DailySpecialsDayGiftCell.cs
+++ b/Main/System/DailySpecials/DailySpecialsDayGiftCell.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using UnityEngine;
 
 public class DailySpecialsDayGiftCell : MonoBehaviour
@@ -46,7 +46,7 @@
                 int itemId = gainItemList[i][0];
                 int count = gainItemList[i][1];
                 itemCells[i].Init(new ItemCellModel(itemId, false, count));
-                itemCells[i].button.SetListener(() => { ItemTipUtility.Show(itemId); });
+                itemCells[i].SetClickListener(() => { ItemTipUtility.Show(itemId); });
                 itemCells[i].SetActive(true);
             }
             else
diff --git a/Main/System/DailySpecials/DailySpecialsItem.cs b/Main/System/DailySpecials/DailySpecialsItem.cs
index 7749821..686481d 100644
--- a/Main/System/DailySpecials/DailySpecialsItem.cs
+++ b/Main/System/DailySpecials/DailySpecialsItem.cs
@@ -1,4 +1,4 @@
-using UnityEngine;
+锘縰sing UnityEngine;
 
 public class DailySpecialsItem : MonoBehaviour
 {
@@ -40,7 +40,7 @@
                 int itemId = gainItemList[i][0];
                 int count = gainItemList[i][1];
                 itemCells[i].Init(new ItemCellModel(itemId, false, count));
-                itemCells[i].button.SetListener(() => { ItemTipUtility.Show(itemId); });
+                itemCells[i].SetClickListener(() => { ItemTipUtility.Show(itemId); });
                 itemCells[i].SetActive(true);
             }
             else
diff --git a/Main/System/DailySpecials/DailySpecialsWeekGiftCell.cs b/Main/System/DailySpecials/DailySpecialsWeekGiftCell.cs
index b82ed0e..3c9f2c4 100644
--- a/Main/System/DailySpecials/DailySpecialsWeekGiftCell.cs
+++ b/Main/System/DailySpecials/DailySpecialsWeekGiftCell.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using UnityEngine;
 
 public class DailySpecialsWeekGiftCell : MonoBehaviour
@@ -46,7 +46,7 @@
                 int itemId = gainItemList[i][0];
                 int count = gainItemList[i][1];
                 itemCells[i].Init(new ItemCellModel(itemId, false, count));
-                itemCells[i].button.SetListener(() => { ItemTipUtility.Show(itemId); });
+                itemCells[i].SetClickListener(() => { ItemTipUtility.Show(itemId); });
                 itemCells[i].SetActive(true);
             }
             else
diff --git a/Main/System/DailySpecials/DailySpecialsWin.cs b/Main/System/DailySpecials/DailySpecialsWin.cs
index c58b056..8fbb7c0 100644
--- a/Main/System/DailySpecials/DailySpecialsWin.cs
+++ b/Main/System/DailySpecials/DailySpecialsWin.cs
@@ -1,4 +1,4 @@
-using System;
+锘縰sing System;
 using UnityEngine;
 using UnityEngine.UI;
 
@@ -66,7 +66,7 @@
         int itemId = gainItemList[0][0];
         int itemCount = gainItemList[0][1];
         itemcellAllBuy.Init(new ItemCellModel(itemId, false, itemCount));
-        itemcellAllBuy.button.SetListener(() => { ItemTipUtility.Show(itemId); });
+        itemcellAllBuy.SetClickListener(() => { ItemTipUtility.Show(itemId); });
 
         bool hasRechargeCount = RechargeManager.Instance.TryGetRechargeCount(ctgid, out RechargeCount _rechargeCount);
         bool isBuyAll = hasRechargeCount && _rechargeCount.todayCount > 0;
diff --git a/Main/System/Equip/BlessLVWin.cs b/Main/System/Equip/BlessLVWin.cs
index eb14864..0b0f426 100644
--- a/Main/System/Equip/BlessLVWin.cs
+++ b/Main/System/Equip/BlessLVWin.cs
@@ -49,7 +49,7 @@
         {
             SmallTipWin.showText = Language.Get("BlessLVRuleDesc");
             SmallTipWin.worldPos = tipButton.transform.position;
-            UIManager.Instance.OpenWindow<SmallTipWin>();
+            UIManager.Instance.OpenWindowAsync<SmallTipWin>().Forget();
         });
     }
 
diff --git a/Main/System/FirstCharge/FirstChargeDayAward.cs b/Main/System/FirstCharge/FirstChargeDayAward.cs
index a14922f..5677e11 100644
--- a/Main/System/FirstCharge/FirstChargeDayAward.cs
+++ b/Main/System/FirstCharge/FirstChargeDayAward.cs
@@ -122,7 +122,7 @@
     {
         transCount1.SetActive(true);
         itemCellCount1.Init(new ItemCellModel((int)awardList[0][0], true, awardList[0][1]), awardList[0][2]);
-        itemCellCount1.button.SetListener(() => HandleItemClick((int)awardList[0][0], awardList[0][2]));
+        itemCellCount1.SetClickListener(() => HandleItemClick((int)awardList[0][0], awardList[0][2]));
         imgHaveCount1.SetActive(awardState == 0);
     }
 
@@ -186,7 +186,7 @@
                 int index = i; // Lambda琛ㄨ揪寮忎腑浣跨敤锛岄渶瑕佸垱寤哄眬閮ㄥ壇鏈�
                 itemCells[i].SetActive(true);
                 itemCells[i].Init(new ItemCellModel((int)awardList[i][0], true, awardList[i][1]), awardList[index][2]);
-                itemCells[i].button.SetListener(() => HandleItemClick((int)awardList[index][0], awardList[index][2]));
+                itemCells[i].SetClickListener(() => HandleItemClick((int)awardList[index][0], awardList[index][2]));
             }
             else
             {
diff --git a/Main/System/FirstCharge/FirstChargeWin.cs b/Main/System/FirstCharge/FirstChargeWin.cs
index 25097f2..6ef5ad5 100644
--- a/Main/System/FirstCharge/FirstChargeWin.cs
+++ b/Main/System/FirstCharge/FirstChargeWin.cs
@@ -79,7 +79,7 @@
         DisplayButton(firstId);
     }
 
-    protected override async void OpenSubUIByTabIndex()
+    protected override void OpenSubUIByTabIndex()
     {
         int firstId = model.GetFirstIDByTabIndex(functionOrder);
         model.SetClickTabState(firstId);
@@ -208,6 +208,10 @@
         txtDesc.text = heroInfo.heroConfig.Desc;
         imgCountry.SetSprite(HeroUIManager.Instance.GetCountryIconName(heroInfo.heroConfig.Country));
         imgJob.SetSprite(HeroUIManager.Instance.GetJobIconName(heroInfo.heroConfig.Class));
+        var prev = Debug.unityLogger.logEnabled;
+        Debug.unityLogger.logEnabled = true;
+        Debug.LogWarning($"[FirstChargeWin] DisplayMainItem: skinID={heroInfo.SkinID} roleLhModel={roleLhModel != null} active={roleLhModel?.gameObject.activeSelf} frame={Time.frameCount}");
+        Debug.unityLogger.logEnabled = prev;
         roleLhModel.Create(heroInfo.SkinID, lhScale, motionName: "", isLh: true).Forget();
         roleLhModel.transform.localScale = new Vector3(lhScale, lhScale, lhScale);
     }
diff --git a/Main/System/FunctionPreview/FunctionPreviewCell.cs b/Main/System/FunctionPreview/FunctionPreviewCell.cs
index c37079d..691136a 100644
--- a/Main/System/FunctionPreview/FunctionPreviewCell.cs
+++ b/Main/System/FunctionPreview/FunctionPreviewCell.cs
@@ -1,4 +1,4 @@
-using UnityEngine;
+锘縰sing UnityEngine;
 
 public class FunctionPreviewCell : MonoBehaviour
 {
@@ -34,7 +34,7 @@
         if (!awardList.IsNullOrEmpty())
         {
             itemCell.Init(new ItemCellModel(awardList[0][0], true, awardList[0][1]));
-            itemCell.button.SetListener(() =>
+            itemCell.SetClickListener(() =>
             {
                 if (state == 1)
                 {
diff --git a/Main/System/Guild/GuildApplyListCell.cs b/Main/System/Guild/GuildApplyListCell.cs
index b8b8f48..f9059b7 100644
--- a/Main/System/Guild/GuildApplyListCell.cs
+++ b/Main/System/Guild/GuildApplyListCell.cs
@@ -23,7 +23,7 @@
         nameText.text = data.Name;
         lvText.text = data.LV.ToString();
         fightPointText.text = UIHelper.ReplaceLargeArtNum(data.FightPower);
-        avatarCell.InitUI(AvatarHelper.GetAvatarModel(data.PlayerID, data.Face, data.FacePic));
+        avatarCell.InitUI(AvatarHelper.GetAvatarModel(data.PlayerID, data.Face, data.FacePic)).Forget();
         officialTitleCell.InitUI(data.RealmLV, data.TitleID).Forget();
 
         yesButton.SetListener(() =>
diff --git a/Main/System/Guild/GuildBossHurtRankCell.cs b/Main/System/Guild/GuildBossHurtRankCell.cs
index 7eb5763..7a0446f 100644
--- a/Main/System/Guild/GuildBossHurtRankCell.cs
+++ b/Main/System/Guild/GuildBossHurtRankCell.cs
@@ -45,7 +45,7 @@
         var rankData = GuildBossManager.Instance.playerBossHurtRank[rank];
         int playerID = (int)rankData.Value1;
         var playerData = GuildBossManager.Instance.GetMemberData(playerID);
-        avatarCell.InitUI(AvatarHelper.GetAvatarModel(playerID, playerData.Face, playerData.FacePic));
+        avatarCell.InitUI(AvatarHelper.GetAvatarModel(playerID, playerData.Face, playerData.FacePic)).Forget();
         avatarCell.SetOnLoaded(() =>
         {
             avatarCell.SetListener(() =>
diff --git a/Main/System/Guild/GuildBossOtherPlayer.cs b/Main/System/Guild/GuildBossOtherPlayer.cs
index b41d4a3..f9680a8 100644
--- a/Main/System/Guild/GuildBossOtherPlayer.cs
+++ b/Main/System/Guild/GuildBossOtherPlayer.cs
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 //鍏細璁ㄤ紣-鍏朵粬鐜╁
 public class GuildBossOtherPlayer : MonoBehaviour
@@ -18,7 +19,7 @@
     {
         playerID = (int)data.Value1;
         var playData = GuildBossManager.Instance.GetMemberData(playerID);
-        headCell.InitUI(AvatarHelper.GetAvatarModel(playerID, playData.Face, playData.FacePic));
+        headCell.InitUI(AvatarHelper.GetAvatarModel(playerID, playData.Face, playData.FacePic)).Forget();
         nameText.text = playData.Name;
         hurtValueText.text = UIHelper.ReplaceLargeNum(data.Value4 + data.Value5 * Constants.ExpPointValue);
         var rank = GetRankIndex(playerID);
diff --git a/Main/System/Guild/GuildBossWin.cs b/Main/System/Guild/GuildBossWin.cs
index f1388b5..4e155d7 100644
--- a/Main/System/Guild/GuildBossWin.cs
+++ b/Main/System/Guild/GuildBossWin.cs
@@ -142,7 +142,7 @@
         fightPowerText.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower);
         headCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                         PlayerDatas.Instance.baseData.face,
-                                                        PlayerDatas.Instance.baseData.facePic));
+                                                        PlayerDatas.Instance.baseData.facePic)).Forget();
 
         nameText.text = PlayerDatas.Instance.baseData.PlayerName;
         BossHurtEvent();
diff --git a/Main/System/Guild/GuildDonateDetailCell.cs b/Main/System/Guild/GuildDonateDetailCell.cs
index bb1e656..d3b2e6a 100644
--- a/Main/System/Guild/GuildDonateDetailCell.cs
+++ b/Main/System/Guild/GuildDonateDetailCell.cs
@@ -25,7 +25,7 @@
         var playerInfo = PlayerDatas.Instance.fairyData.GetMember(playerID);
         nameText.text = playerInfo.Name;
 
-        avatarCell.InitUI(AvatarHelper.GetAvatarModel(0, playerInfo.Face, playerInfo.FacePic));
+        avatarCell.InitUI(AvatarHelper.GetAvatarModel(0, playerInfo.Face, playerInfo.FacePic)).Forget();
         titleCell.InitUI(playerInfo.RealmLV, playerInfo.TitleID).Forget();
         lvText.text = playerInfo.LV.ToString();
 
diff --git a/Main/System/Guild/GuildMemberCell.cs b/Main/System/Guild/GuildMemberCell.cs
index 3497466..45c7df1 100644
--- a/Main/System/Guild/GuildMemberCell.cs
+++ b/Main/System/Guild/GuildMemberCell.cs
@@ -32,7 +32,7 @@
         var playerInfo = PlayerDatas.Instance.fairyData.GetMember(playerID);
         nameText.text = playerInfo.Name;
 
-        avatarCell.InitUI(AvatarHelper.GetAvatarModel(0, playerInfo.Face, playerInfo.FacePic));
+        avatarCell.InitUI(AvatarHelper.GetAvatarModel(0, playerInfo.Face, playerInfo.FacePic)).Forget();
         titleCell.InitUI(playerInfo.RealmLV, playerInfo.TitleID).Forget();
         lvText.text = playerInfo.LV.ToString();
         if (playerInfo.FmLV > 0)
diff --git a/Main/System/Guild/GuildPreviewWin.cs b/Main/System/Guild/GuildPreviewWin.cs
index e302c71..8a30fe6 100644
--- a/Main/System/Guild/GuildPreviewWin.cs
+++ b/Main/System/Guild/GuildPreviewWin.cs
@@ -133,7 +133,7 @@
         }
         var leaderInfo = OtherPlayerDetailManager.Instance.GetViewPlayerData(playerID);
 
-        leaderAvatar.InitUI(AvatarHelper.GetAvatarModel(0, leaderInfo.Face, leaderInfo.FacePic));
+        leaderAvatar.InitUI(AvatarHelper.GetAvatarModel(0, leaderInfo.Face, leaderInfo.FacePic)).Forget();
         leaderTitle.InitUI(leaderInfo.RealmLV, leaderInfo.TitleID).Forget();
         leaderLevelText.text = leaderInfo.LV.ToString();
         guildJobText.text = RichTextMsgReplaceConfig.GetRichReplace("FAMILY", 3);
diff --git a/Main/System/HappyXB/HappyXBModel.cs b/Main/System/HappyXB/HappyXBModel.cs
index 54596ec..ab761be 100644
--- a/Main/System/HappyXB/HappyXBModel.cs
+++ b/Main/System/HappyXB/HappyXBModel.cs
@@ -199,7 +199,7 @@
         {
             if (!UIManager.Instance.IsOpened<HeroReturnCallResultWin>())
             {
-                UIManager.Instance.OpenWindow<HeroReturnCallResultWin>();
+                UIManager.Instance.OpenWindowAsync<HeroReturnCallResultWin>().Forget();
             }
         }
     }
diff --git a/Main/System/HappyXB/HeroCallHopeSelectCell.cs b/Main/System/HappyXB/HeroCallHopeSelectCell.cs
index 5b04c03..385e362 100644
--- a/Main/System/HappyXB/HeroCallHopeSelectCell.cs
+++ b/Main/System/HappyXB/HeroCallHopeSelectCell.cs
@@ -1,6 +1,7 @@
 using UnityEngine;
 using UnityEngine.Events;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 
 public class HeroCallHopeSelectCell : MonoBehaviour
@@ -71,7 +72,7 @@
                 }
             }
             HappyXBModel.Instance.OnSelectWishHeroEvent?.Invoke();
-        });
+        }).Forget();
     }
 
 }
diff --git a/Main/System/Hero/UIHeroController.cs b/Main/System/Hero/UIHeroController.cs
index bd23c5b..8b2c15b 100644
--- a/Main/System/Hero/UIHeroController.cs
+++ b/Main/System/Hero/UIHeroController.cs
@@ -1,4 +1,4 @@
-
+锘�
 using System;
 using Spine;
 using Spine.Unity;
@@ -26,14 +26,13 @@
 	private static int lastInitFrame = -1; // 涓婁竴娆℃墽琛孖nitialize鐨勫抚鍙凤紝鐢ㄤ簬纭繚姣忓抚鏈�澶�1娆�
 	private static GameObjectPoolManager.GameObjectPool cachedUIHeroPool; // 缂撳瓨UIHero棰勫埗浣撴睜
 	private RectTransform _instanceRect; // 缂撳瓨RectTransform閬垮厤閲嶅GetComponent
-
 	public Action onComplete;
+#pragma warning disable CS1998 // 寮傛鏂规硶鍐呴儴閫氳繃 DelayedInitializeAsync 寮傛鎵ц锛屾棤闇�鐩存帴 await
 	public async UniTask Create(int _skinID, float scale = 0.8f, Action _onComplete = null, string motionName = "idle", bool isLh = false)
 	{
 		if (skinID == _skinID)
 		{
 			//閬垮厤閲嶅鍒涘缓
-
 			if (skeletonGraphic != null)
 			{
 				SetMaterialNone();
@@ -114,6 +113,7 @@
 		// 浣跨敤 UniTask 杩涜寮傛鍒濆鍖栵紝灏唅nstanceGO鍒涘缓鍜岃祫婧愬姞杞介兘绉诲埌寮傛澶勭悊
 		DelayedInitializeAsync(skinConfig, motionName, isLh, loadCancellationToken.Token).Forget();
 	}
+#pragma warning restore CS1998
 
 	/// <summary>
 	/// 鍙栨秷涔嬪墠鐨勫姞杞戒换鍔�
@@ -501,7 +501,6 @@
 	private async UniTaskVoid DelayedInitializeAsync(HeroSkinConfig skinConfig, string motionName, bool isLh, System.Threading.CancellationToken cancellationToken)
 	{
 		isInitializing = true;
-
 		try
 		{
 			// 妫�鏌ユ槸鍚﹀凡琚彇娑�
@@ -509,10 +508,8 @@
 
 			// 鑾峰彇鍔犺浇淇″彿閲� - 闄愬埗骞跺彂鏁帮紝閬垮厤璧勬簮绔炰簤
 			await AcquireLoadSlotAsync(cancellationToken);
-
 			// 寮傛鍒涘缓instanceGO鍜屽姞杞借祫婧愶紙鐪熸鐨勫紓姝ワ紝涓嶉樆濉烇級
 			await CreateInstanceAndLoadAssetsAsync(skinConfig, isLh, cancellationToken);
-
 			// 鍐嶆妫�鏌ユ槸鍚﹀凡琚彇娑�
 			cancellationToken.ThrowIfCancellationRequested();
 
diff --git a/Main/System/HeroDebut/HeroDebutCallChangeItem.cs b/Main/System/HeroDebut/HeroDebutCallChangeItem.cs
index 476c3a9..da85b50 100644
--- a/Main/System/HeroDebut/HeroDebutCallChangeItem.cs
+++ b/Main/System/HeroDebut/HeroDebutCallChangeItem.cs
@@ -1,3 +1,4 @@
+using Cysharp.Threading.Tasks;
 using UnityEngine;
 using UnityEngine.UI;
 
@@ -24,7 +25,7 @@
         var heroSkinConfig = HeroSkinConfig.Get(skinID);
         if (heroSkinConfig == null) return;
 
-        heroHeadBaseCell.Init(heroConfig.HeroID, skinID, 0, 0, 0, OnClick);
+        heroHeadBaseCell.Init(heroConfig.HeroID, skinID, 0, 0, 0, OnClick).Forget();
         nameText.text = heroConfig.Name;
         jobImg.SetSprite(HeroUIManager.Instance.GetJobIconName(heroConfig.Class));
         bool isChoose = manager.nowCallChooseHeroID == heroId;
diff --git a/Main/System/HeroDebut/HeroDebutCallRateHeroCell.cs b/Main/System/HeroDebut/HeroDebutCallRateHeroCell.cs
index 4eed23d..0cb88d9 100644
--- a/Main/System/HeroDebut/HeroDebutCallRateHeroCell.cs
+++ b/Main/System/HeroDebut/HeroDebutCallRateHeroCell.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using UnityEngine;
 
 public class HeroDebutCallRateHeroCell : CellView
@@ -17,7 +17,7 @@
             {
                 itemCells[i].SetActive(true);
                 itemCells[i].Init(new ItemCellModel(dataList[dataIndex].id, true, dataList[dataIndex].countEx));
-                itemCells[i].button.SetListener(() => ItemTipUtility.Show(dataList[dataIndex].id));
+                itemCells[i].SetClickListener(() => ItemTipUtility.Show(dataList[dataIndex].id));
             }
             else
             {
diff --git a/Main/System/HeroDebut/HeroDebutCallRateItem.cs b/Main/System/HeroDebut/HeroDebutCallRateItem.cs
index 9c81931..e62992b 100644
--- a/Main/System/HeroDebut/HeroDebutCallRateItem.cs
+++ b/Main/System/HeroDebut/HeroDebutCallRateItem.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using Cysharp.Threading.Tasks;
 using UnityEngine;
 using UnityEngine.UI;
@@ -36,7 +36,7 @@
             itemCell.SetActive(true);
             itemCell.Init(new ItemCellModel(itemInfo[0], true, itemInfo[1]));
             SetCountActive(itemCell, itemInfo[1]);
-            itemCell.button.SetListener(() => ItemTipUtility.Show(itemInfo[0]));
+            itemCell.SetClickListener(() => ItemTipUtility.Show(itemInfo[0]));
             return;
         }
 
@@ -53,7 +53,7 @@
             itemCell.SetActive(true);
             itemCell.Init(new ItemCellModel(itemID, true, itemCount));
             SetCountActive(itemCell, itemCount);
-            itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+            itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
         }
         else
         {
diff --git a/Main/System/HeroDebut/HeroDebutCallResultCell.cs b/Main/System/HeroDebut/HeroDebutCallResultCell.cs
index a379afc..9032901 100644
--- a/Main/System/HeroDebut/HeroDebutCallResultCell.cs
+++ b/Main/System/HeroDebut/HeroDebutCallResultCell.cs
@@ -1,4 +1,4 @@
-using UnityEngine;
+锘縰sing UnityEngine;
 using DG.Tweening;
 
 public class HeroDebutCallResultCell : MonoBehaviour
@@ -23,7 +23,7 @@
     public void DisplayItemCell(int itemID, int count)
     {
         itemCell.Init(new ItemCellModel(itemID, true, count));
-        itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+        itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
     }
 
     /// <summary>
diff --git a/Main/System/HeroDebut/HeroDebutCallResultWin.cs b/Main/System/HeroDebut/HeroDebutCallResultWin.cs
index 5306fcf..9b0af7e 100644
--- a/Main/System/HeroDebut/HeroDebutCallResultWin.cs
+++ b/Main/System/HeroDebut/HeroDebutCallResultWin.cs
@@ -1,4 +1,4 @@
-using UnityEngine;
+锘縰sing UnityEngine;
 using DG.Tweening;
 using System.Collections.Generic;
 using Cysharp.Threading.Tasks;
@@ -76,7 +76,7 @@
         int itemId = xbManager.addXBAddItemID;
         long count = xbManager.addXBItemCount;
         presentItemCell.Init(new ItemCellModel(itemId, true, count));
-        presentItemCell.button.SetListener(() => ItemTipUtility.Show(itemId));
+        presentItemCell.SetClickListener(() => ItemTipUtility.Show(itemId));
 
         // 鏍规嵁鍗曟娊鎴栧崄杩炲~鍏呯墿鍝佹暟鎹�
         if (isOne)
diff --git a/Main/System/HeroDebut/HeroDebutRankAwardCell.cs b/Main/System/HeroDebut/HeroDebutRankAwardCell.cs
index 0de8a09..37038d0 100644
--- a/Main/System/HeroDebut/HeroDebutRankAwardCell.cs
+++ b/Main/System/HeroDebut/HeroDebutRankAwardCell.cs
@@ -1,4 +1,4 @@
-using UnityEngine;
+锘縰sing UnityEngine;
 
 public class HeroDebutRankAwardCell : CellView
 {
@@ -34,7 +34,7 @@
                 int itemCellIndex = i;
                 itemCell.SetActive(true);
                 itemCell.Init(new ItemCellModel(rewardArr[i][0], true, rewardArr[i][1]));
-                itemCell.button.SetListener(() => ItemTipUtility.Show(rewardArr[itemCellIndex][0], true));
+                itemCell.SetClickListener(() => ItemTipUtility.Show(rewardArr[itemCellIndex][0], true));
             }
             else
             {
diff --git a/Main/System/HeroDebut/HeroDebutRankCell.cs b/Main/System/HeroDebut/HeroDebutRankCell.cs
index c488590..5d4922b 100644
--- a/Main/System/HeroDebut/HeroDebutRankCell.cs
+++ b/Main/System/HeroDebut/HeroDebutRankCell.cs
@@ -38,7 +38,7 @@
                 //鍙栫帺瀹惰嚜宸辩殑鏁版嵁
                 avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                 PlayerDatas.Instance.baseData.face,
-                                                PlayerDatas.Instance.baseData.facePic));
+                                                PlayerDatas.Instance.baseData.facePic)).Forget();
                 rankText.text = Language.Get("L1045");
                 rankValueText.text = awardConfig == null || awardConfig.NeedValue == 0 ? "0" : Language.Get("HeroDebut27", awardConfig.NeedValue);
                 nameText.text = PlayerDatas.Instance.baseData.PlayerName;
@@ -59,7 +59,7 @@
             officialTitleCell.SetActive(true);
             officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2).Forget();
             avatarCell.SetActive(true);
-            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
+            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4)).Forget();
             viewPlayerId = (int)rankData.id;
             nameText.text = rankData.name1;
             rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue));
diff --git a/Main/System/HeroFates/HeroFatesCell.cs b/Main/System/HeroFates/HeroFatesCell.cs
index 6522970..19c6b61 100644
--- a/Main/System/HeroFates/HeroFatesCell.cs
+++ b/Main/System/HeroFates/HeroFatesCell.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
 using Cysharp.Threading.Tasks;
@@ -164,7 +164,7 @@
                 int itemID = config.AwardItemList[i][0];
                 int count = config.AwardItemList[i][1];
                 items[i].Init(new ItemCellModel(itemID, false, count));
-                items[i].button.SetListener(() => ItemTipUtility.Show(itemID));
+                items[i].SetClickListener(() => ItemTipUtility.Show(itemID));
                 items[i].SetActive(true);
             }
             else
diff --git a/Main/System/HeroReturn/HeroReturnCallChangeItem.cs b/Main/System/HeroReturn/HeroReturnCallChangeItem.cs
index 445c6e4..dbf302d 100644
--- a/Main/System/HeroReturn/HeroReturnCallChangeItem.cs
+++ b/Main/System/HeroReturn/HeroReturnCallChangeItem.cs
@@ -1,5 +1,6 @@
 using UnityEngine;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnCallChangeItem : MonoBehaviour
 {
@@ -24,7 +25,7 @@
         var heroSkinConfig = HeroSkinConfig.Get(skinID);
         if (heroSkinConfig == null) return;
 
-        heroHeadBaseCell.Init(heroConfig.HeroID, skinID, 0, 0, 0, OnClick);
+        heroHeadBaseCell.Init(heroConfig.HeroID, skinID, 0, 0, 0, OnClick).Forget();
         nameText.text = heroConfig.Name;
         jobImg.SetSprite(HeroUIManager.Instance.GetJobIconName(heroConfig.Class));
         bool isChoose = manager.nowCallChooseHeroID == heroId;
diff --git a/Main/System/HeroReturn/HeroReturnCallChangeWin.cs b/Main/System/HeroReturn/HeroReturnCallChangeWin.cs
index 0785f57..ef83358 100644
--- a/Main/System/HeroReturn/HeroReturnCallChangeWin.cs
+++ b/Main/System/HeroReturn/HeroReturnCallChangeWin.cs
@@ -1,4 +1,5 @@
 using UnityEngine;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnCallChangeWin : UIBase
 {
@@ -33,7 +34,7 @@
         previewButton.SetListener(() =>
         {
             HeroUIManager.Instance.selectForPreviewHeroID = manager.nowCallChooseHeroID;
-            UIManager.Instance.OpenWindow<HeroBestBaseWin>();
+            UIManager.Instance.OpenWindowAsync<HeroBestBaseWin>().Forget();
         });
     }
 
@@ -95,6 +96,6 @@
         var skinConfig = HeroSkinConfig.Get(skinID);
         if (skinConfig == null) return;
 
-        uiHeroController.Create(skinID, 1);
+        uiHeroController.Create(skinID, 1).Forget();
     }
 }
diff --git a/Main/System/HeroReturn/HeroReturnCallChooseItem.cs b/Main/System/HeroReturn/HeroReturnCallChooseItem.cs
index f7fc4bd..fdb5415 100644
--- a/Main/System/HeroReturn/HeroReturnCallChooseItem.cs
+++ b/Main/System/HeroReturn/HeroReturnCallChooseItem.cs
@@ -1,5 +1,6 @@
 using UnityEngine;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnCallChooseItem : MonoBehaviour
 {
@@ -24,7 +25,7 @@
         var heroSkinConfig = HeroSkinConfig.Get(skinID);
         if (heroSkinConfig == null) return;
 
-        heroHeadBaseCell.Init(heroConfig.HeroID, skinID, 0, 0, 0, OnClick);
+        heroHeadBaseCell.Init(heroConfig.HeroID, skinID, 0, 0, 0, OnClick).Forget();
         nameText.text = heroConfig.Name;
         jobImg.SetSprite(HeroUIManager.Instance.GetJobIconName(heroConfig.Class));
         bool isChoose = manager.nowCallChooseHeroID == heroId;
diff --git a/Main/System/HeroReturn/HeroReturnCallChooseWin.cs b/Main/System/HeroReturn/HeroReturnCallChooseWin.cs
index 1a9b81d..ddde0ae 100644
--- a/Main/System/HeroReturn/HeroReturnCallChooseWin.cs
+++ b/Main/System/HeroReturn/HeroReturnCallChooseWin.cs
@@ -1,4 +1,5 @@
 using UnityEngine;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnCallChooseWin : UIBase
 {
@@ -28,7 +29,7 @@
         previewButton.SetListener(() =>
         {
             HeroUIManager.Instance.selectForPreviewHeroID = manager.nowCallChooseHeroID;
-            UIManager.Instance.OpenWindow<HeroBestBaseWin>();
+            UIManager.Instance.OpenWindowAsync<HeroBestBaseWin>().Forget();
         });
     }
 
@@ -90,6 +91,6 @@
         var skinConfig = HeroSkinConfig.Get(skinID);
         if (skinConfig == null) return;
 
-        uiHeroController.Create(skinID, 1);
+        uiHeroController.Create(skinID, 1).Forget();
     }
 }
diff --git a/Main/System/HeroReturn/HeroReturnCallRateHeroCell.cs b/Main/System/HeroReturn/HeroReturnCallRateHeroCell.cs
index f6052a4..c8b482b 100644
--- a/Main/System/HeroReturn/HeroReturnCallRateHeroCell.cs
+++ b/Main/System/HeroReturn/HeroReturnCallRateHeroCell.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using UnityEngine;
 
 public class HeroReturnCallRateHeroCell : CellView
@@ -17,7 +17,7 @@
             {
                 itemCells[i].SetActive(true);
                 itemCells[i].Init(new ItemCellModel(dataList[dataIndex].id, true, dataList[dataIndex].countEx));
-                itemCells[i].button.SetListener(() => ItemTipUtility.Show(dataList[dataIndex].id));
+                itemCells[i].SetClickListener(() => ItemTipUtility.Show(dataList[dataIndex].id));
             }
             else
             {
diff --git a/Main/System/HeroReturn/HeroReturnCallRateItem.cs b/Main/System/HeroReturn/HeroReturnCallRateItem.cs
index c03223b..1b2a0ad 100644
--- a/Main/System/HeroReturn/HeroReturnCallRateItem.cs
+++ b/Main/System/HeroReturn/HeroReturnCallRateItem.cs
@@ -1,6 +1,7 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnCallRateItem : MonoBehaviour
 {
@@ -35,7 +36,7 @@
             itemCell.SetActive(true);
             itemCell.Init(new ItemCellModel(itemInfo[0], true, itemInfo[1]));
             SetCountActive(itemCell, itemInfo[1]);
-            itemCell.button.SetListener(() => ItemTipUtility.Show(itemInfo[0]));
+            itemCell.SetClickListener(() => ItemTipUtility.Show(itemInfo[0]));
             return;
         }
 
@@ -52,7 +53,7 @@
             itemCell.SetActive(true);
             itemCell.Init(new ItemCellModel(itemID, true, itemCount));
             SetCountActive(itemCell, itemCount);
-            itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+            itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
         }
         else
         {
@@ -62,7 +63,7 @@
                 HeroReturnCallRateHeroWin.worldPos = libButton.transform.position;
                 HeroReturnCallRateHeroWin.dataList = GetLibItemList(libID, list);
                 HeroReturnCallRateHeroWin.isDownShow = true;
-                UIManager.Instance.OpenWindow<HeroReturnCallRateHeroWin>();
+                UIManager.Instance.OpenWindowAsync<HeroReturnCallRateHeroWin>().Forget();
             });
         }
     }
diff --git a/Main/System/HeroReturn/HeroReturnCallResultCell.cs b/Main/System/HeroReturn/HeroReturnCallResultCell.cs
index d1b00cb..f9e2c80 100644
--- a/Main/System/HeroReturn/HeroReturnCallResultCell.cs
+++ b/Main/System/HeroReturn/HeroReturnCallResultCell.cs
@@ -1,4 +1,4 @@
-using UnityEngine;
+锘縰sing UnityEngine;
 using DG.Tweening;
 
 public class HeroReturnCallResultCell : MonoBehaviour
@@ -23,7 +23,7 @@
     public void DisplayItemCell(int itemID, int count)
     {
         itemCell.Init(new ItemCellModel(itemID, true, count));
-        itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+        itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
     }
 
     /// <summary>
diff --git a/Main/System/HeroReturn/HeroReturnCallResultWin.cs b/Main/System/HeroReturn/HeroReturnCallResultWin.cs
index 994a845..b855ec7 100644
--- a/Main/System/HeroReturn/HeroReturnCallResultWin.cs
+++ b/Main/System/HeroReturn/HeroReturnCallResultWin.cs
@@ -1,6 +1,7 @@
-using UnityEngine;
+锘縰sing UnityEngine;
 using DG.Tweening;
 using System.Collections.Generic;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnCallResultWin : UIBase
 {
@@ -75,7 +76,7 @@
         int itemId = xbManager.addXBAddItemID;
         long count = xbManager.addXBItemCount;
         presentItemCell.Init(new ItemCellModel(itemId, true, count));
-        presentItemCell.button.SetListener(() => ItemTipUtility.Show(itemId));
+        presentItemCell.SetClickListener(() => ItemTipUtility.Show(itemId));
 
         // 鏍规嵁鍗曟娊鎴栧崄杩炲~鍏呯墿鍝佹暟鎹�
         if (isOne)
@@ -335,7 +336,7 @@
 
             if (!UIManager.Instance.IsOpenedInList<HeroShowLHWin>())
             {
-                UIManager.Instance.OpenWindow<HeroShowLHWin>();
+                UIManager.Instance.OpenWindowAsync<HeroShowLHWin>().Forget();
             }
         }
     }
diff --git a/Main/System/HeroReturn/HeroReturnCallWin.cs b/Main/System/HeroReturn/HeroReturnCallWin.cs
index 5723eac..84a866e 100644
--- a/Main/System/HeroReturn/HeroReturnCallWin.cs
+++ b/Main/System/HeroReturn/HeroReturnCallWin.cs
@@ -3,6 +3,7 @@
 using UnityEngine.UI;
 using DG.Tweening;
 using System.Linq;
+using Cysharp.Threading.Tasks;
 using EnhancedUI.EnhancedScroller;
 
 public class HeroReturnCallWin : UIBase
@@ -61,13 +62,13 @@
     protected override void InitComponent()
     {
         closeButton.SetListener(CloseWindow);
-        shopButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnShopWin>());
-        giftButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnGiftWin>());
-        changeHeroButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnCallChangeWin>());
-        rankButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnRankWin>());
-        rateButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnCallRateWin>());
-        historyButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnCallHistoryWin>());
-        chooseHeroButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnCallChooseWin>());
+        shopButton.SetListener(() => UIManager.Instance.OpenWindowAsync<HeroReturnShopWin>().Forget());
+        giftButton.SetListener(() => UIManager.Instance.OpenWindowAsync<HeroReturnGiftWin>().Forget());
+        changeHeroButton.SetListener(() => UIManager.Instance.OpenWindowAsync<HeroReturnCallChangeWin>().Forget());
+        rankButton.SetListener(() => UIManager.Instance.OpenWindowAsync<HeroReturnRankWin>().Forget());
+        rateButton.SetListener(() => UIManager.Instance.OpenWindowAsync<HeroReturnCallRateWin>().Forget());
+        historyButton.SetListener(() => UIManager.Instance.OpenWindowAsync<HeroReturnCallHistoryWin>().Forget());
+        chooseHeroButton.SetListener(() => UIManager.Instance.OpenWindowAsync<HeroReturnCallChooseWin>().Forget());
         previewButton.SetListener(OnClickPreview);
         skipToggle.AddListener((value) =>
         {
@@ -218,7 +219,7 @@
     {
         if (heroConfig == null) return;
         HeroUIManager.Instance.selectForPreviewHeroID = heroConfig.HeroID;
-        UIManager.Instance.OpenWindow<HeroBestBaseWin>();
+        UIManager.Instance.OpenWindowAsync<HeroBestBaseWin>().Forget();
     }
     OperationHeroAppearInfo act;
     ActHeroAppearConfig config;
@@ -264,8 +265,8 @@
 
         bgImage.SetSprite(StringUtility.Concat("HeroReturnCallBG_", heroID.ToString()));
 
-        lhController.Create(skinID, 1, motionName: "", isLh: true);
-        uiHeroController.Create(skinID, modleSize);
+        lhController.Create(skinID, 1, motionName: "", isLh: true).Forget();
+        uiHeroController.Create(skinID, modleSize).Forget();
         uiHeroController.transform.localScale = new Vector3(modleSize, modleSize, modleSize);
 
         ownItemCell.itemID = treasureSetConfig.CostItemID;
diff --git a/Main/System/HeroReturn/HeroReturnCell.cs b/Main/System/HeroReturn/HeroReturnCell.cs
index 2489218..a98a919 100644
--- a/Main/System/HeroReturn/HeroReturnCell.cs
+++ b/Main/System/HeroReturn/HeroReturnCell.cs
@@ -1,4 +1,5 @@
 using UnityEngine;
+using Cysharp.Threading.Tasks;
 public class HeroReturnCell : MonoBehaviour
 {
     [SerializeField] ButtonEx clickButton;
@@ -10,7 +11,7 @@
     {
         clickButton.SetListener(() =>
         {
-            UIManager.Instance.OpenWindow<HeroReturnWin>();
+            UIManager.Instance.OpenWindowAsync<HeroReturnWin>().Forget();
         });
 
         int heroID = manager.GetFirstHeroId();
diff --git a/Main/System/HeroReturn/HeroReturnCheckInWin.cs b/Main/System/HeroReturn/HeroReturnCheckInWin.cs
index a446e04..357fb90 100644
--- a/Main/System/HeroReturn/HeroReturnCheckInWin.cs
+++ b/Main/System/HeroReturn/HeroReturnCheckInWin.cs
@@ -1,4 +1,5 @@
 using UnityEngine;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnCheckInWin : UIBase
 {
@@ -74,7 +75,7 @@
             }
         }
 
-        rolelhShow.Create(skinID, 1, motionName: "", isLh: true);
+        rolelhShow.Create(skinID, 1, motionName: "", isLh: true).Forget();
         OnSecondEvent();
     }
 }
\ No newline at end of file
diff --git a/Main/System/HeroReturn/HeroReturnGiftCell.cs b/Main/System/HeroReturn/HeroReturnGiftCell.cs
index bd1fc9a..802a5e6 100644
--- a/Main/System/HeroReturn/HeroReturnGiftCell.cs
+++ b/Main/System/HeroReturn/HeroReturnGiftCell.cs
@@ -1,5 +1,6 @@
 using System.Collections.Generic;
 using UnityEngine;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnGiftCell : MonoBehaviour
 {
@@ -78,13 +79,13 @@
             if (config.VipLevel == 1 && !InvestModel.Instance.IsInvested(InvestModel.monthCardType))
             {
                 SysNotifyMgr.Instance.ShowTip("MinggeAuto5");
-                UIManager.Instance.OpenWindow<PrivilegeCardWin>();
+                UIManager.Instance.OpenWindowAsync<PrivilegeCardWin>().Forget();
                 return;
             }
             if (config.VipLevel == 2 && !InvestModel.Instance.IsInvested(InvestModel.foreverCardType))
             {
                 SysNotifyMgr.Instance.ShowTip("MinggeAuto7");
-                UIManager.Instance.OpenWindow<PrivilegeCardWin>();
+                UIManager.Instance.OpenWindowAsync<PrivilegeCardWin>().Forget();
                 return;
             }
             RechargeManager.Instance.CTG(ctgId);
diff --git a/Main/System/HeroReturn/HeroReturnManager.cs b/Main/System/HeroReturn/HeroReturnManager.cs
index 3aed945..7c53bb7 100644
--- a/Main/System/HeroReturn/HeroReturnManager.cs
+++ b/Main/System/HeroReturn/HeroReturnManager.cs
@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using Cysharp.Threading.Tasks;
 using LitJson;
 using UnityEngine;
 
@@ -161,14 +162,7 @@
 
     public void SetHeroSquareIcon(ImageEx image, string name)
     {
-        var sprite = UILoader.LoadSprite("HeroHead", name);
-        if (sprite != null)
-        {
-            image.overrideSprite = sprite;
-            return;
-        }
-
-        image.SetSprite("herohead_default");
+        UILoader.LoadSprite("HeroHead", name, image, "herohead_default").Forget();
     }
 
     public void GetActTimeStr(TextEx timeText, string key = "TimeRush05")
diff --git a/Main/System/HeroReturn/HeroReturnPopWin.cs b/Main/System/HeroReturn/HeroReturnPopWin.cs
index 95bb254..0725b49 100644
--- a/Main/System/HeroReturn/HeroReturnPopWin.cs
+++ b/Main/System/HeroReturn/HeroReturnPopWin.cs
@@ -1,5 +1,6 @@
 using UnityEngine;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnPopWin : UIBase
 {
@@ -24,7 +25,7 @@
         {
             UIManager.Instance.CloseWindow<HeroReturnPopWin>();
             if (!UIManager.Instance.IsOpened<HeroReturnWin>())
-                UIManager.Instance.OpenWindow<HeroReturnWin>();
+                UIManager.Instance.OpenWindowAsync<HeroReturnWin>().Forget();
         });
         todayPopToggle.AddListener((bool value) =>
         {
@@ -89,7 +90,7 @@
         infoText.text = artConfig.PopInfoText;
         infoText.color = manager.ParseColor32(artConfig.PopInfoColor);
 
-        rolelhShow.Create(skinID, 1, motionName: "", isLh: true);
+        rolelhShow.Create(skinID, 1, motionName: "", isLh: true).Forget();
 
         OnSecondEvent();
     }
diff --git a/Main/System/HeroReturn/HeroReturnRankAwardCell.cs b/Main/System/HeroReturn/HeroReturnRankAwardCell.cs
index 493ad95..6518dbd 100644
--- a/Main/System/HeroReturn/HeroReturnRankAwardCell.cs
+++ b/Main/System/HeroReturn/HeroReturnRankAwardCell.cs
@@ -1,4 +1,4 @@
-using UnityEngine;
+锘縰sing UnityEngine;
 
 public class HeroReturnRankAwardCell : CellView
 {
@@ -34,7 +34,7 @@
                 int itemCellIndex = i;
                 itemCell.SetActive(true);
                 itemCell.Init(new ItemCellModel(rewardArr[i][0], true, rewardArr[i][1]));
-                itemCell.button.SetListener(() => ItemTipUtility.Show(rewardArr[itemCellIndex][0], true));
+                itemCell.SetClickListener(() => ItemTipUtility.Show(rewardArr[itemCellIndex][0], true));
             }
             else
             {
diff --git a/Main/System/HeroReturn/HeroReturnRankCell.cs b/Main/System/HeroReturn/HeroReturnRankCell.cs
index 2b748bb..8d6cfb0 100644
--- a/Main/System/HeroReturn/HeroReturnRankCell.cs
+++ b/Main/System/HeroReturn/HeroReturnRankCell.cs
@@ -1,5 +1,6 @@
 using UnityEngine;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnRankCell : MonoBehaviour
 {
@@ -37,11 +38,11 @@
                 //鍙栫帺瀹惰嚜宸辩殑鏁版嵁
                 avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                 PlayerDatas.Instance.baseData.face,
-                                                PlayerDatas.Instance.baseData.facePic));
+                                                PlayerDatas.Instance.baseData.facePic)).Forget();
                 rankText.text = Language.Get("L1045");
                 rankValueText.text = awardConfig == null || awardConfig.NeedValue == 0 ? "0" : Language.Get("HeroDebut27", awardConfig.NeedValue);
                 nameText.text = PlayerDatas.Instance.baseData.PlayerName;
-                officialTitleCell.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID);
+                officialTitleCell.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID).Forget();
                 return;
             }
             rank = rankData.rank;
@@ -56,9 +57,9 @@
         else
         {
             officialTitleCell.SetActive(true);
-            officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
+            officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2).Forget();
             avatarCell.SetActive(true);
-            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
+            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4)).Forget();
             viewPlayerId = (int)rankData.id;
             nameText.text = rankData.name1;
             rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue));
diff --git a/Main/System/HeroReturn/HeroReturnRankTop3Cell.cs b/Main/System/HeroReturn/HeroReturnRankTop3Cell.cs
index 4ec37af..de4488a 100644
--- a/Main/System/HeroReturn/HeroReturnRankTop3Cell.cs
+++ b/Main/System/HeroReturn/HeroReturnRankTop3Cell.cs
@@ -1,5 +1,6 @@
 using UnityEngine;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnRankTop3Cell : MonoBehaviour
 {
@@ -34,9 +35,9 @@
         officialTitleCell.SetActive(true);
         rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue));
         nameText.text = rankData.name1;
-        officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
+        officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2).Forget();
         model.SetActive(true);
-        model.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID((int)rankData.value6), (int)rankData.value5, rank == 1 ? 1f : 0.8f);
+        model.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID((int)rankData.value6), (int)rankData.value5, rank == 1 ? 1f : 0.8f).Forget();
         queryPlayerBtn.SetListener(() =>
         {
             AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id);
diff --git a/Main/System/HeroReturn/HeroReturnShopCell.cs b/Main/System/HeroReturn/HeroReturnShopCell.cs
index 1dcedfb..20a52ee 100644
--- a/Main/System/HeroReturn/HeroReturnShopCell.cs
+++ b/Main/System/HeroReturn/HeroReturnShopCell.cs
@@ -1,5 +1,6 @@
 锘縰sing UnityEngine;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnShopCell : MonoBehaviour
 {
@@ -128,7 +129,7 @@
         else
         {
             StoreModel.Instance.buyShopID = shopID;
-            UIManager.Instance.OpenWindow<BuyItemWin>();
+            UIManager.Instance.OpenWindowAsync<BuyItemWin>().Forget();
         }
     }
 }
diff --git a/Main/System/HeroReturn/HeroReturnSkinWin.cs b/Main/System/HeroReturn/HeroReturnSkinWin.cs
index aef3ab3..48a014b 100644
--- a/Main/System/HeroReturn/HeroReturnSkinWin.cs
+++ b/Main/System/HeroReturn/HeroReturnSkinWin.cs
@@ -1,6 +1,7 @@
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnSkinWin : UIBase
 {
@@ -32,7 +33,7 @@
             int heroID = manager.GetHeroIDBySkinID(manager.currentChooseSkinID);
             HeroUIManager.Instance.selectForPreviewHeroID = heroID;
             HeroUIManager.Instance.selectSkinIndex = manager.GetSkinIndexInHeroConfig(heroID, manager.currentChooseSkinID);
-            UIManager.Instance.OpenWindow<HeroBestBaseWin>(1);
+            UIManager.Instance.OpenWindowAsync<HeroBestBaseWin>(1).Forget();
         });
     }
 
@@ -177,8 +178,8 @@
         awardBgImage.SetSprite(StringUtility.Concat("HeroReturnSkinAwardBG_", skinID.ToString()));
         awardBgImage.SetNativeSize();
 
-        uiHeroController.Create(skinID, modelScale);
-        lhController.Create(skinID, 1, motionName: "", isLh: true);
+        uiHeroController.Create(skinID, modelScale).Forget();
+        lhController.Create(skinID, 1, motionName: "", isLh: true).Forget();
         countryImage.SetSprite(HeroUIManager.Instance.GetCountryIconName(heroConfig.Country));
         OnSecondEvent();
 
diff --git a/Main/System/HeroReturn/HeroReturnStarUpChangeItem.cs b/Main/System/HeroReturn/HeroReturnStarUpChangeItem.cs
index d5d9a2a..ec18bd2 100644
--- a/Main/System/HeroReturn/HeroReturnStarUpChangeItem.cs
+++ b/Main/System/HeroReturn/HeroReturnStarUpChangeItem.cs
@@ -1,5 +1,6 @@
 using UnityEngine;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnStarUpChangeItem : MonoBehaviour
 {
@@ -24,7 +25,7 @@
         var heroSkinConfig = HeroSkinConfig.Get(skinID);
         if (heroSkinConfig == null) return;
 
-        heroHeadBaseCell.Init(heroConfig.HeroID, skinID, 0, 0, 0, OnClick);
+        heroHeadBaseCell.Init(heroConfig.HeroID, skinID, 0, 0, 0, OnClick).Forget();
         nameText.text = heroConfig.Name;
         jobImg.SetSprite(HeroUIManager.Instance.GetJobIconName(heroConfig.Class));
         bool isChoose = manager.nowStarUpChooseHeroID == heroId;
diff --git a/Main/System/HeroReturn/HeroReturnStarUpChangeWin.cs b/Main/System/HeroReturn/HeroReturnStarUpChangeWin.cs
index 664893a..ab82323 100644
--- a/Main/System/HeroReturn/HeroReturnStarUpChangeWin.cs
+++ b/Main/System/HeroReturn/HeroReturnStarUpChangeWin.cs
@@ -1,4 +1,5 @@
 using UnityEngine;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnStarUpChangeWin : UIBase
 {
@@ -29,7 +30,7 @@
         previewButton.SetListener(() =>
         {
             HeroUIManager.Instance.selectForPreviewHeroID = manager.nowStarUpChooseHeroID;
-            UIManager.Instance.OpenWindow<HeroBestBaseWin>();
+            UIManager.Instance.OpenWindowAsync<HeroBestBaseWin>().Forget();
         });
     }
 
@@ -48,7 +49,7 @@
         manager.OnNowStarUpChooseHeroIDChangeEvent -= OnNowStarUpChooseHeroIDChangeEvent;
         if (!UIManager.Instance.IsOpened<HeroReturnStarUpWin>() && manager.LoadStarUpChooseHeroStateKey(manager.GetOperationHeroAppearInfo()))
         {
-            UIManager.Instance.OpenWindow<HeroReturnStarUpWin>();
+            UIManager.Instance.OpenWindowAsync<HeroReturnStarUpWin>().Forget();
         }
     }
 
@@ -95,6 +96,6 @@
         var skinConfig = HeroSkinConfig.Get(skinID);
         if (skinConfig == null) return;
 
-        uiHeroController.Create(skinID, 1);
+        uiHeroController.Create(skinID, 1).Forget();
     }
 }
diff --git a/Main/System/HeroReturn/HeroReturnStarUpWin.cs b/Main/System/HeroReturn/HeroReturnStarUpWin.cs
index 7d345a6..30c92ec 100644
--- a/Main/System/HeroReturn/HeroReturnStarUpWin.cs
+++ b/Main/System/HeroReturn/HeroReturnStarUpWin.cs
@@ -1,4 +1,5 @@
 using UnityEngine;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnStarUpWin : UIBase
 {
@@ -21,18 +22,18 @@
         goCallButton.SetListener(() =>
         {
             UIManager.Instance.CloseWindow<HeroReturnStarUpWin>();
-            UIManager.Instance.OpenWindow<HeroReturnCallWin>();
+            UIManager.Instance.OpenWindowAsync<HeroReturnCallWin>().Forget();
         });
         goInfoButton.SetListener(() =>
         {
             if (heroConfig == null) return;
             UIManager.Instance.CloseWindow<HeroReturnStarUpWin>();
             HeroUIManager.Instance.selectForPreviewHeroID = heroConfig.HeroID;
-            UIManager.Instance.OpenWindow<HeroBestBaseWin>();
+            UIManager.Instance.OpenWindowAsync<HeroBestBaseWin>().Forget();
         });
         changeButton.SetListener(() =>
         {
-            UIManager.Instance.OpenWindow<HeroReturnStarUpChangeWin>();
+            UIManager.Instance.OpenWindowAsync<HeroReturnStarUpChangeWin>().Forget();
         });
         lockButton.SetListener(() =>
         {
@@ -115,8 +116,8 @@
         heroHeadBaseCell.Init(heroConfig.HeroID, skinID, 0, 0, 0, () =>
         {
             if (isLockStarHero) return;
-            UIManager.Instance.OpenWindow<HeroReturnStarUpChangeWin>();
-        });
+            UIManager.Instance.OpenWindowAsync<HeroReturnStarUpChangeWin>().Forget();
+        }).Forget();
         nameText.text = heroConfig.Name;
         jobImg.SetSprite(HeroUIManager.Instance.GetJobIconName(heroConfig.Class));
 
diff --git a/Main/System/HeroReturn/HeroReturnWin.cs b/Main/System/HeroReturn/HeroReturnWin.cs
index 19c9f61..9f46d84 100644
--- a/Main/System/HeroReturn/HeroReturnWin.cs
+++ b/Main/System/HeroReturn/HeroReturnWin.cs
@@ -2,6 +2,7 @@
 using UnityEngine;
 using UnityEngine.UI;
 using DG.Tweening;
+using Cysharp.Threading.Tasks;
 
 public class HeroReturnWin : UIBase
 {
@@ -45,27 +46,27 @@
     protected override void InitComponent()
     {
         closeButton.SetListener(() => UIManager.Instance.CloseWindow<HeroReturnWin>());
-        checkInButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnCheckInWin>());
+        checkInButton.SetListener(() => UIManager.Instance.OpenWindowAsync<HeroReturnCheckInWin>().Forget());
         starUpButton.SetListener(() =>
         {
 
             if (manager.IsLockStarHero(manager.GetOperationHeroAppearInfo()))
             {
-                UIManager.Instance.OpenWindow<HeroReturnStarUpWin>();
+                UIManager.Instance.OpenWindowAsync<HeroReturnStarUpWin>().Forget();
                 return;
             }
 
             if (!manager.LoadStarUpChooseHeroStateKey(manager.GetOperationHeroAppearInfo()))
             {
-                UIManager.Instance.OpenWindow<HeroReturnStarUpChangeWin>();
+                UIManager.Instance.OpenWindowAsync<HeroReturnStarUpChangeWin>().Forget();
                 return;
             }
-            UIManager.Instance.OpenWindow<HeroReturnStarUpWin>();
+            UIManager.Instance.OpenWindowAsync<HeroReturnStarUpWin>().Forget();
         });
-        shopButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnShopWin>());
-        skinButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnSkinWin>());
-        giftButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnGiftWin>());
-        callButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnCallWin>());
+        shopButton.SetListener(() => UIManager.Instance.OpenWindowAsync<HeroReturnShopWin>().Forget());
+        skinButton.SetListener(() => UIManager.Instance.OpenWindowAsync<HeroReturnSkinWin>().Forget());
+        giftButton.SetListener(() => UIManager.Instance.OpenWindowAsync<HeroReturnGiftWin>().Forget());
+        callButton.SetListener(() => UIManager.Instance.OpenWindowAsync<HeroReturnCallWin>().Forget());
     }
 
     protected override void OnPreOpen()
@@ -217,10 +218,10 @@
             manager.LoadCallChooseHeroStateKey(manager.GetOperationHeroAppearInfo()) ?
             manager.GetCurrentDisplayCallHeroId() :
             manager.GetFirstHeroId());
-        uiHeroController.Create(chosenHeroSkinID, modleSize);
+        uiHeroController.Create(chosenHeroSkinID, modleSize).Forget();
 
         uiHeroController.transform.localScale = new Vector3(-modleSize, modleSize, modleSize);
-        lhController.Create(skinID, 1, motionName: "", isLh: true);
+        lhController.Create(skinID, 1, motionName: "", isLh: true).Forget();
 
         // 鏇存柊鑳屾櫙
         bgImage.SetSprite(StringUtility.Concat("HeroReturnMainBG_", heroID.ToString()));
diff --git a/Main/System/HeroUI/HeroAwakeSelectGiftWin.cs b/Main/System/HeroUI/HeroAwakeSelectGiftWin.cs
index ab7a4b8..9ad8804 100644
--- a/Main/System/HeroUI/HeroAwakeSelectGiftWin.cs
+++ b/Main/System/HeroUI/HeroAwakeSelectGiftWin.cs
@@ -1,6 +1,7 @@
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 
 /// <summary>
@@ -49,7 +50,7 @@
             slectGos[i].SetActive(i == selectIndex);
             if (i < hero.talentAwakeRandomIDList.Count)
             {
-                giftCells[i].Init(hero.talentAwakeRandomIDList[i], 1);
+                giftCells[i].Init(hero.talentAwakeRandomIDList[i], 1).Forget();
                 var giftConfig = HeroTalentConfig.Get(hero.talentAwakeRandomIDList[i]);
                 skillText[i].text = PlayerPropertyConfig.GetFullDescription(giftConfig.AttrID, giftConfig.AttrValue);
             }
diff --git a/Main/System/HeroUI/HeroBestWin.cs b/Main/System/HeroUI/HeroBestWin.cs
index 67e3ea7..43d5ace 100644
--- a/Main/System/HeroUI/HeroBestWin.cs
+++ b/Main/System/HeroUI/HeroBestWin.cs
@@ -162,7 +162,7 @@
         RefreshFetter();
         RefreshGift();
         RefreshAwake();
-        ForceRefreshLayout();
+        ForceRefreshLayout().Forget();
     }
 
 
diff --git a/Main/System/HeroUI/HeroCollectionCardCell.cs b/Main/System/HeroUI/HeroCollectionCardCell.cs
index 9466d7f..b93702d 100644
--- a/Main/System/HeroUI/HeroCollectionCardCell.cs
+++ b/Main/System/HeroUI/HeroCollectionCardCell.cs
@@ -2,7 +2,6 @@
 using UnityEngine;
 using UnityEngine.UI;
 using System.Collections.Generic;
-using System.Threading;
 
 public class HeroCollectionCardCell : MonoBehaviour
 {
@@ -20,9 +19,13 @@
     [SerializeField] GameObject activeObj; // 鍙縺娲诲甫娴佸厜鏁堟灉鏉愯川
     [SerializeField] GameObject actLimitObj; // 娲诲姩闄愬畾
 
-    private CancellationTokenSource displayCts;
+    private int displayVersion;
+
     public void Display(int index, int quality)
     {
+        displayVersion++;
+        int version = displayVersion;
+
         var heroID = HeroUIManager.Instance.heroCollectDict[quality][index];
         var heroConfig = HeroConfig.Get(heroID);
 
@@ -30,7 +33,8 @@
 
         HB122_tagSCHeroInfo.tagSCHero colData;
         HeroUIManager.Instance.TryGetHeroBookInfo(heroID, out colData);
-        heroCardBG.SetSprite("herocardbg" + heroConfig.Quality);
+
+        LoadImageAsync(heroCardBG, "herocardbg" + heroConfig.Quality, version).Forget();
 
         //鍒嗕负0鏈幏寰椼��1鍙縺娲汇��2甯歌銆�3绐佺牬鍗囩骇銆�4銆佹槦鍗囩骇銆�5宸叉弧绾�
         int funcState = HeroUIManager.Instance.GetHeroBookState(heroID, quality);
@@ -40,21 +44,17 @@
         unGetObj.SetActive(funcState == 0);
         actLimitObj.SetActive(heroConfig.IsActLimit == 1);
 
-        countryImg.SetSprite(HeroUIManager.Instance.GetCountryIconName(heroConfig.Country));
-        jobImg.SetSprite(HeroUIManager.Instance.GetJobIconName(heroConfig.Class));
+        LoadImageAsync(countryImg, HeroUIManager.Instance.GetCountryIconName(heroConfig.Country), version).Forget();
+        LoadImageAsync(jobImg, HeroUIManager.Instance.GetJobIconName(heroConfig.Class), version).Forget();
 
-        // 鍘绘姈鍔犺浇锛氬揩閫熸粴鍔ㄦ椂寤惰繜2甯у啀鍒涘缓Spine锛屽鏋滃崱鐗囧湪寤惰繜鍐呰澶嶇敤鍒欏彇娑堟棫鍔犺浇
-        displayCts?.Cancel();
-        displayCts?.Dispose();
-        displayCts = new CancellationTokenSource();
-        DelayedCreateSpine(heroConfig.SkinIDList[0], heroConfig.UIScale, displayCts.Token).Forget();
+        DelayedCreateSpine(heroConfig.SkinIDList[0], heroConfig.UIScale, version).Forget();
 
         redpoint.redpointId = MainRedDot.HeroCardCollectRedpoint * 10000000 + heroID;
 
         if (funcState == 3 || funcState == 4)
         {
             trainStateImg.SetActive(true);
-            trainStateImg.SetSprite("herofuncstate4");
+            LoadImageAsync(trainStateImg, "herofuncstate4", version).Forget();
         }
         else
         {
@@ -81,26 +81,22 @@
                 UIManager.Instance.OpenWindowAsync<HeroBestBaseWin>().Forget();
             }
         });
-        
-        // bookLVBtn.AddListener(() =>
-        // {
-        //     HeroUIManager.Instance.selectCollectHeroID = heroID;
-        //     UIManager.Instance.OpenWindow<HeroCollectionLvUpWin>();
-        // });
     }
 
-    private async UniTaskVoid DelayedCreateSpine(int skinID, float scale, CancellationToken ct)
+    private async UniTaskVoid LoadImageAsync(Image image, string iconKey, int version)
     {
-        // 寤惰繜2甯э紝蹇�熸粴鍔ㄦ椂鍗$墖浼氳澶嶇敤锛孋TS鍙栨秷鍚庝笉浼氱户缁垱寤篠pine
-        await UniTask.NextFrame(ct);
-        await UniTask.NextFrame(ct);
+        var sprite = await UILoader.LoadSpriteAsync(iconKey);
+        if (displayVersion != version) return;
+        if (image != null && sprite != null)
+            image.overrideSprite = sprite;
+    }
+
+    private async UniTaskVoid DelayedCreateSpine(int skinID, float scale, int version)
+    {
+        await UniTask.NextFrame();
+        await UniTask.NextFrame();
+        if (displayVersion != version) return;
         heroModel.Create(skinID, scale).Forget();
-    }
-
-    void OnDestroy()
-    {
-        displayCts?.Cancel();
-        displayCts?.Dispose();
     }
 }
 
diff --git a/Main/System/HeroUI/HeroCollectionLvUpWin.cs b/Main/System/HeroUI/HeroCollectionLvUpWin.cs
index 776d987..358e456 100644
--- a/Main/System/HeroUI/HeroCollectionLvUpWin.cs
+++ b/Main/System/HeroUI/HeroCollectionLvUpWin.cs
@@ -2,6 +2,7 @@
 using System.Linq;
 using UnityEngine;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 
 /// <summary>
@@ -95,7 +96,7 @@
         {
             // fullPanel.SetActive(true);
             lvupPanel.SetActive(state == 1);
-            fullHeadCell.Init(HeroUIManager.Instance.selectCollectHeroID, config.SkinIDList[0]);
+            fullHeadCell.Init(HeroUIManager.Instance.selectCollectHeroID, config.SkinIDList[0]).Forget();
             name3.text = config.Name;
 
 
diff --git a/Main/System/HeroUI/HeroCollectionWin.cs b/Main/System/HeroUI/HeroCollectionWin.cs
index be115e0..4781a29 100644
--- a/Main/System/HeroUI/HeroCollectionWin.cs
+++ b/Main/System/HeroUI/HeroCollectionWin.cs
@@ -160,6 +160,7 @@
         }
         heroListScroller.Restart();
         heroListScroller.JumpIndex(jumpIndex);
+        
     }
 
 
diff --git a/Main/System/HeroUI/HeroRebornCell.cs b/Main/System/HeroUI/HeroRebornCell.cs
index b8848a7..9c6a969 100644
--- a/Main/System/HeroUI/HeroRebornCell.cs
+++ b/Main/System/HeroUI/HeroRebornCell.cs
@@ -11,7 +11,7 @@
     {
         int itemID = items[index].id;
         itemCell.Init(new ItemCellModel(itemID, false, items[index].countEx));
-        itemCell.button.SetListener(() =>
+        itemCell.SetClickListener(() =>
         {
             ItemTipUtility.Show(itemID);
         });
diff --git a/Main/System/HeroUI/HeroScenePosCell.cs b/Main/System/HeroUI/HeroScenePosCell.cs
index 4646b2a..6cbbea9 100644
--- a/Main/System/HeroUI/HeroScenePosCell.cs
+++ b/Main/System/HeroUI/HeroScenePosCell.cs
@@ -67,7 +67,7 @@
         {
             //鐐瑰嚮椋炲叆 寤惰繜鏄剧ず
             objForfly.SetActive(false);
-            DelayShow();
+            DelayShow().Forget();
         }
         else
         {
diff --git a/Main/System/InternalAffairs/GoldRushLeader.cs b/Main/System/InternalAffairs/GoldRushLeader.cs
index fe522ec..8fe0c1d 100644
--- a/Main/System/InternalAffairs/GoldRushLeader.cs
+++ b/Main/System/InternalAffairs/GoldRushLeader.cs
@@ -167,7 +167,7 @@
             leaderWord.Play();
             leaderText.text = Language.Get(!pathPosEvent.m_IsRandom ? pathPosEvent.m_Text1 :
                 pathPosEvent.m_Text1 + UnityEngine.Random.Range((int)pathPosEvent.m_Value1, (int)pathPosEvent.m_Value2 + 1));
-            ForceRefreshLayout();
+            ForceRefreshLayout().Forget();
         }
         else if (pathPosEvent.m_PosEvent == PosEvent.TargetWord)
         {
diff --git a/Main/System/InternalAffairs/GoldRushTentCell.cs b/Main/System/InternalAffairs/GoldRushTentCell.cs
index e3d0144..d5e7089 100644
--- a/Main/System/InternalAffairs/GoldRushTentCell.cs
+++ b/Main/System/InternalAffairs/GoldRushTentCell.cs
@@ -422,7 +422,7 @@
             wordArr[index].SetActive(true);
             wordArr[index].Play();
             textArr[index].text = Language.Get(content);
-            ForceRefreshLayout();
+            ForceRefreshLayout().Forget();
         }
         else if (posEvent == PosEvent.TargetAction)
         {
diff --git a/Main/System/ItemTip/ChooseItemsCell.cs b/Main/System/ItemTip/ChooseItemsCell.cs
index df2bff6..1f3bd9b 100644
--- a/Main/System/ItemTip/ChooseItemsCell.cs
+++ b/Main/System/ItemTip/ChooseItemsCell.cs
@@ -22,7 +22,7 @@
         ItemConfig itemConfig = ItemConfig.Get(itemId);
         int count = itemArr[1];
         itemCell.Init(new ItemCellModel(itemId, false, count));
-        itemCell.button.SetListener(() =>
+        itemCell.SetClickListener(() =>
         {
             ItemTipUtility.Show(itemId);
         });
diff --git a/Main/System/KnapSack/Logic/CommonGetItem.cs b/Main/System/KnapSack/Logic/CommonGetItem.cs
index f5cca48..cd08a72 100644
--- a/Main/System/KnapSack/Logic/CommonGetItem.cs
+++ b/Main/System/KnapSack/Logic/CommonGetItem.cs
@@ -20,7 +20,7 @@
         var item = ItemLogicUtility.Instance.totalShowItems[idInfo];
         itemCell.Init(new ItemCellModel(itemID, false, item.countEx));
         txtItemName.text = ItemConfig.Get(itemID).ItemName;
-        itemCell.button.SetListener(() =>
+        itemCell.SetClickListener(() =>
         {
             ItemTipUtility.Show(itemID);
         });
diff --git a/Main/System/KnapSack/New/CommonItemBaisc.cs b/Main/System/KnapSack/New/CommonItemBaisc.cs
index f91fa7c..a5428f7 100644
--- a/Main/System/KnapSack/New/CommonItemBaisc.cs
+++ b/Main/System/KnapSack/New/CommonItemBaisc.cs
@@ -157,10 +157,21 @@
 
 
     GameObject cellContainer;
+    AsyncLazy lazyPrefab;
+
     protected async UniTask LoadPrefab()
     {
         if (cellContainer != null)
             return;
+
+        if (lazyPrefab == null)
+            lazyPrefab = new AsyncLazy(LoadPrefabInternal);
+
+        await lazyPrefab.Task;
+    }
+
+    private async UniTask LoadPrefabInternal()
+    {
         //clone 浼氶�犳垚浜屾鍒涘缓
         var tmp = transform.Find("Container_ItemCell");
         if (tmp != null)
@@ -248,7 +259,7 @@
     public virtual void Init(ItemModel model, bool isCompare = false)
     {
         itemId = model.itemId;
-        InitUI(model.guid, model.itemId, model.count, model.isAuction, model.packType, isCompare, model.useDataDict);
+        InitUI(model.guid, model.itemId, model.count, model.isAuction, model.packType, isCompare, model.useDataDict).Forget();
     }
 
     /// <summary>
@@ -261,10 +272,28 @@
         InitUI(model.guid, model.itemId, model.count, false, model.packType, model.isCompare, model.useDataDic).Forget();
     }
 
+    /// <summary>
+    /// 鍦╬refab鍔犺浇瀹屾垚鍚庡畨鍏ㄨ缃産utton鐐瑰嚮浜嬩欢
+    /// </summary>
+    public void SetClickListener(UnityEngine.Events.UnityAction action)
+    {
+        SetClickListenerAsync(action).Forget();
+    }
+
+    private async UniTask SetClickListenerAsync(UnityEngine.Events.UnityAction action)
+    {
+        await LoadPrefab();
+        if (this == null) return;
+        button.SetListener(action);
+    }
+
     private async UniTask InitUI(string guid, int itemId, long count, bool isAuction, PackType type, bool isCompare, Dictionary<int, List<int>> useDataDic)
     {
         var config = ItemConfig.Get(itemId);
-        if (config == null) return;
+        if (config == null)
+        {
+            return;
+        }
 
         await LoadPrefab();   //瀛樺湪琚嵏杞界殑鍙兘锛岄噸鏂板姞杞�
         if (this == null) return;
diff --git a/Main/System/KnapSack/New/ItemCell.cs b/Main/System/KnapSack/New/ItemCell.cs
index 2de7598..895a692 100644
--- a/Main/System/KnapSack/New/ItemCell.cs
+++ b/Main/System/KnapSack/New/ItemCell.cs
@@ -1,4 +1,6 @@
 锘�
+using Cysharp.Threading.Tasks;
+
 public class ItemCell : CommonItemBaisc
 {
 
@@ -18,8 +20,15 @@
         base.Init(model);
         if (appointID > 0)
         {
-            countText.text = Language.Get("L1113", AppointItemConfig.Get(appointID).ItemLV);
+            ApplyAppointText(appointID).Forget();
         }
     }
+
+    private async Cysharp.Threading.Tasks.UniTask ApplyAppointText(int appointID)
+    {
+        await LoadPrefab();
+        if (this == null) return;
+        countText.text = Language.Get("L1113", AppointItemConfig.Get(appointID).ItemLV);
+    }
 }
 
diff --git a/Main/System/Login/ServerListCenter.cs b/Main/System/Login/ServerListCenter.cs
index 3eabde4..faf1a59 100644
--- a/Main/System/Login/ServerListCenter.cs
+++ b/Main/System/Login/ServerListCenter.cs
@@ -9,7 +9,11 @@
 {
     public static readonly string[] JUMP_URL = new string[] 
     {
+#if TEST_BUILD
         "http://gamecenter.secondworld.net.cn:11000/center/server_list.php/?",
+#else
+        "http://xssgcenter.secondworld.net.cn:11000/center/server_list.php/?",
+#endif
         "http://106.55.151.92:11000/center/server_list_new.php/?"
     };
 
diff --git a/Main/System/Login/ServerListWin.cs b/Main/System/Login/ServerListWin.cs
index a34ef82..696b5cf 100644
--- a/Main/System/Login/ServerListWin.cs
+++ b/Main/System/Login/ServerListWin.cs
@@ -34,7 +34,7 @@
         base.OnOpen();
         // 绐楀彛鎵撳紑鏃剁殑閫昏緫
         ServerListCenter.Instance.serverGroupSelectEvent += RefreshServerList;
-        m_ServerGroupScroll.Init(ServerListCenter.Instance.GetAllServerGroup());
+        m_ServerGroupScroll.Init(ServerListCenter.Instance.GetAllServerGroup()).Forget();
         RefreshServerList();
     }
 
@@ -92,11 +92,11 @@
                     groupDatas.Add(new ServerDataCouple(serverDataList[i]));
                 }
 
-                m_ServerScroll.Init(groupDatas);
+                m_ServerScroll.Init(groupDatas).Forget();
             }
             else
             {
-                m_ServerScroll.Init<ServerDataCouple>(null);
+                m_ServerScroll.Init<ServerDataCouple>(null).Forget();
             }
 
         }
diff --git a/Main/System/Mail/MailCell.cs b/Main/System/Mail/MailCell.cs
index bcfabe9..7400f3b 100644
--- a/Main/System/Mail/MailCell.cs
+++ b/Main/System/Mail/MailCell.cs
@@ -2,7 +2,6 @@
 using Cysharp.Threading.Tasks;
 using UnityEngine;
 using UnityEngine.UI;
-using Cysharp.Threading.Tasks;
 
 public class MailCell : CellView
 {
diff --git a/Main/System/Mail/MailInfoAwardCell.cs b/Main/System/Mail/MailInfoAwardCell.cs
index 41e17ef..e12c297 100644
--- a/Main/System/Mail/MailInfoAwardCell.cs
+++ b/Main/System/Mail/MailInfoAwardCell.cs
@@ -18,7 +18,7 @@
         int mailState = mailData.MailState;//0-鏈煡锛�1-鏈锛�2-宸茶锛�3-宸查锛�
         MailItemData data = mailData.Items[index];
         itemCell.Init(new ItemCellModel((int)data.ItemID, true, data.Count));
-        itemCell.button.SetListener(() => ItemTipUtility.Show((int)data.ItemID, true));
+        itemCell.SetClickListener(() => ItemTipUtility.Show((int)data.ItemID, true));
         float expiryDays = model.GetMailExpiryDays(mailData.CreateDateTime, mailData.LimitDays);
         imgHave.SetActive(mailState == 3);
         imgMask.SetActive(mailState == 3 || expiryDays <= 0);
diff --git a/Main/System/Mail/MailWin.cs b/Main/System/Mail/MailWin.cs
index 85605ef..7f86d4a 100644
--- a/Main/System/Mail/MailWin.cs
+++ b/Main/System/Mail/MailWin.cs
@@ -52,7 +52,7 @@
         txtCurrentMailCount.text = StringUtility.Concat(personalMailCount.ToString(), "/", MailManager.Instance.personalMailMaxLimitCount.ToString());
     }
 
-    protected override async void OpenSubUIByTabIndex()
+    protected override void OpenSubUIByTabIndex()
     {
         switch (functionOrder)
         {
diff --git a/Main/System/Main/MainWin.cs b/Main/System/Main/MainWin.cs
index 41d3f94..6bec7ea 100644
--- a/Main/System/Main/MainWin.cs
+++ b/Main/System/Main/MainWin.cs
@@ -78,6 +78,11 @@
         mgTip.SetActive(false);
         // 鍒锋柊UI
         Display();
+
+        var temp = Debug.unityLogger.logEnabled;
+        Debug.unityLogger.logEnabled = true;
+        Debug.LogError("MainWin OnPreOpen 浜� 鐗规畩鏍囪瘑");
+        Debug.unityLogger.logEnabled = temp;
     }
 
     protected override void OnPreClose()
@@ -212,7 +217,7 @@
                 break;
             case PlayerDataType.Face:
             case PlayerDataType.FacePic:
-                avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
+                 avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                                 PlayerDatas.Instance.baseData.face,
                                                                 PlayerDatas.Instance.baseData.facePic)).Forget();
                 break;
@@ -420,6 +425,8 @@
 
             fightHeroImg.SetOrgSprite(HeroSkinConfig.Get(AutoFightModel.Instance.fightingHeroSkinID).SquareIcon, "HeroHead");
         }
+
+
     }
 
     void RefreshFightIng(bool isfighting = false)
diff --git a/Main/System/MainLevel/MainBossEnterWin.cs b/Main/System/MainLevel/MainBossEnterWin.cs
index 60ec312..a124715 100644
--- a/Main/System/MainLevel/MainBossEnterWin.cs
+++ b/Main/System/MainLevel/MainBossEnterWin.cs
@@ -105,7 +105,7 @@
                     SmallTipWin.worldPos = CameraManager.uiCamera.ScreenToWorldPoint(Input.mousePosition);
                     SmallTipWin.isDownShow = true;
                     UIManager.Instance.OpenWindowAsync<SmallTipWin>().Forget();
-                });
+                }).Forget();
             }
             else
             {
diff --git a/Main/System/Message/ColorAnalysis.cs b/Main/System/Message/ColorAnalysis.cs
index 0bb78fa..6b69c23 100644
--- a/Main/System/Message/ColorAnalysis.cs
+++ b/Main/System/Message/ColorAnalysis.cs
@@ -8,9 +8,9 @@
 {
     public static Regex Color_Start_Regex = new Regex(@"<color=#([0-9a-zA-Z]+)>", RegexOptions.Singleline);
 
-    public override async UniTask<string> Analysis(string val, bool IsRich)
+    public override UniTask<string> Analysis(string val, bool IsRich)
     {
-        return val;
+        return UniTask.FromResult(val);
         // if (!Color_Start_Regex.IsMatch(val) || RichTextMgr.Inst.presentRichText == null)
         // {
         //     return val;
diff --git a/Main/System/Message/HrefAnalysis.cs b/Main/System/Message/HrefAnalysis.cs
index 4c5f902..2529e76 100644
--- a/Main/System/Message/HrefAnalysis.cs
+++ b/Main/System/Message/HrefAnalysis.cs
@@ -15,11 +15,11 @@
 
     static int insertIndex = 0;
 
-    public override async UniTask<string> Analysis(string val, bool IsRich)
+    public override UniTask<string> Analysis(string val, bool IsRich)
     {
         if (!HrefRegex.IsMatch(val))
         {
-            return val;
+            return UniTask.FromResult(val);
         }
         int index = 0;
         m_StringBuilder.Length = 0;
@@ -49,7 +49,7 @@
         }
         m_StringBuilder.Append(val.Substring(index, val.Length - index));
         presentHrefInfo = null;
-        return m_StringBuilder.ToString();
+        return UniTask.FromResult(m_StringBuilder.ToString());
     }
 
     public override string CalculateTextIndex(string val, int index)
diff --git a/Main/System/Message/RichText.cs b/Main/System/Message/RichText.cs
index 4c81467..0ad2731 100644
--- a/Main/System/Message/RichText.cs
+++ b/Main/System/Message/RichText.cs
@@ -114,7 +114,7 @@
         set
         {
             m_AutoNewLine = value;
-            SetRichTextDirty();
+            SetRichTextDirty().Forget();
         }
     }
 
@@ -652,7 +652,7 @@
     public void SetReplaceInfo(Dictionary<string, string> _infoDic)
     {
         extenalDataDic = _infoDic;
-        SetRichTextDirty();
+        SetRichTextDirty().Forget();
     }
 
     private string GetTaskInfo(string val)
diff --git a/Main/System/Message/SuitNameAnalysis.cs b/Main/System/Message/SuitNameAnalysis.cs
index 593b830..bcfcb4c 100644
--- a/Main/System/Message/SuitNameAnalysis.cs
+++ b/Main/System/Message/SuitNameAnalysis.cs
@@ -8,11 +8,11 @@
 {
     public static Regex SuitName_Regex = new Regex(@"<Suitname=(.*?)/>\|{0,1}");
 
-    public override async UniTask<string> Analysis(string val, bool IsRich)
+    public override UniTask<string> Analysis(string val, bool IsRich)
     {
         if (!SuitName_Regex.IsMatch(val))
         {
-            return val;
+            return UniTask.FromResult(val);
         }
         int index = 0;
         m_StringBuilder.Length = 0;
@@ -23,7 +23,7 @@
             index = match.Index + match.Length;
         }
         m_StringBuilder.Append(val.Substring(index, val.Length - index));
-        return m_StringBuilder.ToString();
+        return UniTask.FromResult(m_StringBuilder.ToString());
     }
 
     public override string CalculateTextIndex(string val, int index)
diff --git a/Main/System/Message/WordAnalysis.cs b/Main/System/Message/WordAnalysis.cs
index d543282..c8f9af0 100644
--- a/Main/System/Message/WordAnalysis.cs
+++ b/Main/System/Message/WordAnalysis.cs
@@ -19,11 +19,11 @@
     private static int presentColor = 0;
     private static bool hasColor = false;
 
-    public override async UniTask<string> Analysis(string val, bool IsRich)
+    public override UniTask<string> Analysis(string val, bool IsRich)
     {
         if (!Word_Regex.IsMatch(val))
         {
-            return val;
+            return UniTask.FromResult(val);
         }
         int index = 0;
         m_StringBuilder.Length = 0;
@@ -34,7 +34,7 @@
             index = match.Index + match.Length;
         }
         m_StringBuilder.Append(val.Substring(index, val.Length - index));
-        return m_StringBuilder.ToString();
+        return UniTask.FromResult(m_StringBuilder.ToString());
     }
 
     public override string CalculateTextIndex(string val, int index)
diff --git a/Main/System/OSActivity/OSGalaChangeCell.cs b/Main/System/OSActivity/OSGalaChangeCell.cs
index dab877e..31b597b 100644
--- a/Main/System/OSActivity/OSGalaChangeCell.cs
+++ b/Main/System/OSActivity/OSGalaChangeCell.cs
@@ -35,7 +35,7 @@
                 itemCell.SetActive(true);
                 int itemID = awards[i][0];
                 itemCell.Init(new ItemCellModel(itemID, true, awards[i][1]));
-                itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+                itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
             }
             else
             {
diff --git a/Main/System/OSActivity/OSGalaGiftCell.cs b/Main/System/OSActivity/OSGalaGiftCell.cs
index 0024be7..08369e9 100644
--- a/Main/System/OSActivity/OSGalaGiftCell.cs
+++ b/Main/System/OSActivity/OSGalaGiftCell.cs
@@ -50,7 +50,7 @@
                     itemCell.SetActive(true);
                     int itemID = ctgConfig.GainItemList[i][0];
                     itemCell.Init(new ItemCellModel(itemID, true, ctgConfig.GainItemList[i][1]));
-                    itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+                    itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
                 }
                 else
                 {
@@ -123,7 +123,7 @@
                     itemCell.SetActive(true);
                     int itemID = awards[i][0];
                     itemCell.Init(new ItemCellModel(itemID, true, awards[i][1]));
-                    itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+                    itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
                 }
                 else
                 {
diff --git a/Main/System/OSActivity/OSRankAwardBaseCell.cs b/Main/System/OSActivity/OSRankAwardBaseCell.cs
index 11b4272..1ddf86a 100644
--- a/Main/System/OSActivity/OSRankAwardBaseCell.cs
+++ b/Main/System/OSActivity/OSRankAwardBaseCell.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using System.Linq;
 using UnityEngine;
 using UnityEngine.UI;
@@ -52,7 +52,7 @@
                 itemCell.SetActive(true);
                 int itemID = award[i][0];
                 itemCell.Init(new ItemCellModel(itemID, true, award[i][1]));
-                itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+                itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
             }
             else
             {
diff --git a/Main/System/OSActivity/OSRankGiftBaseCell.cs b/Main/System/OSActivity/OSRankGiftBaseCell.cs
index 7af221b..25b67f0 100644
--- a/Main/System/OSActivity/OSRankGiftBaseCell.cs
+++ b/Main/System/OSActivity/OSRankGiftBaseCell.cs
@@ -1,4 +1,4 @@
-using Cysharp.Threading.Tasks;
+锘縰sing Cysharp.Threading.Tasks;
 using UnityEngine;
 using UnityEngine.UI;
 
@@ -53,7 +53,7 @@
                     itemCell.SetActive(true);
                     int itemID = ctgConfig.GainItemList[i][0];
                     itemCell.Init(new ItemCellModel(itemID, true, ctgConfig.GainItemList[i][1]));
-                    itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+                    itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
                 }
                 else
                 {
@@ -127,7 +127,7 @@
                     itemCell.SetActive(true);
                     int itemID = awards[i][0];
                     itemCell.Init(new ItemCellModel(itemID, true, awards[i][1]));
-                    itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+                    itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
                 }
                 else
                 {
diff --git a/Main/System/OSActivity/OSRankHeroCallAwardCell.cs b/Main/System/OSActivity/OSRankHeroCallAwardCell.cs
index c096521..1af10c0 100644
--- a/Main/System/OSActivity/OSRankHeroCallAwardCell.cs
+++ b/Main/System/OSActivity/OSRankHeroCallAwardCell.cs
@@ -46,7 +46,7 @@
                 itemCell.SetActive(true);
                 int itemID = award[i][0];
                 itemCell.Init(new ItemCellModel(itemID, true, award[i][1]));
-                itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+                itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
             }
             else
             {
diff --git a/Main/System/OSActivity/OSRankHeroCallGiftCell.cs b/Main/System/OSActivity/OSRankHeroCallGiftCell.cs
index 4d77262..5c35800 100644
--- a/Main/System/OSActivity/OSRankHeroCallGiftCell.cs
+++ b/Main/System/OSActivity/OSRankHeroCallGiftCell.cs
@@ -50,7 +50,7 @@
                     itemCell.SetActive(true);
                     int itemID = ctgConfig.GainItemList[i][0];
                     itemCell.Init(new ItemCellModel(itemID, true, ctgConfig.GainItemList[i][1]));
-                    itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+                    itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
                 }
                 else
                 {
@@ -123,7 +123,7 @@
                     itemCell.SetActive(true);
                     int itemID = awards[i][0];
                     itemCell.Init(new ItemCellModel(itemID, true, awards[i][1]));
-                    itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+                    itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
                 }
                 else
                 {
diff --git a/Main/System/OSActivity/OSRankMainLeveAwardCell.cs b/Main/System/OSActivity/OSRankMainLeveAwardCell.cs
index 3ebd67d..24130e5 100644
--- a/Main/System/OSActivity/OSRankMainLeveAwardCell.cs
+++ b/Main/System/OSActivity/OSRankMainLeveAwardCell.cs
@@ -46,7 +46,7 @@
                 itemCell.SetActive(true);
                 int itemID = award[i][0];
                 itemCell.Init(new ItemCellModel(itemID, true, award[i][1]));
-                itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+                itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
             }
             else
             {
diff --git a/Main/System/OfficialRank/OfficialTitleCell.cs b/Main/System/OfficialRank/OfficialTitleCell.cs
index b3a06ce..b0873f5 100644
--- a/Main/System/OfficialRank/OfficialTitleCell.cs
+++ b/Main/System/OfficialRank/OfficialTitleCell.cs
@@ -10,8 +10,8 @@
     private void Awake()
     {
         //濡傛灉鏈夐渶瑕佹寜閽偣鍑婚�昏緫锛屽湪澶栧眰鍒涘缓锛屾澶勪笉澶勭悊鐐瑰嚮閫昏緫
-        LoadPrefab().Forget();
-
+        lazyPrefab = new AsyncLazy(LoadPrefabInternal, "OfficialTitleCell");
+        lazyPrefab.Task.Forget();
     }
 
 
@@ -85,35 +85,33 @@
 
 
     GameObject prefab;
+    AsyncLazy lazyPrefab;
 
-
-    protected async UniTask<GameObject> LoadPrefab()
+    private async UniTask LoadPrefabInternal()
     {
-        if (prefab != null)
-            return prefab;
         var tmp = transform.Find("OfficialTitleCell");
-
         if (tmp != null)
         {
             prefab = tmp.gameObject;
-            return prefab;
+            return;
         }
-        prefab = await UIUtility.CreateWidget("OfficialTitleCell", "OfficialTitleCell");
+
+        var inst = await UIUtility.CreateWidget("OfficialTitleCell", "OfficialTitleCell");
 
         if (this == null)
         {
-            GameObject.DestroyImmediate(prefab);
-            return null;
+            if (inst != null) GameObject.DestroyImmediate(inst);
+            return;
         }
 
+        prefab = inst;
         prefab.transform.SetParentEx(this.transform, Vector3.zero, Quaternion.identity, Vector3.one);
         prefab.transform.SetAsFirstSibling();
-        return prefab;
     }
 
     public async UniTask InitUI(int offcialRank, int titleID, float scale = 0.6f)
     {
-        await LoadPrefab();   //瀛樺湪琚嵏杞界殑鍙兘锛岄噸鏂板姞杞�
+        await lazyPrefab.Task;
         if (this == null) return;
         if (!TitleConfig.HasKey(titleID))
         {
diff --git a/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs b/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs
index 50e85da..94717ff 100644
--- a/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs
+++ b/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs
@@ -139,7 +139,7 @@
         DisplayPotential(heroID, breakLevel);
         RefreshAwake(heroID, quality, awakeLevel);
 
-        ForceRefreshLayout();
+        ForceRefreshLayout().Forget();
 
     }
 
@@ -172,7 +172,7 @@
         DisplayFetter(teams: null, FetterIDList);
         DisplayPotential(heroID, breakLevel);
         RefreshAwake(heroID, quality, awakeLevel);
-        ForceRefreshLayout();
+        ForceRefreshLayout().Forget();
     }
 
     void DiplayByViewOtherPlayer(OtherPlayerDetailManager.RolePlusData.HeroData heroData,
@@ -207,7 +207,7 @@
         DisplayPotential(heroID, breakLevel);
         RefreshAwake(heroID, quality, awakeLevel);
 
-        ForceRefreshLayout();
+        ForceRefreshLayout().Forget();
     }
 
 
diff --git a/Main/System/OtherPlayerDetail/OtherNPCDetailWin.cs b/Main/System/OtherPlayerDetail/OtherNPCDetailWin.cs
index 20ec382..51a8444 100644
--- a/Main/System/OtherPlayerDetail/OtherNPCDetailWin.cs
+++ b/Main/System/OtherPlayerDetail/OtherNPCDetailWin.cs
@@ -96,7 +96,7 @@
         DisplayAttr(attrDict);
         DisplayPotential(heroID, breakLevel);
         RefreshAwake(heroID, quality, awakeLevel);
-        ForceRefreshLayout();
+        ForceRefreshLayout().Forget();
     }
 
     List<GameObject> awakeCellList;   //瑙夐啋
diff --git a/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs b/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
index ce579b4..2b919d2 100644
--- a/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
+++ b/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
@@ -158,7 +158,7 @@
         txtPlayerId.text = Language.Get("OtherPlayerDetail02", viewPlayerData.PlayerID);
         txtServerName.text = Language.Get("PlayerProfile11", ServerListCenter.Instance.GetServerName(viewPlayerData.ServerID));
         txtLV.text = viewPlayerData.LV.ToString();
-        avatarCell.InitUI(AvatarHelper.GetAvatarModel(viewPlayerData.PlayerID, viewPlayerData.Face, viewPlayerData.FacePic));
+        avatarCell.InitUI(AvatarHelper.GetAvatarModel(viewPlayerData.PlayerID, viewPlayerData.Face, viewPlayerData.FacePic)).Forget();
         officialTitle.InitUI(viewPlayerData.RealmLV, viewPlayerData.TitleID, 0.65f).Forget();
         DisplayHorseModel(viewPlayerData);
 
diff --git a/Main/System/PhantasmPavilion/AvatarCell.cs b/Main/System/PhantasmPavilion/AvatarCell.cs
index 6859c9e..26f6e76 100644
--- a/Main/System/PhantasmPavilion/AvatarCell.cs
+++ b/Main/System/PhantasmPavilion/AvatarCell.cs
@@ -1,9 +1,9 @@
-using System;
+锘縰sing System;
 using Cysharp.Threading.Tasks;
 using UnityEngine;
 using UnityEngine.Events;
 
-//澶村儚妯″潡
+//婢舵潙鍎氬Ο鈥虫健
 public class AvatarCell : MonoBehaviour
 {
     ButtonEx m_button;
@@ -177,7 +177,7 @@
                 return;
             InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                                 PlayerDatas.Instance.baseData.face,
-                                                                PlayerDatas.Instance.baseData.facePic));
+                                                                PlayerDatas.Instance.baseData.facePic)).Forget();
         }
     }
 
@@ -231,7 +231,7 @@
             return;
         }
         avatarModel = model;
-        await LoadPrefab();   //瀛樺湪琚嵏杞界殑鍙兘锛岄噸鏂板姞杞�
+        await LoadPrefab();   //鐎涙ê婀悮顐㈠祻鏉炵晫娈戦崣顖濆厴閿涘矂鍣搁弬鏉垮鏉�?
 
         if (this == null)
         {
@@ -240,6 +240,25 @@
 
         int faceID = model.faceID;
         int facePicID = model.facePicID;
+
+        // 鐠囧﹥鏌囬敍姘梾閺�?Mask_Face 閼哄倻鍋i崣濠傚従鐎涙劕顕挒?
+        var maskTf = prefab?.transform.Find("Img_FaceBG/Mask_Face");
+        if (maskTf != null)
+        {
+            for (int i = 0; i < maskTf.childCount; i++)
+            {
+                var child = maskTf.GetChild(i);
+                var img = child.GetComponent<UnityEngine.UI.Graphic>();
+            }
+        }
+
+        // 鐠囧﹥鏌囬敍姘梾閺�?Img_FacePic 閼哄倻鍋�
+        var facePicTf = prefab?.transform.Find("Img_FaceBG/Img_FacePic");
+        if (facePicTf != null)
+        {
+            var fpImg = facePicTf.GetComponent<UnityEngine.UI.Graphic>();
+        }
+
         await manager.ShowFace(faceImage, faceSpine, faceUIFrame, faceMask, faceID);
 
         if (this == null) return;
@@ -253,21 +272,21 @@
 
         BindButtonClick(model);
     }
-    // 娣诲姞鏍囧織浣嶏細鏄惁宸茶缃嚜瀹氫箟鐩戝惉鍣�
+    // 濞h濮為弽鍥х箶娴e稄绱伴弰顖氭儊瀹歌尪顔曠純顔垮殰鐎规矮绠熼惄鎴濇儔閸�?
     private bool hasCustomListener = false;
     public void SetListener(UnityAction action)
     {
-        hasCustomListener = true;  // 鏍囪宸茶缃嚜瀹氫箟鐩戝惉
+        hasCustomListener = true;  // 閺嶅洩顔囧鑼额啎缂冾喛鍤滅�规矮绠熼惄鎴濇儔
         button.SetListener(action);
     }
     public void AddListener(UnityAction action)
     {
-        hasCustomListener = true;  // 鏍囪宸茶缃嚜瀹氫箟鐩戝惉
+        hasCustomListener = true;  // 閺嶅洩顔囧鑼额啎缂冾喛鍤滅�规矮绠熼惄鎴濇儔
         button.SetListener(action);
     }
     private void BindButtonClick(AvatarModel model)
     {
-        // 濡傛灉宸茬粡璁剧疆浜嗚嚜瀹氫箟鐩戝惉鍣紝涓嶈鐩�
+        // 婵″倹鐏夊鑼病鐠佸墽鐤嗘禍鍡氬殰鐎规矮绠熼惄鎴濇儔閸n煉绱濇稉宥堫洬閻�?
         if (hasCustomListener)
             return;
 
@@ -295,4 +314,4 @@
         this.faceID = faceID;
         this.facePicID = facePicID;
     }
-}
\ No newline at end of file
+}
diff --git a/Main/System/PlayerProfile/ExchangeCodeWin.cs b/Main/System/PlayerProfile/ExchangeCodeWin.cs
index 17e1f1f..3026738 100644
--- a/Main/System/PlayerProfile/ExchangeCodeWin.cs
+++ b/Main/System/PlayerProfile/ExchangeCodeWin.cs
@@ -6,7 +6,14 @@
 {
     [SerializeField] InputField input;
     [SerializeField] Button receiveBtn;
-    const string exchangeUrl = "http://gamecenter.secondworld.net.cn:53003/Coupon/CouponCode.php?";
+    // const string exchangeUrl = "http://gamecenter.secondworld.net.cn:53003/Coupon/CouponCode.php?";
+
+#if TEST_BUILD
+    const string exchangeUrl = "http://gamecenter.secondworld.net.cn:53003/center/CouponCode.php/?";
+#else
+    const string exchangeUrl = "http://xssgcenter.secondworld.net.cn:53003/center/CouponCode.php/?";
+#endif
+
     bool isCool = false;
     float time = 0;
 
diff --git a/Main/System/PlayerProfile/PlayerProfileWin.cs b/Main/System/PlayerProfile/PlayerProfileWin.cs
index ed787cc..99e00d2 100644
--- a/Main/System/PlayerProfile/PlayerProfileWin.cs
+++ b/Main/System/PlayerProfile/PlayerProfileWin.cs
@@ -112,7 +112,7 @@
         txtFamilyName.text = Language.Get("PlayerProfile12", PlayerDatas.Instance.fairyData.HasFairy ? PlayerDatas.Instance.baseData.FamilyName : Language.Get("PlayerProfile14"));
         avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                     PlayerDatas.Instance.baseData.face,
-                                                    PlayerDatas.Instance.baseData.facePic));
+                                                    PlayerDatas.Instance.baseData.facePic)).Forget();
         officialTitleCell.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID, 1f).Forget();
         var languages = Language.GetLanguages();
         btnLanguage.SetActive(!languages.IsNullOrEmpty());
diff --git a/Main/System/Qunying/QYAchievementCell.cs b/Main/System/Qunying/QYAchievementCell.cs
index 140084e..5e91287 100644
--- a/Main/System/Qunying/QYAchievementCell.cs
+++ b/Main/System/Qunying/QYAchievementCell.cs
@@ -37,7 +37,7 @@
                 itemCell.SetActive(true);
                 int itemID = rankAwards[i][0];
                 itemCell.Init(new ItemCellModel(itemID, true, rankAwards[i][1]));
-                itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+                itemCell.SetClickListener(() => ItemTipUtility.Show(itemID));
             }
             else
             {
diff --git a/Main/System/Qunying/QYBattleFailWin.cs b/Main/System/Qunying/QYBattleFailWin.cs
index f6df9b3..69fc0f1 100644
--- a/Main/System/Qunying/QYBattleFailWin.cs
+++ b/Main/System/Qunying/QYBattleFailWin.cs
@@ -81,8 +81,8 @@
 
         myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                 PlayerDatas.Instance.baseData.face,
-                                                PlayerDatas.Instance.baseData.facePic));
-        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
+                                                PlayerDatas.Instance.baseData.facePic)).Forget();
+        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic)).Forget();
         enemyAvatarCell.SetListener(() =>
         {
             AvatarHelper.TryViewOtherPlayerInfo((int)tagPlayerID, viewPlayerLineupType: (int)BattlePreSetType.Qunying);
diff --git a/Main/System/Qunying/QYBattleVictoryWin.cs b/Main/System/Qunying/QYBattleVictoryWin.cs
index bb0650e..1d5dfe1 100644
--- a/Main/System/Qunying/QYBattleVictoryWin.cs
+++ b/Main/System/Qunying/QYBattleVictoryWin.cs
@@ -63,8 +63,8 @@
 
         myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                 PlayerDatas.Instance.baseData.face,
-                                                PlayerDatas.Instance.baseData.facePic));
-        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
+                                                PlayerDatas.Instance.baseData.facePic)).Forget();
+        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic)).Forget();
         enemyAvatarCell.SetListener(() =>
         {
             AvatarHelper.TryViewOtherPlayerInfo((int)tagPlayerID, viewPlayerLineupType: (int)BattlePreSetType.Qunying);
diff --git a/Main/System/Qunying/QYBattleWin.cs b/Main/System/Qunying/QYBattleWin.cs
index ce7b1ed..78dcd18 100644
--- a/Main/System/Qunying/QYBattleWin.cs
+++ b/Main/System/Qunying/QYBattleWin.cs
@@ -210,7 +210,7 @@
         txtEnemyLV.text = Language.Get("Arena22", info.LV);
         txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
         txtEnemyFightPonit.text = UIHelper.ReplaceLargeArtNum(GetFightPonit(enemyTeam));
-        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)info.PlayerID, (int)info.Face, (int)info.FacePic));
+        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)info.PlayerID, (int)info.Face, (int)info.FacePic)).Forget();
         enemyAvatarCell.SetListener(() =>
         {
             AvatarHelper.TryViewOtherPlayerInfo((int)info.PlayerID, viewPlayerLineupType: (int)BattlePreSetType.Qunying);
@@ -222,7 +222,7 @@
         txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
         long myFightPower = GetFightPonit(myTeam);
         txtMyFightPonit.text = UIHelper.ReplaceLargeArtNum(myFightPower);
-        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID, PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic));
+        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID, PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic)).Forget();
         team = GetTeamHeroList(myTeam);
         myCountry.RefreshOnTeamCountry(team, true);
 
diff --git a/Main/System/Qunying/QYNoteCell.cs b/Main/System/Qunying/QYNoteCell.cs
index 3e547b3..83901b2 100644
--- a/Main/System/Qunying/QYNoteCell.cs
+++ b/Main/System/Qunying/QYNoteCell.cs
@@ -2,6 +2,7 @@
 using UnityEngine;
 using System;
 using UnityEngine.UI;
+using Cysharp.Threading.Tasks;
 
 public class QYNoteCell : CellView
 {
@@ -39,14 +40,14 @@
         //鍙栫帺瀹惰嚜宸辩殑鏁版嵁
         avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                         PlayerDatas.Instance.baseData.face,
-                                        PlayerDatas.Instance.baseData.facePic));
+                                        PlayerDatas.Instance.baseData.facePic)).Forget();
         lvTxt.text = PlayerDatas.Instance.baseData.LV.ToString();
         nameTxt.text = PlayerDatas.Instance.baseData.PlayerName;
         serverTxt.text = ServerListCenter.Instance.GetServerName(UIHelper.GetServerIDByAccount(PlayerDatas.Instance.baseData.AccID));
         stateImg.SetSprite("QYResult" + (arenaGameRec.Value4 == 1 ? 1 : 2));
         rankTxt.text = arenaGameRec.CurRank == 0 ? Language.Get("L1045") : Language.Get("Qunying20") + arenaGameRec.CurRank;
 
-        tagAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaGameRec.Value3, (int)arenaGameRec.Value5, (int)arenaGameRec.Value6));
+        tagAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaGameRec.Value3, (int)arenaGameRec.Value5, (int)arenaGameRec.Value6)).Forget();
 
         tagAvatarCell.SetListener(() =>
         {
diff --git a/Main/System/Qunying/QYRankAwardCell.cs b/Main/System/Qunying/QYRankAwardCell.cs
index 717f2fe..dce38ca 100644
--- a/Main/System/Qunying/QYRankAwardCell.cs
+++ b/Main/System/Qunying/QYRankAwardCell.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using System.Linq;
 using UnityEngine;
 
@@ -43,7 +43,7 @@
                 int itemCellIndex = i;
                 itemCell.SetActive(true);
                 itemCell.Init(new ItemCellModel(rewardArr[i][0], true, rewardArr[i][1]));
-                itemCell.button.SetListener(() => ItemTipUtility.Show(rewardArr[itemCellIndex][0]));
+                itemCell.SetClickListener(() => ItemTipUtility.Show(rewardArr[itemCellIndex][0]));
             }
             else
             {
diff --git a/Main/System/Qunying/QYRankAwardWin.cs b/Main/System/Qunying/QYRankAwardWin.cs
index f6b5787..b0e8bca 100644
--- a/Main/System/Qunying/QYRankAwardWin.cs
+++ b/Main/System/Qunying/QYRankAwardWin.cs
@@ -1,4 +1,4 @@
-using System.Linq;
+锘縰sing System.Linq;
 using UnityEngine;
 using UnityEngine.UI;
 
@@ -118,7 +118,7 @@
                         itemCells[i].SetActive(true);
                         int itemID = awards[i][0];
                         itemCells[i].Init(new ItemCellModel(itemID, false, awards[i][1]));
-                        itemCells[i].button.SetListener(() => ItemTipUtility.Show(itemID));
+                        itemCells[i].SetClickListener(() => ItemTipUtility.Show(itemID));
                     }
                     else
                     {
diff --git a/Main/System/Settlement/SettlementAwardCell.cs b/Main/System/Settlement/SettlementAwardCell.cs
index ea27d8d..307f8f5 100644
--- a/Main/System/Settlement/SettlementAwardCell.cs
+++ b/Main/System/Settlement/SettlementAwardCell.cs
@@ -10,7 +10,7 @@
 
         itemCell.Init(new ItemCellModel(itemID, false, count));
         txtItemName.text = ItemConfig.Get(itemID).ItemName;
-        itemCell.button.SetListener(() =>
+        itemCell.SetClickListener(() =>
         {
             ItemTipUtility.Show(itemID);
         });
diff --git a/Main/System/Sound/SoundPlayer.cs b/Main/System/Sound/SoundPlayer.cs
index 0ff13f4..b4d2f9f 100644
--- a/Main/System/Sound/SoundPlayer.cs
+++ b/Main/System/Sound/SoundPlayer.cs
@@ -93,11 +93,11 @@
         Debug.Log("SoundPlayer 鍒涘缓瀹屾垚");
     }
 
-    public async UniTask PlayBackGroundMusic(int _audioId)
+    public UniTask PlayBackGroundMusic(int _audioId)
     {
         if (_audioId <= 0)
         {
-            return;
+            return UniTask.CompletedTask;
         }
 
         backGroudAudioIdRef = _audioId;
@@ -128,6 +128,7 @@
                 StartCoroutine(Co_BackGroundMusicFadeOutIn(clip, false));
             }
         }
+        return UniTask.CompletedTask;
     }
 
     int backGroudAudioIdRef = 0;
diff --git a/Main/System/Store/HeroSkinGiftWin.cs b/Main/System/Store/HeroSkinGiftWin.cs
index ff7ab86..0d460b9 100644
--- a/Main/System/Store/HeroSkinGiftWin.cs
+++ b/Main/System/Store/HeroSkinGiftWin.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
 
@@ -82,7 +82,7 @@
                 itemCells[i].SetActive(true);
                 int itemID = itemList[i].id;
                 itemCells[i].Init(new ItemCellModel(itemID, true, itemList[i].countEx));
-                itemCells[i].button.SetListener(() => ItemTipUtility.Show(itemID));
+                itemCells[i].SetClickListener(() => ItemTipUtility.Show(itemID));
             }
             else
             {
diff --git a/Main/System/TianziBillborad/TianziBillboradAwardCell.cs b/Main/System/TianziBillborad/TianziBillboradAwardCell.cs
index 29f42de..06691fc 100644
--- a/Main/System/TianziBillborad/TianziBillboradAwardCell.cs
+++ b/Main/System/TianziBillborad/TianziBillboradAwardCell.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using System.Linq;
 using UnityEngine;
 
@@ -44,7 +44,7 @@
                 int itemCellIndex = i;
                 itemCell.SetActive(true);
                 itemCell.Init(new ItemCellModel(rewardArr[i][0], true, rewardArr[i][1]));
-                itemCell.button.SetListener(() => ItemTipUtility.Show(rewardArr[itemCellIndex][0], true));
+                itemCell.SetClickListener(() => ItemTipUtility.Show(rewardArr[itemCellIndex][0], true));
             }
             else
             {
diff --git a/Main/System/TianziBillborad/TianziBillboradPlayerRankCell.cs b/Main/System/TianziBillborad/TianziBillboradPlayerRankCell.cs
index ed6a9d8..f048351 100644
--- a/Main/System/TianziBillborad/TianziBillboradPlayerRankCell.cs
+++ b/Main/System/TianziBillborad/TianziBillboradPlayerRankCell.cs
@@ -34,7 +34,7 @@
                 //鍙栫帺瀹惰嚜宸辩殑鏁版嵁
                 avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                 PlayerDatas.Instance.baseData.face,
-                                                PlayerDatas.Instance.baseData.facePic));
+                                                PlayerDatas.Instance.baseData.facePic)).Forget();
                 rankText.text = Language.Get("L1045");
                 rankValueText.text = "0";//Language.Get("L1125");
                 nameText.text = PlayerDatas.Instance.baseData.PlayerName;
@@ -55,7 +55,7 @@
             officialTitleCell.SetActive(true);
             officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2).Forget();
             avatarCell.SetActive(true);
-            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
+            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4)).Forget();
             viewPlayerId = (int)rankData.id;
             nameText.text = rankData.name1;
             rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue2 + rankData.cmpValue * Constants.ExpPointValue));
diff --git a/Main/System/TianziBillborad/TianziBillboradRankWin.cs b/Main/System/TianziBillborad/TianziBillboradRankWin.cs
index 8e577ad..b7cf0b5 100644
--- a/Main/System/TianziBillborad/TianziBillboradRankWin.cs
+++ b/Main/System/TianziBillborad/TianziBillboradRankWin.cs
@@ -78,7 +78,7 @@
         Refresh();
     }
 
-    protected override async void OpenSubUIByTabIndex()
+    protected override void OpenSubUIByTabIndex()
     {
         transRank.SetActive(functionOrder == 0);
         transAward.SetActive(functionOrder == 1);
diff --git a/Main/System/TianziBillborad/TianziBillboradWin.cs b/Main/System/TianziBillborad/TianziBillboradWin.cs
index 7bdf479..620a83b 100644
--- a/Main/System/TianziBillborad/TianziBillboradWin.cs
+++ b/Main/System/TianziBillborad/TianziBillboradWin.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using Cysharp.Threading.Tasks;
 using UnityEngine;
 using UnityEngine.UI;
@@ -210,7 +210,7 @@
                 int index = i;
                 itemCells[i].SetActive(true);
                 itemCells[i].Init(new ItemCellModel(items[i][0], true, items[i][1]));
-                itemCells[i].button.SetListener(() =>
+                itemCells[i].SetClickListener(() =>
                 {
                     ItemTipUtility.Show(items[index][0], true);
                 });
diff --git a/Main/System/TimingGift/TimingGiftAwardCell.cs b/Main/System/TimingGift/TimingGiftAwardCell.cs
index ac56751..db45f28 100644
--- a/Main/System/TimingGift/TimingGiftAwardCell.cs
+++ b/Main/System/TimingGift/TimingGiftAwardCell.cs
@@ -1,4 +1,4 @@
-using UnityEngine;
+锘縰sing UnityEngine;
 
 public class TimingGiftAwardCell : MonoBehaviour
 {
@@ -11,7 +11,7 @@
         int itemId = gainItemList[index][0];
         int count = gainItemList[index][1];
         itemCell.Init(new ItemCellModel(itemId, false, count));
-        itemCell.button.SetListener(() => { ItemTipUtility.Show(itemId); });
+        itemCell.SetClickListener(() => { ItemTipUtility.Show(itemId); });
     }
 }
 
diff --git a/Main/System/Tip/ItemsConfirmCell.cs b/Main/System/Tip/ItemsConfirmCell.cs
index 253f270..47e9b14 100644
--- a/Main/System/Tip/ItemsConfirmCell.cs
+++ b/Main/System/Tip/ItemsConfirmCell.cs
@@ -12,7 +12,7 @@
         var item = ConfirmCancel.getItems[index];
         int itemID = item.id;
         itemCell.Init(new ItemCellModel(itemID, false, item.countEx));
-        itemCell.button.SetListener(() =>
+        itemCell.SetClickListener(() =>
         {
             ItemTipUtility.Show(itemID);
         });
diff --git a/Main/System/Tip/ScrollTipWin.cs b/Main/System/Tip/ScrollTipWin.cs
index ca98f71..5ddf2e2 100644
--- a/Main/System/Tip/ScrollTipWin.cs
+++ b/Main/System/Tip/ScrollTipWin.cs
@@ -73,7 +73,7 @@
         {
             while (ScrollTip.m_Hints.Count > 0)
             {
-                OnTipReceiveEvent();
+                OnTipReceiveEvent().Forget();
                 await UniTask.Delay(100);
                 if (this == null) return; // destroyed during await
             }
diff --git a/Main/System/UIBase/OneLevelWin.cs b/Main/System/UIBase/OneLevelWin.cs
index cc1df7a..d7b083b 100644
--- a/Main/System/UIBase/OneLevelWin.cs
+++ b/Main/System/UIBase/OneLevelWin.cs
@@ -70,7 +70,7 @@
         isComponentReady = true;
     }
 
-    protected override async void OpenSubUIByTabIndex()
+    protected override void OpenSubUIByTabIndex()
     {
     }
 
diff --git a/Main/System/UIBase/UIJumpManager.cs b/Main/System/UIBase/UIJumpManager.cs
index 4ee0d2d..64c9048 100644
--- a/Main/System/UIBase/UIJumpManager.cs
+++ b/Main/System/UIBase/UIJumpManager.cs
@@ -127,7 +127,7 @@
 			if (UIManager.Instance.IsOpened(config.WinName))
 			{
 				UIManager.Instance.CloseWindow(config.WinName);
-				UIManager.Instance.OpenWindow(config.WinName);
+				UIManager.Instance.OpenWindowAsync(config.WinName).Forget();
 			}
 		}
 
diff --git a/Main/System/WarlordPavilion/WarlordPavilionManager.cs b/Main/System/WarlordPavilion/WarlordPavilionManager.cs
index 847a1d1..e7ba944 100644
--- a/Main/System/WarlordPavilion/WarlordPavilionManager.cs
+++ b/Main/System/WarlordPavilion/WarlordPavilionManager.cs
@@ -1,4 +1,4 @@
-using System;
+锘縰sing System;
 using System.Collections.Generic;
 using LitJson;
 using Cysharp.Threading.Tasks;
@@ -620,7 +620,7 @@
                 int itemID = items[i][0];
                 int count = items[i][1];
                 cells[i].Init(new ItemCellModel(itemID, false, count));
-                cells[i].button.SetListener(() => ItemTipUtility.Show(itemID));
+                cells[i].SetClickListener(() => ItemTipUtility.Show(itemID));
             }
             else
             {
diff --git a/Main/System/WarlordPavilion/WarlordPavilionPlayerRankCell.cs b/Main/System/WarlordPavilion/WarlordPavilionPlayerRankCell.cs
index f66d3ef..ce8b0ad 100644
--- a/Main/System/WarlordPavilion/WarlordPavilionPlayerRankCell.cs
+++ b/Main/System/WarlordPavilion/WarlordPavilionPlayerRankCell.cs
@@ -29,7 +29,7 @@
                 //鍙栫帺瀹惰嚜宸辩殑鏁版嵁
                 avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                 PlayerDatas.Instance.baseData.face,
-                                                PlayerDatas.Instance.baseData.facePic));
+                                                PlayerDatas.Instance.baseData.facePic)).Forget();
                 rankText.text = Language.Get("L1045");
                 rankValueText.text = "";//Language.Get("L1125");
                 nameText.text = PlayerDatas.Instance.baseData.PlayerName;
@@ -50,7 +50,7 @@
             officialTitleCell.SetActive(true);
             officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2).Forget();
             avatarCell.SetActive(true);
-            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
+            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4)).Forget();
             viewPlayerId = (int)rankData.id;
             nameText.text = rankData.name1;
             manager.AnalysisFinishProgress((int)rankData.cmpValue, out int layerNum, out int levelNum);
diff --git a/Main/System/WarlordPavilion/WarlordPavilionWin.cs b/Main/System/WarlordPavilion/WarlordPavilionWin.cs
index ecf5594..9dc29da 100644
--- a/Main/System/WarlordPavilion/WarlordPavilionWin.cs
+++ b/Main/System/WarlordPavilion/WarlordPavilionWin.cs
@@ -246,7 +246,7 @@
                 int itemID = items[i][0];
                 int count = items[i][1];
                 cells[i].Init(new ItemCellModel(itemID, false, count));
-                cells[i].button.SetListener(() => ItemTipUtility.Show(itemID));
+                cells[i].SetClickListener(() => ItemTipUtility.Show(itemID));
             }
             else
             {
diff --git a/Main/Utility/AsyncLazy.cs b/Main/Utility/AsyncLazy.cs
new file mode 100644
index 0000000..6bdffbb
--- /dev/null
+++ b/Main/Utility/AsyncLazy.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using Cysharp.Threading.Tasks;
+using UnityEngine;
+
+/// <summary>
+/// 寮傛鎳掑姞杞斤細淇濊瘉 factory 鍙墽琛屼竴娆★紝鏀寔澶氫釜骞跺彂 await锛堟瘡涓皟鐢ㄨ�呯嫭绔� TCS锛�
+/// 闈炴硾鍨嬭璁★紝閬垮厤鐑洿 AOT 娉涘瀷闂
+/// </summary>
+public class AsyncLazy
+{
+    public delegate UniTask AsyncFactory();
+
+    private readonly AsyncFactory factory;
+    private List<UniTaskCompletionSource> waiters;
+    private bool hasCompleted;
+    private bool isRunning;
+
+    public AsyncLazy(AsyncFactory factory, string debugName = "")
+    {
+        this.factory = factory;
+    }
+
+    public UniTask Task
+    {
+        get
+        {
+            if (hasCompleted)
+            {
+                return UniTask.CompletedTask;
+            }
+
+            var tcs = new UniTaskCompletionSource();
+            if (waiters == null) waiters = new List<UniTaskCompletionSource>();
+            waiters.Add(tcs);
+
+            if (!isRunning)
+            {
+                isRunning = true;
+                Run().Forget();
+            }
+
+            return tcs.Task;
+        }
+    }
+
+    private async UniTaskVoid Run()
+    {
+        try
+        {
+            await factory();
+            hasCompleted = true;
+            if (waiters != null)
+            {
+                for (int i = 0; i < waiters.Count; i++)
+                    waiters[i].TrySetResult();
+                waiters.Clear();
+            }
+        }
+        catch (Exception ex)
+        {
+            if (waiters != null)
+            {
+                for (int i = 0; i < waiters.Count; i++)
+                    waiters[i].TrySetException(ex);
+                waiters.Clear();
+            }
+        }
+    }
+
+    public void Reset()
+    {
+        hasCompleted = false;
+        isRunning = false;
+        waiters = null;
+    }
+}
diff --git a/Main/Utility/AsyncLazy.cs.meta b/Main/Utility/AsyncLazy.cs.meta
new file mode 100644
index 0000000..f1d5077
--- /dev/null
+++ b/Main/Utility/AsyncLazy.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 53996bfe50eb80c4d99f202ede213b25
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Utility/OperationLogCollect.cs b/Main/Utility/OperationLogCollect.cs
index ca01902..132fdd0 100644
--- a/Main/Utility/OperationLogCollect.cs
+++ b/Main/Utility/OperationLogCollect.cs
@@ -8,8 +8,11 @@
 public class OperationLogCollect : Singleton<OperationLogCollect>
 {
 
+#if TEST_BUILD
     const string bugReportUrl = "http://gamecenter.secondworld.net.cn:11000/center/eventreport.php?";
-
+#else
+    const string bugReportUrl = "http://xssgcenter.secondworld.net.cn:11000/center/eventreport.php?";
+#endif
     public void BugReport(string _title, string _content)
     {
         var tables = new Dictionary<string, string>();
@@ -87,8 +90,12 @@
 #endif
     }
 
-
+#if TEST_BUILD
     const string chatReportUrl = "http://gamecenter.secondworld.net.cn:11000/center/eventreport.php?";
+#else
+    const string chatReportUrl = "http://xssgcenter.secondworld.net.cn:11000/center/eventreport.php?";
+#endif
+
     public void ChatReport(string content, string channelName, string toPlayer, int chatType)
     {
 #if !UNITY_EDITOR
diff --git a/Main/Utility/UniTaskExtension.cs b/Main/Utility/UniTaskExtension.cs
index 2ff6255..cab6e65 100644
--- a/Main/Utility/UniTaskExtension.cs
+++ b/Main/Utility/UniTaskExtension.cs
@@ -6,12 +6,12 @@
 {
     public static void DelayFrame(this GameObject go, Action action)
     {
-        DelayFrameInternal(1, action);
+        DelayFrameInternal(1, action).Forget();
     }
 
     public static void DelayFrame(this Component cmp, Action action)
     {
-        DelayFrameInternal(1, action);
+        DelayFrameInternal(1, action).Forget();
     }
 
     private async static UniTask DelayFrameInternal(int frame, Action action)
@@ -22,27 +22,27 @@
 
     public static void DelayFrames(this Component cmp, int frames, Action action)
     {
-        DelayFrameInternal(frames, action);
+        DelayFrameInternal(frames, action).Forget();
     }
 
     public static void DelayFrames(this GameObject go, int frames, Action action)
     {
-        DelayFrameInternal(frames, action);
+        DelayFrameInternal(frames, action).Forget();
     }
 
     public static void DelayFrame(Action action)
     {
-        DelayFrameInternal(1, action);
+        DelayFrameInternal(1, action).Forget();
     }
 
     public static void DelayTime(this GameObject go, float time, Action action)
     {
-        DelayTimeInternal(time, action);
+        DelayTimeInternal(time, action).Forget();
     }
 
     public static void DelayTime(this Component cmp, float time, Action action)
     {
-        DelayTimeInternal(time, action);
+        DelayTimeInternal(time, action).Forget();
     }
 
     private async static UniTask DelayTimeInternal(float time, Action action)

--
Gitblit v1.8.0