guodong 1 жил өмнө
parent
commit
5d87166adb
41 өөрчлөгдсөн 1030 нэмэгдсэн , 248 устгасан
  1. 2 0
      .gitignore
  2. 14 1
      GameClient/Assets/AssetBundleCollectorSetting.asset
  3. 6 0
      GameClient/Assets/Editor/ToolsMenu.cs
  4. 29 0
      GameClient/Assets/Game/HotUpdate/Assets/AssetReleaserHelper.cs
  5. 11 0
      GameClient/Assets/Game/HotUpdate/Assets/AssetReleaserHelper.cs.meta
  6. 16 8
      GameClient/Assets/Game/HotUpdate/Assets/PrefabManager.cs
  7. 33 0
      GameClient/Assets/Game/HotUpdate/Assets/SpriteHelper.cs
  8. 11 0
      GameClient/Assets/Game/HotUpdate/Assets/SpriteHelper.cs.meta
  9. 2 1
      GameClient/Assets/Game/HotUpdate/Controller/GameController.cs
  10. 2 7
      GameClient/Assets/Game/HotUpdate/Data/PhotographSceneManager.cs
  11. 56 0
      GameClient/Assets/Game/HotUpdate/DressUp/DressUpLayerHandler.cs
  12. 11 0
      GameClient/Assets/Game/HotUpdate/DressUp/DressUpLayerHandler.cs.meta
  13. 83 93
      GameClient/Assets/Game/HotUpdate/DressUp/DressUpObj.cs
  14. 50 68
      GameClient/Assets/Game/HotUpdate/DressUp/DressUpUtil.cs
  15. 24 45
      GameClient/Assets/Game/HotUpdate/DressUp/SceneController.cs
  16. 4 4
      GameClient/Assets/Game/HotUpdate/FairyGUI/GFGUIPackage.cs
  17. 14 4
      GameClient/Assets/Game/HotUpdate/HotUpdateDriver.cs
  18. 0 0
      GameClient/Assets/Game/HotUpdate/HotUpdateDriver.cs.meta
  19. 8 0
      GameClient/Assets/Game/HotUpdate/Live2d.meta
  20. 7 0
      GameClient/Assets/Game/HotUpdate/Live2d/Live2dAnimationManager.cs
  21. 11 0
      GameClient/Assets/Game/HotUpdate/Live2d/Live2dAnimationManager.cs.meta
  22. 8 0
      GameClient/Assets/Game/HotUpdate/OperationSystem.meta
  23. 105 0
      GameClient/Assets/Game/HotUpdate/OperationSystem/AsyncOperationBase.cs
  24. 11 0
      GameClient/Assets/Game/HotUpdate/OperationSystem/AsyncOperationBase.cs.meta
  25. 10 0
      GameClient/Assets/Game/HotUpdate/OperationSystem/EOperationStatus.cs
  26. 11 0
      GameClient/Assets/Game/HotUpdate/OperationSystem/EOperationStatus.cs.meta
  27. 107 0
      GameClient/Assets/Game/HotUpdate/OperationSystem/OperationSystem.cs
  28. 11 0
      GameClient/Assets/Game/HotUpdate/OperationSystem/OperationSystem.cs.meta
  29. 1 1
      GameClient/Assets/Game/HotUpdate/Utils/ResPathUtil.cs
  30. 1 1
      GameClient/Assets/Game/HotUpdate/Views/Card/CardFosterView.cs
  31. 1 1
      GameClient/Assets/Game/Launcher/FairyGUI/GFGGLoader.cs
  32. 9 0
      GameClient/Assets/Game/Launcher/GameLauncher.cs
  33. 10 4
      GameClient/Assets/Game/Launcher/HotUpdateProxy/HotUpdateCodeLoader.cs
  34. 45 0
      GameClient/Assets/ResIn/Prefab/HotUpdateDriver.prefab
  35. 7 0
      GameClient/Assets/ResIn/Prefab/HotUpdateDriver.prefab.meta
  36. 8 0
      GameClient/Assets/ResIn/Scene.meta
  37. 273 0
      GameClient/Assets/ResIn/Scene/HotUpdate.unity
  38. 7 0
      GameClient/Assets/ResIn/Scene/HotUpdate.unity.meta
  39. 1 0
      GameClient/Assets/YooAsset/Editor/GFGAsset/Collect/AssetBundleHelper.cs
  40. 1 1
      GameClient/Assets/YooAsset/Runtime/GFG/YooAssetsExtensionGFG.cs
  41. 9 9
      GameClient/UserSettings/EditorUserSettings.asset

+ 2 - 0
.gitignore

@@ -36,3 +36,5 @@
 /GameClient/Assets/StreamingAssets/build_info.meta
 /FGUIProject
 /GameClient/yoo
+/GameClient/Assets/StreamingAssets/yoo.meta
+/GameClient/Assets/StreamingAssets/yoo

+ 14 - 1
GameClient/Assets/AssetBundleCollectorSetting.asset

@@ -168,4 +168,17 @@ MonoBehaviour:
         PackRuleName: PackTopDirectory
         FilterRuleName: CollectAll
         AssetTags: 
-        UserData: 
+        UserData: 
+    - GroupName: scene
+      GroupDesc: 
+      AssetTags: 
+      ActiveRuleName: EnableGroup
+      Collectors:
+      - CollectPath: Assets/ResIn/Scene
+        CollectorGUID: 95e5901e274f74f419ed53268ff767ba
+        CollectorType: 0
+        AddressRuleName: AddressByFileName
+        PackRuleName: PackSeparately
+        FilterRuleName: CollectAll
+        AssetTags: 
+        UserData: 

+ 6 - 0
GameClient/Assets/Editor/ToolsMenu.cs

@@ -359,5 +359,11 @@ namespace GFGEditor
         {
             PlayerPrefs.DeleteAll();
         }
+
+        [MenuItem("Tools/Build/BuildHotUpdateDll")]
+        public static void BuildHotUpdateDll()
+        {
+            BuildDllHelper.BuildHotUpdateDll();
+        }
     }
 }

+ 29 - 0
GameClient/Assets/Game/HotUpdate/Assets/AssetReleaserHelper.cs

@@ -0,0 +1,29 @@
+using UniFramework.Pooling;
+using UnityEngine;
+using YooAsset;
+
+namespace GFGGame
+{
+    public static class AssetReleaserHelper
+    {
+        public static void AddReleaserToSpawnObj(GameObject gameObject, string resPath, SpawnHandle handle)
+        {
+            var assetReleaser = gameObject.GetComponent<AssetReleaser>();
+            if (assetReleaser == null)
+            {
+                assetReleaser = gameObject.AddComponent<AssetReleaser>();
+            }
+            assetReleaser.SetSpawn(resPath, handle);
+        }
+
+        public static void AddReleaserToInstantiateObj(GameObject gameObject, string resPath, AssetOperationHandle handle)
+        {
+            AssetReleaser assetReleaser = gameObject.GetComponent<AssetReleaser>();
+            if (assetReleaser == null)
+            {
+                assetReleaser = gameObject.AddComponent<AssetReleaser>();
+            }
+            assetReleaser.SetRes(resPath, handle);
+        }
+    }
+}

+ 11 - 0
GameClient/Assets/Game/HotUpdate/Assets/AssetReleaserHelper.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3a49f7ce424b901468b27c0395bcf908
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 16 - 8
GameClient/Assets/Game/HotUpdate/Assets/PrefabManager.cs

@@ -1,7 +1,7 @@
 using UniFramework.Pooling;
 using UnityEngine;
-using System.Collections.Generic;
 using YooAsset;
+using System.Threading.Tasks;
 
 namespace GFGGame
 {
@@ -20,16 +20,25 @@ namespace GFGGame
             if (!_entitySpawner.IsGameObjectPoolExisted(resPath))
             {
                 // 创建游戏对象池,销毁时间单位为秒
-                _entitySpawner.CreateGameObjectPoolAsync(resPath, false, 0, 1, 60);
+                _entitySpawner.CreateGameObjectPoolSync(resPath, false, 0, 1, 60);
             }
 
             var handle = _entitySpawner.SpawnSync(resPath);
-            var assetReleaser = handle.GameObj.GetComponent<AssetReleaser>();
-            if (assetReleaser == null)
+            AssetReleaserHelper.AddReleaserToSpawnObj(handle.GameObj, resPath, handle);
+            return handle.GameObj;
+        }
+
+        public async Task<GameObject> SpawnASync(string resPath)
+        {
+            if (!_entitySpawner.IsGameObjectPoolExisted(resPath))
             {
-                assetReleaser = handle.GameObj.AddComponent<AssetReleaser>();
+                // 创建游戏对象池,销毁时间单位为秒
+                _entitySpawner.CreateGameObjectPoolSync(resPath, false, 0, 1, 60);
             }
-            assetReleaser.SetSpawn(resPath, handle);
+
+            var handle = _entitySpawner.SpawnAsync(resPath);
+            await handle.Task;
+            AssetReleaserHelper.AddReleaserToSpawnObj(handle.GameObj, resPath, handle);
             return handle.GameObj;
         }
 
@@ -37,8 +46,7 @@ namespace GFGGame
         {
              AssetOperationHandle handle = YooAssets.LoadAssetSync<GameObject>(resPath);
             GameObject gameObject = handle.InstantiateSync();
-            AssetReleaser assetReleaser = gameObject.AddComponent<AssetReleaser>();
-            assetReleaser.SetRes(resPath, handle);
+            AssetReleaserHelper.AddReleaserToInstantiateObj(gameObject, resPath, handle);
             return gameObject;
         }
 

+ 33 - 0
GameClient/Assets/Game/HotUpdate/Assets/SpriteHelper.cs

@@ -0,0 +1,33 @@
+using UnityEngine;
+using YooAsset;
+
+namespace GFGGame
+{
+    public static class SpriteHelper
+    {
+        /// <summary>
+        /// 移除的时候请用RemoveSpriteFrom,否则不会释放资源
+        /// </summary>
+        /// <param name="spr"></param>
+        /// <param name="resPath"></param>
+        public static void AddSpriteTo(SpriteRenderer spr, string resPath)
+        {
+            RemoveSpriteFrom(spr);
+            var handle = YooAssets.LoadAssetSync<Sprite>(resPath);
+            Sprite sp = handle.AssetObject as Sprite;
+            GameObject gameObject = spr.gameObject;
+            AssetReleaserHelper.AddReleaserToInstantiateObj(gameObject, resPath, handle);
+            spr.sprite = sp;
+        }
+
+        public static void RemoveSpriteFrom(SpriteRenderer spr)
+        {
+            spr.sprite = null;
+            AssetReleaser assetReleaser =  spr.gameObject.GetComponent<AssetReleaser>();
+            if(assetReleaser != null)
+            {
+                GameObject.Destroy(assetReleaser);
+            }
+        }
+    }
+}

+ 11 - 0
GameClient/Assets/Game/HotUpdate/Assets/SpriteHelper.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: afd3d1ebb268b184abe8eab3a64c043d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

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

@@ -50,7 +50,8 @@ namespace GFGGame
                 GameConfig.InitData(data);
                 //显示登录
                 LoginController.ShowLogin();
-                //ItemCfgArray.Instance.GetAllDataAsync();
+                //_ = ItemCfgArray.Instance.GetAllDataAsync();
+                InitAllCfgsCache.Instance.InitAll();
             });
         }
 

+ 2 - 7
GameClient/Assets/Game/HotUpdate/Data/PhotographSceneManager.cs

@@ -71,7 +71,7 @@ namespace GFGGame
             string res = value == "n" ? itemCfg.res : string.Format("{0}_{1}", itemCfg.res, value);
 
             string resPath = ResPathUtil.GetDressUpAnimationPath(res);
-            if (YooAssets.CheckDressUpResExist(resPath))
+            if (YooAssets.CheckResExist(resPath))
             {
                 DressUpUtil.AddItem(itemId, sceneObj, false, true, parentGameObj, resLayer);
                 parentGameObj.transform.localPosition = Vector3.zero;
@@ -114,12 +114,7 @@ namespace GFGGame
                 tf.gameObject.AddComponent<SpriteRenderer>();
                 spr = tf.GetComponent<SpriteRenderer>();
             }
-            //Sprite sp = GFGAsset.Load<Sprite>(resPath);
-            var handle = YooAssets.LoadAssetSync<Sprite>(resPath);
-            Sprite sp = handle.AssetObject as Sprite;
-            DressUpUtil.AddAssetReleaser(tf.gameObject, resPath, handle);
-            if (sp == null) return;
-            spr.sprite = sp;
+            SpriteHelper.AddSpriteTo(spr, resPath);
             spr.size = spr.sprite.bounds.size;//将节点设置为原图大小
 
         }

+ 56 - 0
GameClient/Assets/Game/HotUpdate/DressUp/DressUpLayerHandler.cs

@@ -0,0 +1,56 @@
+using FairyGUI;
+using UnityEngine;
+
+namespace GFGGame
+{
+    public class DressUpLayerHandler : AsyncOperationBase
+    {
+        private ItemCfg itemCfg;
+        private bool showAni;
+        private int layerId;
+
+        public DressUpLayerHandler(ItemCfg itemCfg, GameObject parentObj, int layerId, bool needSetMask, bool showAni = true)
+        {
+            this.itemCfg = itemCfg;
+            this.showAni = showAni;
+            this.layerId = layerId;
+        }
+
+
+        public void UpdateView()
+        {
+
+        }
+
+        internal override void Start()
+        {
+            
+        }
+
+        internal override void Update()
+        {
+            
+        }
+
+
+        private void CheckRes()
+        {
+
+            ItemTypeCfg typeCfg = ItemTypeCfgArray.Instance.GetCfg(itemCfg.subType);
+
+            string res = ResPathUtil.GetDressUpItemLayerRes(itemCfg, layerId);
+            int sortingOrder = typeCfg.defaultLayer;
+            if (layerId == 2)
+            {
+                sortingOrder = typeCfg.specialLayer;
+            }
+            else if (layerId == 3)
+            {
+                sortingOrder = typeCfg.thirdlLayer;
+            }
+
+
+        }
+
+    }
+}

+ 11 - 0
GameClient/Assets/Game/HotUpdate/DressUp/DressUpLayerHandler.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 993299cc05854eb4d92a800afd44bd0b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 83 - 93
GameClient/Assets/Game/HotUpdate/DressUp/DressUpObj.cs

@@ -3,6 +3,7 @@ using UnityEngine;
 using System;
 using System.Linq;
 using ET;
+using FairyGUI;
 
 namespace GFGGame
 {
@@ -15,12 +16,6 @@ namespace GFGGame
 
     public class DressUpObj
     {
-        private GameObject _sceneObj;
-        private GameObject _roleObj;
-        private bool _needSetMask;
-        private bool _showSceneType = true;
-        private bool _showBg = true;
-        private DressUpData _dressUpData = new DressUpData();
 
         public int bgId
         {
@@ -62,6 +57,7 @@ namespace GFGGame
             }
         }
 
+
         /// <summary>
         /// 
         /// </summary>
@@ -92,6 +88,7 @@ namespace GFGGame
                 TakeOffAll();
                 PutOnDressUpData(tempData);
             }
+            Timers.inst.AddUpdate(OnUpdate);
         }
 
         public DressUpData DressUpDataClone()
@@ -183,7 +180,7 @@ namespace GFGGame
                         {
                             TryCancelActionWhenPutOn(itemId);
                         }
-                        checkRemoveSameType(subType);
+                        CheckRemoveSameType(subType);
                         Add(itemId);
                     }
                 }
@@ -201,39 +198,6 @@ namespace GFGGame
             }
         }
 
-        public void checkRemoveSameType(int type)
-        {
-            int count = 0;
-            int firstTeshuId = 0;
-            for (int i = 0; i < _dressUpData.itemList.Count; i++)
-            {
-                int itemID = (int)_dressUpData.itemList[i];
-                int subType = ItemUtilCS.GetItemSubType(itemID);
-                if (subType == type
-                    || (type == ConstDressUpItemType.LIAN_YI_QUN && (subType == ConstDressUpItemType.SHANG_YI || subType == ConstDressUpItemType.XIA_ZHUANG || subType == ConstDressUpItemType.NEI_DA))
-                    || (type == ConstDressUpItemType.SHANG_YI && subType == ConstDressUpItemType.LIAN_YI_QUN)
-                    || (type == ConstDressUpItemType.XIA_ZHUANG && subType == ConstDressUpItemType.LIAN_YI_QUN)
-                    || (type == ConstDressUpItemType.NEI_DA && subType == ConstDressUpItemType.LIAN_YI_QUN))
-                {
-                    Remove(itemID);
-                    i--;
-                }
-                if (subType > ConstDressUpItemType.TE_SHU)
-                {
-                    if (count == 0)
-                    {
-                        firstTeshuId = itemID;
-                    }
-                    count++;
-                }
-            }
-            if (type > ConstDressUpItemType.TE_SHU && count >= 3)
-            {
-                //特殊饰品最多穿三件,第四件会自动顶掉第一件
-                Remove(firstTeshuId);
-            }
-        }
-
         //脱掉所有换装,换成默认装(不处理背景)
         public void TakeOffAll(bool checkDefault = true)
         {
@@ -268,20 +232,6 @@ namespace GFGGame
             }
         }
 
-        //当穿一件部件时检查是否需要取消动作,如果需要则取消该动作
-        public void TryCancelActionWhenPutOn(int itemId)
-        {
-            if (_dressUpData.actionId > 0)
-            {
-                bool replaceableByAction = SuitCfgArray.Instance.CheckItemReaplaceableOnAction(itemId, _dressUpData.actionId);
-                if (!replaceableByAction)
-                {
-                    CancelAction();
-                    _dressUpData.actionId = 0;
-                }
-            }
-        }
-
         /// <summary>
         /// 尝试穿戴配置套装
         /// </summary>
@@ -332,35 +282,6 @@ namespace GFGGame
             checkDefaultItem();
         }
 
-        //穿上一个动作
-        private void PutOnAction(int actionId)
-        {
-            bool hasSuitActionRes = DressUpMenuSuitDataManager.CheckSuitHasActionRes(actionId);
-            _dressUpData.actionId = actionId;
-            if(hasSuitActionRes)
-            {
-                foreach (int itemId in itemList)
-                {
-                    if(!DressUpMenuItemCfg1Array.Instance.CheckIsSceneType(itemId))
-                    {
-                        //场景类型不受动作影响并且本来就有动画,对非场景类型处理
-                        AddOrRemove(itemId, false, DressUpOption.Remove);
-                        bool notInAction = SuitCfgArray.Instance.CheckItemNotInAction(itemId);
-                        if (notInAction)
-                        {
-                            //更新成动画模式
-                            AddOrRemove(itemId, false, DressUpOption.Add);
-                        }
-                    }
-                }
-            }
-            else
-            {
-                CancelAction(true);
-            }
-            checkDefaultItem();
-        }
-
         //取消动作
         public void CancelAction(bool changeToStand = false)
         {
@@ -454,24 +375,54 @@ namespace GFGGame
             checkDefaultItem();
         }
 
-        public int GetItemIdBuyType(int subType)
+        #region private
+        private GameObject _sceneObj;
+        private GameObject _roleObj;
+        private bool _needSetMask;
+        private bool _showSceneType = true;
+        private bool _showBg = true;
+        private DressUpData _dressUpData = new DressUpData();
+        //穿上一个动作
+        private void PutOnAction(int actionId)
         {
-            for (int i = 0; i < itemList.Count; i++)
+            bool hasSuitActionRes = DressUpMenuSuitDataManager.CheckSuitHasActionRes(actionId);
+            _dressUpData.actionId = actionId;
+            if (hasSuitActionRes)
             {
-                if (itemList[i] != ConstItemID.DEFULT_LIAN_YI_QUN && itemList[i] != ConstItemID.DEFULT_NEI_DA && itemList[i] != ConstItemID.DEFULT_XIA_ZHUANG && itemList[i] != ConstItemID.DEFULT_FA_XING)
+                foreach (int itemId in itemList)
                 {
-                    if (subType == ItemUtilCS.GetItemSubType(itemList[i]))
+                    if (!DressUpMenuItemCfg1Array.Instance.CheckIsSceneType(itemId))
                     {
-                        return itemList[i];
+                        //场景类型不受动作影响并且本来就有动画,对非场景类型处理
+                        AddOrRemove(itemId, false, DressUpOption.Remove);
+                        bool notInAction = SuitCfgArray.Instance.CheckItemNotInAction(itemId);
+                        if (notInAction)
+                        {
+                            //更新成动画模式
+                            AddOrRemove(itemId, false, DressUpOption.Add);
+                        }
                     }
-
                 }
             }
-            if (suitId > 0)
+            else
             {
-                return suitId;
+                CancelAction(true);
+            }
+            checkDefaultItem();
+        }
+
+        //当穿一件部件时检查是否需要取消动作,如果需要则取消该动作
+        private void TryCancelActionWhenPutOn(int itemId)
+        {
+            if (_dressUpData.actionId > 0)
+            {
+                bool replaceableByAction = SuitCfgArray.Instance.CheckItemReaplaceableOnAction(itemId, _dressUpData.actionId);
+                if (!replaceableByAction)
+                {
+                    CancelAction();
+                    _dressUpData.actionId = 0;
+                }
             }
-            return 0;
         }
 
         private void Add(int itemId)
@@ -506,6 +457,39 @@ namespace GFGGame
             }
         }
 
+        private void CheckRemoveSameType(int type)
+        {
+            int count = 0;
+            int firstTeshuId = 0;
+            for (int i = 0; i < _dressUpData.itemList.Count; i++)
+            {
+                int itemID = (int)_dressUpData.itemList[i];
+                int subType = ItemUtilCS.GetItemSubType(itemID);
+                if (subType == type
+                    || (type == ConstDressUpItemType.LIAN_YI_QUN && (subType == ConstDressUpItemType.SHANG_YI || subType == ConstDressUpItemType.XIA_ZHUANG || subType == ConstDressUpItemType.NEI_DA))
+                    || (type == ConstDressUpItemType.SHANG_YI && subType == ConstDressUpItemType.LIAN_YI_QUN)
+                    || (type == ConstDressUpItemType.XIA_ZHUANG && subType == ConstDressUpItemType.LIAN_YI_QUN)
+                    || (type == ConstDressUpItemType.NEI_DA && subType == ConstDressUpItemType.LIAN_YI_QUN))
+                {
+                    Remove(itemID);
+                    i--;
+                }
+                if (subType > ConstDressUpItemType.TE_SHU)
+                {
+                    if (count == 0)
+                    {
+                        firstTeshuId = itemID;
+                    }
+                    count++;
+                }
+            }
+            if (type > ConstDressUpItemType.TE_SHU && count >= 3)
+            {
+                //特殊饰品最多穿三件,第四件会自动顶掉第一件
+                Remove(firstTeshuId);
+            }
+        }
+
         //与身上的散件对比差异然后添加
         private void CompareAndAddItemList(bool oldIsAction, bool newIsAction, List<int> targetItemList)
         {
@@ -664,6 +648,12 @@ namespace GFGGame
             }
         }
 
-        
+        private void OnUpdate(object param)
+        {
+
+        }
+
+        #endregion
+
     }
 }

+ 50 - 68
GameClient/Assets/Game/HotUpdate/DressUp/DressUpUtil.cs

@@ -23,65 +23,61 @@ namespace GFGGame
         public static void AddItem(int itemID, GameObject sceneObj, bool needSetMask = false, bool showAni = true, GameObject parentObj = null, int resLayer = 0)
         {
             ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemID);
-            if (itemCfg != null)
+            if (itemCfg == null) return;
+
+            if (parentObj == null)
             {
-                // GameObject parentObj = null;
-                if (parentObj == null)
+                if (itemCfg.subType == ConstDressUpItemType.BEI_JING || DressUpMenuItemCfg1Array.Instance.CheckIsSceneTypeBySubType(itemCfg.subType))
                 {
-                    if (itemCfg.subType == ConstDressUpItemType.BEI_JING || DressUpMenuItemCfg1Array.Instance.CheckIsSceneTypeBySubType(itemCfg.subType))
-                    {
-                        parentObj = sceneObj;
-                    }
-                    else
-                    {
-                        //角色
-                        Transform role = sceneObj.transform.Find(ROLE_OBJ_NAME);
-                        parentObj = role.gameObject;
-                    }
+                    parentObj = sceneObj;
                 }
-                showAni = showAni || itemCfg.subType == ConstDressUpItemType.ZHUANG_RONG;
-                if (resLayer > 0)
+                else
                 {
-                    string layerName = "";
-                    switch (resLayer)
-                    {
-                        case 1:
-                            layerName = itemCfg.resLayer1;
-                            break;
-                        case 2:
-                            layerName = itemCfg.resLayer2;
-                            break;
-                        case 3:
-                            layerName = itemCfg.resLayer3;
-                            break;
-                    }
-                    if (!string.IsNullOrEmpty(layerName))
-                    {
-                        updateLayerRes(itemCfg, parentObj, resLayer, needSetMask, showAni);
-                    }
-                    // updateLayerRes(itemCfg, parentObj, resLayer, resLayer == 2, needSetMask, showAni);
+                    //角色
+                    Transform role = sceneObj.transform.Find(ROLE_OBJ_NAME);
+                    parentObj = role.gameObject;
                 }
-                else
+            }
+            showAni = showAni || itemCfg.subType == ConstDressUpItemType.ZHUANG_RONG;
+            if (resLayer > 0)
+            {
+                string layerName = "";
+                switch (resLayer)
+                {
+                    case 1:
+                        layerName = itemCfg.resLayer1;
+                        break;
+                    case 2:
+                        layerName = itemCfg.resLayer2;
+                        break;
+                    case 3:
+                        layerName = itemCfg.resLayer3;
+                        break;
+                }
+                if (!string.IsNullOrEmpty(layerName))
+                {
+                    updateLayerRes(itemCfg, parentObj, resLayer, needSetMask, showAni);
+                }
+            }
+            else
+            {
+                //普通层
+                if (!string.IsNullOrEmpty(itemCfg.resLayer1))
+                {
+                    updateLayerRes(itemCfg, parentObj, 1, needSetMask, showAni);
+                }
+                //第二层
+                if (!string.IsNullOrEmpty(itemCfg.resLayer2))
                 {
-                    //普通层
-                    if (!string.IsNullOrEmpty(itemCfg.resLayer1))
-                    {
-                        updateLayerRes(itemCfg, parentObj, 1, needSetMask, showAni);
-                    }
-                    //第二层
-                    if (!string.IsNullOrEmpty(itemCfg.resLayer2))
-                    {
-
-                        updateLayerRes(itemCfg, parentObj, 2, needSetMask, showAni);
-                    }
-                    //第三层
-                    if (!string.IsNullOrEmpty(itemCfg.resLayer3))
-                    {
 
-                        updateLayerRes(itemCfg, parentObj, 3, needSetMask, showAni);
-                    }
+                    updateLayerRes(itemCfg, parentObj, 2, needSetMask, showAni);
                 }
+                //第三层
+                if (!string.IsNullOrEmpty(itemCfg.resLayer3))
+                {
 
+                    updateLayerRes(itemCfg, parentObj, 3, needSetMask, showAni);
+                }
             }
         }
 
@@ -207,16 +203,6 @@ namespace GFGGame
             }
         }
 
-        public static void AddAssetReleaser(GameObject gameObj, string resPath, AssetOperationHandle handle)
-        {
-            var assetReleaser = gameObj.GetComponent<AssetReleaser>();
-            if (assetReleaser == null)
-            {
-                assetReleaser = gameObj.AddComponent<AssetReleaser>();
-            }
-            assetReleaser.SetRes(resPath, handle);
-        }
-
         private static void updateLayerRes(ItemCfg itemCfg, GameObject parentObj, int layerId, bool needSetMask, bool showAni = true)
         {
 
@@ -302,7 +288,7 @@ namespace GFGGame
 
         private static GameObject AddSpriteObj(string resPath, string ext, string objName, GameObject parentObj, int sortingOrder, bool needSetMask)
         {
-            if (!YooAssets.CheckDressUpResExist(resPath))
+            if (!YooAssets.CheckResExist(resPath))
             {
                 return null;
             }
@@ -326,11 +312,7 @@ namespace GFGGame
             float tx, ty;
             LoadSpritePos(resPath, out tx, out ty);
             gameObj.transform.localPosition = new Vector3(tx, ty, gameObj.transform.localPosition.z);
-            //Sprite sp = GFGAsset.Load<Sprite>(resPath);
-            var handle = YooAssets.LoadAssetSync<Sprite>(resPath);
-            Sprite sp = handle.AssetObject as Sprite;
-            AddAssetReleaser(gameObj, resPath, handle);
-            spr.sprite = sp;
+            SpriteHelper.AddSpriteTo(spr, resPath);
             spr.sortingOrder = sortingOrder;
 
             if (needSetMask)
@@ -460,7 +442,7 @@ namespace GFGGame
 
         public static GameObject CreateObj(string resPath)
         {
-            if (!YooAssets.CheckDressUpResExist(resPath))
+            if (!YooAssets.CheckResExist(resPath))
             {
                 return null;
             }
@@ -477,7 +459,7 @@ namespace GFGGame
             resPath = resPath.Substring(0, index) + ".bytes";
             //resPath = resPath.Replace(".png", ".bytes");
             //resPath = resPath.Replace(".jpg", ".bytes");
-            if (YooAssets.CheckDressUpResExist(resPath))
+            if (YooAssets.CheckResExist(resPath))
             {
                 //var asset = GFGAsset.Load<TextAsset>(resPath);
                 var handle = YooAssets.LoadAssetSync<TextAsset>(resPath);

+ 24 - 45
GameClient/Assets/Game/HotUpdate/DressUp/SceneController.cs

@@ -7,20 +7,20 @@ namespace GFGGame
 {
     public class SceneController
     {
-        public static void UpdateLoginScene(GameObject sceneObj)
-        {
-            //背景
-            Transform tf = sceneObj.transform.Find("Bg");
-            SpriteRenderer spr = tf.GetComponent<SpriteRenderer>();
-            var resPath = ResPathUtil.GetSceneBgPath("jhsy_bg");
-            //Sprite sp = GFGAsset.Load<Sprite>(resPath);
-            var handle = YooAssets.LoadAssetSync<Sprite>(resPath);
-            Sprite sp = handle.AssetObject as Sprite;
-            DressUpUtil.AddAssetReleaser(tf.gameObject, resPath, handle);
-            spr.sprite = sp;
-            //角色
-            DressUpUtil.UpdateBody("ui_loginrole", sceneObj);
-        }
+        //public static void UpdateLoginScene(GameObject sceneObj)
+        //{
+        //    //背景
+        //    Transform tf = sceneObj.transform.Find("Bg");
+        //    SpriteRenderer spr = tf.GetComponent<SpriteRenderer>();
+        //    var resPath = ResPathUtil.GetSceneBgPath("jhsy_bg");
+        //    //Sprite sp = GFGAsset.Load<Sprite>(resPath);
+        //    var handle = YooAssets.LoadAssetSync<Sprite>(resPath);
+        //    Sprite sp = handle.AssetObject as Sprite;
+        //    DressUpUtil.AddAssetReleaser(tf.gameObject, resPath, handle);
+        //    spr.sprite = sp;
+        //    //角色
+        //    DressUpUtil.UpdateBody("ui_loginrole", sceneObj);
+        //}
 
         public static void UpdateMainScene(GameObject sceneObj)
         {
@@ -28,20 +28,12 @@ namespace GFGGame
             Transform tf = sceneObj.transform.Find("Bg");
             SpriteRenderer spr = tf.GetComponent<SpriteRenderer>();
             var resPath = ResPathUtil.GetBgImgPath("zjm_1");
-            //Sprite sp = GFGAsset.Load<Sprite>(resPath);
-            var handle = YooAssets.LoadAssetSync<Sprite>(resPath);
-            Sprite sp = handle.AssetObject as Sprite;
-            DressUpUtil.AddAssetReleaser(tf.gameObject, resPath, handle);
-            spr.sprite = sp;
+            SpriteHelper.AddSpriteTo(spr, resPath);
             //背景1
             Transform tf1 = sceneObj.transform.Find("Bg1");
             SpriteRenderer spr1 = tf1.GetComponent<SpriteRenderer>();
             var resPath1 = ResPathUtil.GetBgImgPath("fuben_bg");
-            //Sprite sp1 = GFGAsset.Load<Sprite>(resPath1);
-            handle = YooAssets.LoadAssetSync<Sprite>(resPath);
-            Sprite sp1 = handle.AssetObject as Sprite;
-            DressUpUtil.AddAssetReleaser(tf1.gameObject, resPath, handle);
-            spr1.sprite = sp1;
+            SpriteHelper.AddSpriteTo(spr1, resPath);
             //角色
             CustomSuitData suitSavedData = CustomSuitDataManager.GetCurrentSuitData();
             MyDressUpHelper.dressUpObj.setSceneObj(sceneObj.transform.Find("Scene").gameObject, false, true, null, false);
@@ -57,26 +49,21 @@ namespace GFGGame
 
             if (value == "0")
             {
-                bgSpr.sprite = null;
+                SpriteHelper.RemoveSpriteFrom(bgSpr);
             }
             else
             {
                 var resPath = ResPathUtil.GetSceneBgPath(value);
-                //Sprite sp = GFGAsset.Load<Sprite>(resPath);
-                var handle = YooAssets.LoadAssetSync<Sprite>(resPath);
-                Sprite sp = handle.AssetObject as Sprite;
-                DressUpUtil.AddAssetReleaser(bg.gameObject, resPath, handle);
-
                 if (bgSpr.sprite == null)
                 {
-                    bgSpr.sprite = sp;
+                    SpriteHelper.AddSpriteTo(bgSpr, resPath);
                 }
                 else
                 {
                     StoryDialogDataManager.Instance.waitBgChange = true;
                     StoryDialogDataManager.Instance.dialogShowDelay = 0.4f;
                     SetSpriteRendererAlpha(bgSpr, 1f);
-                    bgNextSpr.sprite = sp;
+                    SpriteHelper.AddSpriteTo(bgNextSpr, resPath);
                     FairyGUI.Timers.inst.StartCoroutine(LastBgFadeOut());
                     
                     IEnumerator LastBgFadeOut()
@@ -91,9 +78,9 @@ namespace GFGGame
                                 }
                                 else
                                 {
-                                    bgSpr.sprite = sp;
+                                    SpriteHelper.AddSpriteTo(bgSpr, resPath);
                                     SetSpriteRendererAlpha(bgSpr, 1f);
-                                    bgNextSpr.sprite = null;
+                                    SpriteHelper.RemoveSpriteFrom(bgNextSpr);
                                     break;
                                 }
                             }
@@ -115,18 +102,14 @@ namespace GFGGame
             SpriteRenderer spr = tf.GetComponent<SpriteRenderer>();
             if (value == "0")
             {
-                spr.sprite = null;
+                SpriteHelper.RemoveSpriteFrom(spr);
             }
             else
             {
                 StoryDialogDataManager.Instance.waitPicFade = true;
 
                 var resPath = ResPathUtil.GetNpcPicSPath(value);
-                //Sprite sp = GFGAsset.Load<Sprite>(resPath);
-                var handle = YooAssets.LoadAssetSync<Sprite>(resPath);
-                Sprite sp = handle.AssetObject as Sprite;
-                DressUpUtil.AddAssetReleaser(tf.gameObject, resPath, handle);
-                spr.sprite = sp;
+                SpriteHelper.AddSpriteTo(spr, resPath);
                 SetSpriteRendererAlpha(spr, 0f);
                 FairyGUI.Timers.inst.StartCoroutine(UpdateDialogPicAlpha());
 
@@ -168,11 +151,7 @@ namespace GFGGame
             Transform tf = sceneObj.transform.Find("Npc");
             SpriteRenderer spr = tf.GetComponent<SpriteRenderer>();
             var resPath = ResPathUtil.GetNpcPicFPath(value);
-            //Sprite sp = GFGAsset.Load<Sprite>(resPath);
-            var handle = YooAssets.LoadAssetSync<Sprite>(resPath);
-            Sprite sp = handle.AssetObject as Sprite;
-            DressUpUtil.AddAssetReleaser(tf.gameObject, resPath, handle);
-            spr.sprite = sp;
+            SpriteHelper.AddSpriteTo(spr, resPath);
         }
 
     }

+ 4 - 4
GameClient/Assets/Game/HotUpdate/FairyGUI/GFGUIPackage.cs

@@ -40,7 +40,7 @@ namespace GFGGame
             var uiPackage = UIPackage.AddPackage(textAsset.bytes, descFilePath, (string name, string extension, System.Type type, PackageItem item) =>
             {
                 string location = name + extension;
-                if (!YooAssets.CheckDressUpResExist(location))
+                if (!YooAssets.CheckResExist(location))
                 {
                     return;
                 }
@@ -53,7 +53,7 @@ namespace GFGGame
                     if (tex != null)
                     {
                         string location = name + "!a" + extension;
-                        if (YooAssets.CheckDressUpResExist(location))
+                        if (YooAssets.CheckResExist(location))
                         {
                             AssetOperationHandle handleAlpha = YooAssets.LoadAssetAsync(location, type);
                             CacheAssetHandle(descFilePath, handleAlpha);
@@ -88,7 +88,7 @@ namespace GFGGame
             var uiPackage = UIPackage.AddPackage(textAsset.bytes, descFilePath, (string name, string extension, System.Type type, PackageItem item) =>
             {
                 string location = name + extension;
-                if (!YooAssets.CheckDressUpResExist(location))
+                if (!YooAssets.CheckResExist(location))
                 {
                     return;
                 }
@@ -101,7 +101,7 @@ namespace GFGGame
                     if (tex != null)
                     {
                         string location = name + "!a" + extension;
-                        if (YooAssets.CheckDressUpResExist(location))
+                        if (YooAssets.CheckResExist(location))
                         {
                             AssetOperationHandle handleAlpha = YooAssets.LoadAssetAsync(location, type);
                             CacheAssetHandle(descFilePath, handleAlpha);

+ 14 - 4
GameClient/Assets/Game/HotUpdate/HotUpdateEntry.cs → GameClient/Assets/Game/HotUpdate/HotUpdateDriver.cs

@@ -1,12 +1,11 @@
 using UniFramework.Pooling;
 using UnityEngine;
 
-namespace GFGGame.HotUpdate
+namespace GFGGame
 {
-    public class HotUpdateEntry
+    public class HotUpdateDriver: MonoBehaviour
     {
-
-        public static void Start()
+        private void Awake()
         {
             //UniFramework
             // 初始化对象池系统
@@ -15,8 +14,19 @@ namespace GFGGame.HotUpdate
             LitJson.UnityTypeBindings.Register();
             //ET
             ETManager.Instance.Init();
+            //Game
+            OperationSystem.Initialize();
             GameController.Start();
         }
 
+        private void Update()
+        {
+            OperationSystem.Update();
+        }
+
+        private void OnDestroy()
+        {
+            OperationSystem.DestroyAll();
+        }
     }
 }

+ 0 - 0
GameClient/Assets/Game/HotUpdate/HotUpdateEntry.cs.meta → GameClient/Assets/Game/HotUpdate/HotUpdateDriver.cs.meta


+ 8 - 0
GameClient/Assets/Game/HotUpdate/Live2d.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 63f511c35f3f81548b6e91cb2890def0
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 7 - 0
GameClient/Assets/Game/HotUpdate/Live2d/Live2dAnimationManager.cs

@@ -0,0 +1,7 @@
+namespace GFGGame
+{
+    public class Live2dAnimationManager : SingletonBase<Live2dAnimationManager>
+    {
+
+    }
+}

+ 11 - 0
GameClient/Assets/Game/HotUpdate/Live2d/Live2dAnimationManager.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ca015150a731cfa4ca9db9961508d317
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
GameClient/Assets/Game/HotUpdate/OperationSystem.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e48c7046015703149966bfa5a932ac53
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 105 - 0
GameClient/Assets/Game/HotUpdate/OperationSystem/AsyncOperationBase.cs

@@ -0,0 +1,105 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace GFGGame
+{
+	public abstract class AsyncOperationBase : IEnumerator
+	{
+		// 用户请求的回调
+		private Action<AsyncOperationBase> _callback;
+
+		/// <summary>
+		/// 状态
+		/// </summary>
+		public EOperationStatus Status { get; protected set; } = EOperationStatus.None;
+
+		/// <summary>
+		/// 错误信息
+		/// </summary>
+		public string Error { get; protected set; }
+
+		/// <summary>
+		/// 处理进度
+		/// </summary>
+		public float Progress { get; protected set; }
+
+		/// <summary>
+		/// 是否已经完成
+		/// </summary>
+		public bool IsDone
+		{
+			get
+			{
+				return Status == EOperationStatus.Failed || Status == EOperationStatus.Succeed;
+			}
+		}
+
+		/// <summary>
+		/// 完成事件
+		/// </summary>
+		public event Action<AsyncOperationBase> Completed
+		{
+			add
+			{
+				if (IsDone)
+					value.Invoke(this);
+				else
+					_callback += value;
+			}
+			remove
+			{
+				_callback -= value;
+			}
+		}
+
+		/// <summary>
+		/// 异步操作任务
+		/// </summary>
+		public Task Task
+		{
+			get
+			{
+				if (_taskCompletionSource == null)
+				{
+					_taskCompletionSource = new TaskCompletionSource<object>();
+					if (IsDone)
+						_taskCompletionSource.SetResult(null);
+				}
+				return _taskCompletionSource.Task;
+			}
+		}
+
+		internal abstract void Start();
+		internal abstract void Update();
+		internal void Finish()
+		{
+			Progress = 1f;
+			_callback?.Invoke(this);
+			if (_taskCompletionSource != null)
+				_taskCompletionSource.TrySetResult(null);
+		}
+
+		/// <summary>
+		/// 清空完成回调
+		/// </summary>
+		protected void ClearCompletedCallback()
+		{
+			_callback = null;
+		}
+
+		#region 异步编程相关
+		bool IEnumerator.MoveNext()
+		{
+			return !IsDone;
+		}
+		void IEnumerator.Reset()
+		{
+		}
+		object IEnumerator.Current => null;
+
+		private TaskCompletionSource<object> _taskCompletionSource;
+		#endregion
+	}
+}

+ 11 - 0
GameClient/Assets/Game/HotUpdate/OperationSystem/AsyncOperationBase.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ee8648ffd2c1722449ceadf2ff08184e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 10 - 0
GameClient/Assets/Game/HotUpdate/OperationSystem/EOperationStatus.cs

@@ -0,0 +1,10 @@
+
+namespace GFGGame
+{
+	public enum EOperationStatus
+	{
+		None,
+		Succeed,
+		Failed
+	}
+}

+ 11 - 0
GameClient/Assets/Game/HotUpdate/OperationSystem/EOperationStatus.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f9ffba02477bcbf4086f6308d706e281
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 107 - 0
GameClient/Assets/Game/HotUpdate/OperationSystem/OperationSystem.cs

@@ -0,0 +1,107 @@
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+
+namespace GFGGame
+{
+	internal class OperationSystem
+	{
+		private static readonly List<AsyncOperationBase> _operations = new List<AsyncOperationBase>(100);
+		private static readonly List<AsyncOperationBase> _addList = new List<AsyncOperationBase>(100);
+		private static readonly List<AsyncOperationBase> _removeList = new List<AsyncOperationBase>(100);
+
+		// 计时器相关
+		private static Stopwatch _watch;
+		private static long _frameTime;
+
+		/// <summary>
+		/// 异步操作的最小时间片段
+		/// </summary>
+		public static long MaxTimeSlice { set; get; } = long.MaxValue;
+
+		/// <summary>
+		/// 处理器是否繁忙
+		/// </summary>
+		public static bool IsBusy
+		{
+			get
+			{
+				return _watch.ElapsedMilliseconds - _frameTime >= MaxTimeSlice;
+			}
+		}
+
+
+		/// <summary>
+		/// 初始化异步操作系统
+		/// </summary>
+		public static void Initialize()
+		{
+			_watch = Stopwatch.StartNew();
+		}
+
+		/// <summary>
+		/// 更新异步操作系统
+		/// </summary>
+		public static void Update()
+		{
+			_frameTime = _watch.ElapsedMilliseconds;
+
+			// 添加新的异步操作
+			if (_addList.Count > 0)
+			{
+				for (int i = 0; i < _addList.Count; i++)
+				{
+					var operation = _addList[i];
+					_operations.Add(operation);
+				}
+				_addList.Clear();
+			}
+
+			// 更新所有的异步操作
+			foreach (var operation in _operations)
+			{
+				if (IsBusy)
+					break;
+
+				operation.Update();
+				if (operation.IsDone)
+				{
+					_removeList.Add(operation);
+					operation.Finish();
+				}
+			}
+
+			// 移除已经完成的异步操作
+			if (_removeList.Count > 0)
+			{
+				foreach (var operation in _removeList)
+				{
+					_operations.Remove(operation);
+				}
+				_removeList.Clear();
+			}
+		}
+
+		/// <summary>
+		/// 销毁异步操作系统
+		/// </summary>
+		public static void DestroyAll()
+		{
+			_operations.Clear();
+			_addList.Clear();
+			_removeList.Clear();
+			_watch = null;
+			_frameTime = 0;
+			MaxTimeSlice = long.MaxValue;
+		}
+
+		/// <summary>
+		/// 开始处理异步操作类
+		/// </summary>
+		public static void StartOperation(AsyncOperationBase operation)
+		{
+			_addList.Add(operation);
+			operation.Start();
+		}
+	}
+}

+ 11 - 0
GameClient/Assets/Game/HotUpdate/OperationSystem/OperationSystem.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e67b93637cb3fa84785b53fd7ad0937b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 1
GameClient/Assets/Game/HotUpdate/Utils/ResPathUtil.cs

@@ -151,7 +151,7 @@ namespace GFGGame
                 return false;
             }
             string resPath = ResPathUtil.GetDressUpAnimationPath(res, extName);
-            return YooAssets.CheckDressUpResExist(resPath);
+            return YooAssets.CheckResExist(resPath);
         }
 
         public static string GetDressUpEffectDirPath(string res)

+ 1 - 1
GameClient/Assets/Game/HotUpdate/Views/Card/CardFosterView.cs

@@ -345,7 +345,7 @@ namespace GFGGame
             }
             string resName = _cardData.resources[_cardData.resIndex];
             string resPath = ResPathUtil.GetCardAnimationPath(_cardData.resources[_cardData.resIndex]);
-            if (_cardData.itemCfg.animationCardStar > 0 && _cardData.star >= _cardData.itemCfg.animationCardStar && YooAssets.CheckDressUpResExist(resPath))
+            if (_cardData.itemCfg.animationCardStar > 0 && _cardData.star >= _cardData.itemCfg.animationCardStar && YooAssets.CheckResExist(resPath))
             {
                 _effectUI1 = new EffectUI();
                 _effectUI1.Reset(_ui.m_comCard.m_comCardHolder.m_holder, resName, resName, 100, EffectUIType.Card);

+ 1 - 1
GameClient/Assets/Game/Launcher/FairyGUI/GFGGLoader.cs

@@ -10,7 +10,7 @@ namespace GFGGame
 
         protected override void LoadExternal()
         {
-            if (!YooAssets.CheckDressUpResExist(this.url))
+            if (!YooAssets.CheckResExist(this.url))
             {
                 return;
             }

+ 9 - 0
GameClient/Assets/Game/Launcher/GameLauncher.cs

@@ -5,6 +5,7 @@ using FairyGUI;
 using System;
 using System.Collections.Generic;
 using YooAsset;
+using UnityEngine.SceneManagement;
 
 public class GameLauncher : MonoBehaviour
 {
@@ -18,6 +19,14 @@ public class GameLauncher : MonoBehaviour
     {
         Instance = this;
         DontDestroyOnLoad(gameObject);
+        var roots = this.gameObject.scene.GetRootGameObjects();
+        foreach(var t in roots)
+        {
+            if(t.name == "FairyGUI" || t.name == "Stage Camera")
+            {
+                DontDestroyOnLoad(t);
+            }
+        }
     }
 
     // Start is called before the first frame update

+ 10 - 4
GameClient/Assets/Game/Launcher/HotUpdateProxy/HotUpdateCodeLoader.cs

@@ -29,6 +29,11 @@ namespace GFGGame
             return this.allTypes;
         }
 
+        private void Awake()
+        {
+            DontDestroyOnLoad(this.gameObject);
+        }
+
         public void StartLoad()
         {
 
@@ -64,10 +69,11 @@ namespace GFGGame
         {
             //mono模式
             this.allTypes = assembly.GetTypes();
-            System.Type type = assembly.GetType("GFGGame.HotUpdate.HotUpdateEntry");
-            var method = type.GetMethod("Start");
-            var startDel = (Action)System.Delegate.CreateDelegate(typeof(Action), null, method);
-            startDel();
+            //System.Type type = assembly.GetType("GFGGame.HotUpdate.HotUpdateEntry");
+            //var method = type.GetMethod("Start");
+            //var startDel = (Action)System.Delegate.CreateDelegate(typeof(Action), null, method);
+            //startDel();
+            YooAssets.LoadSceneAsync("Assets/ResIn/Scene/HotUpdate.unity");
         }
 
         /// <summary>

+ 45 - 0
GameClient/Assets/ResIn/Prefab/HotUpdateDriver.prefab

@@ -0,0 +1,45 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &4256127963219327722
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4739744536700208726}
+  - component: {fileID: 98615633779879054}
+  m_Layer: 0
+  m_Name: HotUpdateDriver
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4739744536700208726
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4256127963219327722}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &98615633779879054
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4256127963219327722}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 720cf9604da70f3478fe7f9551c0a32a, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 

+ 7 - 0
GameClient/Assets/ResIn/Prefab/HotUpdateDriver.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d48f4d8afb2e4664f8ab5529f34c8f2d
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
GameClient/Assets/ResIn/Scene.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 95e5901e274f74f419ed53268ff767ba
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 273 - 0
GameClient/Assets/ResIn/Scene/HotUpdate.unity

@@ -0,0 +1,273 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_OcclusionBakeSettings:
+    smallestOccluder: 5
+    smallestHole: 0.25
+    backfaceThreshold: 100
+  m_SceneGUID: 00000000000000000000000000000000
+  m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 9
+  m_Fog: 0
+  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+  m_FogMode: 3
+  m_FogDensity: 0.01
+  m_LinearFogStart: 0
+  m_LinearFogEnd: 300
+  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+  m_AmbientIntensity: 1
+  m_AmbientMode: 3
+  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+  m_SkyboxMaterial: {fileID: 0}
+  m_HaloStrength: 0.5
+  m_FlareStrength: 1
+  m_FlareFadeSpeed: 3
+  m_HaloTexture: {fileID: 0}
+  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+  m_DefaultReflectionMode: 0
+  m_DefaultReflectionResolution: 128
+  m_ReflectionBounces: 1
+  m_ReflectionIntensity: 1
+  m_CustomReflection: {fileID: 0}
+  m_Sun: {fileID: 0}
+  m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
+  m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 12
+  m_GIWorkflowMode: 1
+  m_GISettings:
+    serializedVersion: 2
+    m_BounceScale: 1
+    m_IndirectOutputScale: 1
+    m_AlbedoBoost: 1
+    m_EnvironmentLightingMode: 0
+    m_EnableBakedLightmaps: 0
+    m_EnableRealtimeLightmaps: 0
+  m_LightmapEditorSettings:
+    serializedVersion: 12
+    m_Resolution: 2
+    m_BakeResolution: 40
+    m_AtlasSize: 1024
+    m_AO: 0
+    m_AOMaxDistance: 1
+    m_CompAOExponent: 1
+    m_CompAOExponentDirect: 0
+    m_ExtractAmbientOcclusion: 0
+    m_Padding: 2
+    m_LightmapParameters: {fileID: 0}
+    m_LightmapsBakeMode: 1
+    m_TextureCompression: 1
+    m_FinalGather: 0
+    m_FinalGatherFiltering: 1
+    m_FinalGatherRayCount: 256
+    m_ReflectionCompression: 2
+    m_MixedBakeMode: 2
+    m_BakeBackend: 1
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 512
+    m_PVRBounces: 2
+    m_PVREnvironmentSampleCount: 256
+    m_PVREnvironmentReferencePointCount: 2048
+    m_PVRFilteringMode: 1
+    m_PVRDenoiserTypeDirect: 1
+    m_PVRDenoiserTypeIndirect: 1
+    m_PVRDenoiserTypeAO: 1
+    m_PVRFilterTypeDirect: 0
+    m_PVRFilterTypeIndirect: 0
+    m_PVRFilterTypeAO: 0
+    m_PVREnvironmentMIS: 1
+    m_PVRCulling: 1
+    m_PVRFilteringGaussRadiusDirect: 1
+    m_PVRFilteringGaussRadiusIndirect: 5
+    m_PVRFilteringGaussRadiusAO: 2
+    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+    m_PVRFilteringAtrousPositionSigmaIndirect: 2
+    m_PVRFilteringAtrousPositionSigmaAO: 1
+    m_ExportTrainingData: 0
+    m_TrainingDataDestination: TrainingData
+    m_LightProbeSampleCountMultiplier: 4
+  m_LightingDataAsset: {fileID: 0}
+  m_LightingSettings: {fileID: 0}
+--- !u!196 &4
+NavMeshSettings:
+  serializedVersion: 2
+  m_ObjectHideFlags: 0
+  m_BuildSettings:
+    serializedVersion: 2
+    agentTypeID: 0
+    agentRadius: 0.5
+    agentHeight: 2
+    agentSlope: 45
+    agentClimb: 0.4
+    ledgeDropHeight: 0
+    maxJumpAcrossDistance: 0
+    minRegionArea: 2
+    manualCellSize: 0
+    cellSize: 0.16666667
+    manualTileSize: 0
+    tileSize: 256
+    accuratePlacement: 0
+    maxJobWorkers: 0
+    preserveTilesOutsideBounds: 0
+    debug:
+      m_Flags: 0
+  m_NavMeshData: {fileID: 0}
+--- !u!1 &1410528065
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1410528070}
+  - component: {fileID: 1410528069}
+  - component: {fileID: 1410528068}
+  - component: {fileID: 1410528067}
+  - component: {fileID: 1410528066}
+  m_Layer: 0
+  m_Name: Main Camera
+  m_TagString: MainCamera
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!124 &1410528066
+Behaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1410528065}
+  m_Enabled: 1
+--- !u!114 &1410528067
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1410528065}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 03a74e9be952781499f1c48566c89209, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!81 &1410528068
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1410528065}
+  m_Enabled: 1
+--- !u!20 &1410528069
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1410528065}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 2
+  m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0}
+  m_projectionMatrixMode: 1
+  m_GateFitMode: 2
+  m_FOVAxisMode: 0
+  m_SensorSize: {x: 36, y: 24}
+  m_LensShift: {x: 0, y: 0}
+  m_FocalLength: 50
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: -1
+  far clip plane: 1000
+  field of view: 60
+  orthographic: 1
+  orthographic size: 9.6
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 23
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 0
+  m_HDR: 1
+  m_AllowMSAA: 0
+  m_AllowDynamicResolution: 0
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 0
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+--- !u!4 &1410528070
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1410528065}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1426644585
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1426644587}
+  - component: {fileID: 1426644586}
+  m_Layer: 0
+  m_Name: HotUpdateDriver
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1426644586
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1426644585}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 720cf9604da70f3478fe7f9551c0a32a, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!4 &1426644587
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1426644585}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

+ 7 - 0
GameClient/Assets/ResIn/Scene/HotUpdate.unity.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: dbe866f85c772f64c9f1eb61eb15937d
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 0
GameClient/Assets/YooAsset/Editor/GFGAsset/Collect/AssetBundleHelper.cs

@@ -35,6 +35,7 @@ namespace GFGEditor
         {
             EditorUtility.DisplayProgressBar("进度", "正在收集资源", 1);
             BuildHotUpdateDll();
+            AssetDatabase.Refresh();
             itemsSizeDicDic = new Dictionary<string, Dictionary<string, AssetBundleAssetListItem>>();
             assetBundleCollector = AssetBundleCollector.GetData();
             

+ 1 - 1
GameClient/Assets/YooAsset/Runtime/GFG/YooAssetsExtensionGFG.cs

@@ -4,7 +4,7 @@ namespace YooAsset
 {
     public static partial class YooAssets
     {
-        public static bool CheckDressUpResExist(string assetPath)
+        public static bool CheckResExist(string assetPath)
         {
             ResourcePackage p = GetPackage("GameLogic");
             p.PlayModeServices.ActiveManifest.AssetDic.TryGetValue(assetPath, out var r);

+ 9 - 9
GameClient/UserSettings/EditorUserSettings.asset

@@ -6,31 +6,31 @@ EditorUserSettings:
   serializedVersion: 4
   m_ConfigSettings:
     RecentlyUsedScenePath-0:
-      value: 22424703114646680c031c2e153010393a250d2438212b3562785365acb77b1ce7ea39a6d8093c393707fc7321260032e2060c18b95a5b34270ff11b14cb090314e711cb1ec1111b850c12c7d904
+      value: 22424703114646680c031c2e153010393a250d2438212b3562785365acb77b1ce7ea39a6d8093c393707fc7321260032e2060c18b95b5c343222cf2c18f1141a1fc256d014c10b05
       flags: 0
     RecentlyUsedScenePath-1:
-      value: 22424703114646680c031c2e153010393a250d2438212b3562785365acb77b1ce7ea39a6d8093c393707fc7321260032e2060c18b95b5c343222cf2c18f1141a1fc256d014c10b05
+      value: 22424703114646680c031c2e153010393a250d2438212b3562785365acb77b1ce7ea39a6d8093c393707fc7321260032e2060c18b95b5b34390bf1021ec81f011dc156d014c10b05
       flags: 0
     RecentlyUsedScenePath-2:
-      value: 22424703114646680c031c2e153010393a250d2438212b3562785365acb77b1ce7ea39a6d8093c393707fc7321260032e2060c18b95b5b34390bf1021ec81f011dc156d014c10b05
+      value: 22424703114646680c031c2e153010393a250d2438212b3562785365acb77b1ce7ea39a6d8093c393707fc7321260032e2060c18b95b58343800eb0112fe041a1ecb56d014c10b05
       flags: 0
     RecentlyUsedScenePath-3:
-      value: 22424703114646680c031c2e153010393a250d2438212b3562785365acb77b1ce7ea39a6d8093c393707fc7321260032e2060c18b95b58343800eb0112fe041a1ecb56d014c10b05
+      value: 22424703114646680c031c2e1530103c1918130b38670a3f22223c27acf53a31f6fe
       flags: 0
     RecentlyUsedScenePath-4:
-      value: 22424703114646680c031c2e1530103c1918130b38670a3f22223c27acf53a31f6fe
+      value: 22424703114646680c031c2e1530103d17041323222f691d2c3a163aece77a2decee22f0
       flags: 0
     RecentlyUsedScenePath-5:
-      value: 22424703114646680c031c2e1530103d17041323222f691d2c3a163aece77a2decee22f0
+      value: 22424703114646680c031c2e15301031050e16290e2d283325241c21e9af152bfbe935cbe2343c343403fd374a2b0f36e613
       flags: 0
     RecentlyUsedScenePath-6:
-      value: 22424703114646680c031c2e15301031050e16290e2d283325241c21e9af152bfbe935cbe2343c343403fd374a2b0f36e613
+      value: 22424703114646680c031c2e15301031050e16290e2d283325241c21e9af152df6e83be8f3333c1d2a1be13f263b0f3cfa070819fd451f05181ae4
       flags: 0
     RecentlyUsedScenePath-7:
-      value: 22424703114646680c031c2e15301031050e16290e2d283325241c21e9af152df6e83be8f3333c1d2a1be13f263b0f3cfa070819fd451f05181ae4
+      value: 22424703114646680c031c2e15301031181e152b3821293e6208133aefe12031ede978fce9332b25
       flags: 0
     RecentlyUsedScenePath-8:
-      value: 22424703114646680c031c2e15301031181e152b3821293e6208133aefe12031ede978fce9332b25
+      value: 2242470311464669081d252c5f105c1518125706232f2f3e633c133af6f9
       flags: 0
     RecentlyUsedScenePath-9:
       value: 22424703114646680e0b0227036c78111b12342b39262538283b5326ece92021