Browse Source

换装bug修复

guodong 1 year ago
parent
commit
7a14299dd2

+ 12 - 0
GameClient/Assets/Game/HotUpdate/Assets/AssetReleaser.cs

@@ -58,9 +58,21 @@ namespace GFGGame
 
 
         public void Restore()
         public void Restore()
         {
         {
+            SetGoLayers(this.gameObject, 0);
             this.spawnHandle?.Restore();
             this.spawnHandle?.Restore();
             this.spawnHandle = null;
             this.spawnHandle = null;
         }
         }
 
 
+        private static void SetGoLayers(GameObject gameObject, int layer)
+        {
+            if (gameObject == null || gameObject.layer == layer)
+                return;
+
+            var helperTransformList = gameObject.GetComponentsInChildren<Transform>(true);
+            int cnt = helperTransformList.Length;
+            for (int i = 0; i < cnt; i++)
+                helperTransformList[i].gameObject.layer = layer;
+        }
+
     }
     }
 }
 }

+ 63 - 13
GameClient/Assets/Game/HotUpdate/DressUp/DressUpLayerOperation.cs

@@ -7,7 +7,7 @@ namespace GFGGame
 {
 {
     public class DressUpLayerOperation : DressUpOperationBase
     public class DressUpLayerOperation : DressUpOperationBase
     {
     {
-        private enum EAction
+        internal enum EAction
         {
         {
             Layer,
             Layer,
             Body,
             Body,
@@ -15,8 +15,8 @@ namespace GFGGame
         }
         }
         public const int PRE_RENDER_FRAME = 1;
         public const int PRE_RENDER_FRAME = 1;
 
 
-        private ItemCfg itemCfg;
-        private GameObject parentObj;
+        internal ItemCfg itemCfg;
+        internal GameObject parentObj;
         private int layerId;
         private int layerId;
         private bool needSetMask;
         private bool needSetMask;
         private bool showAni;
         private bool showAni;
@@ -25,7 +25,7 @@ namespace GFGGame
 
 
         private int preRendering;
         private int preRendering;
         private ResourceDownloaderOperation downloaderOperation;
         private ResourceDownloaderOperation downloaderOperation;
-        private EAction actionType;
+        internal EAction actionType;
 
 
         private string[] locationsLoading;
         private string[] locationsLoading;
 
 
@@ -41,7 +41,7 @@ namespace GFGGame
 
 
         public void InitLayer(ItemCfg itemCfg, int layerId)
         public void InitLayer(ItemCfg itemCfg, int layerId)
         {
         {
-            //Debug.Log($"InitLayer {itemCfg.id}");
+            Debug.Log($"add InitLayer {itemCfg.id} layerId {layerId}");
             this.itemCfg = itemCfg;
             this.itemCfg = itemCfg;
             this.layerId = layerId;
             this.layerId = layerId;
             actionType = EAction.Layer;
             actionType = EAction.Layer;
@@ -49,24 +49,25 @@ namespace GFGGame
 
 
         public void InitBody()
         public void InitBody()
         {
         {
-            //Debug.Log("InitBody");
+            Debug.Log("update InitBody");
             actionType = EAction.Body;
             actionType = EAction.Body;
         }
         }
 
 
         public void InitHead()
         public void InitHead()
         {
         {
+            Debug.Log("update InitHead");
             actionType = EAction.Head;
             actionType = EAction.Head;
         }
         }
         internal override bool CheckRepeated(DressUpOperationBase t)
         internal override bool CheckRepeated(DressUpOperationBase t)
         {
         {
-            var operation = t as DressUpLayerOperation;
-            if (operation != null && operation.actionType == this.actionType)
+            DressUpLayerOperation layerOperation = t as DressUpLayerOperation;
+            if (layerOperation != null && layerOperation.actionType == this.actionType)
             {
             {
                 if(actionType == EAction.Layer)
                 if(actionType == EAction.Layer)
                 {
                 {
-                    return (operation.parentObj == this.parentObj
-                        && operation.itemCfg == this.itemCfg
-                        && operation.layerId == this.layerId);
+                    return (layerOperation.parentObj == this.parentObj
+                        && layerOperation.itemCfg == this.itemCfg
+                        && layerOperation.layerId == this.layerId);
 
 
                 }
                 }
                 else
                 else
@@ -74,6 +75,20 @@ namespace GFGGame
                     return true;
                     return true;
                 }
                 }
             }
             }
+            if(this.actionType == EAction.Layer)
+            {
+                DressUpRemoveOperation removeOperation = t as DressUpRemoveOperation;
+                if(removeOperation != null)
+                {
+                    if(removeOperation.itemID == this.itemCfg.id)
+                    {
+                        if(removeOperation.parentObj == this.parentObj)
+                        {
+                            return true;
+                        }
+                    }
+                }
+            }
             return false;
             return false;
         }
         }
         /// <summary>
         /// <summary>
@@ -227,7 +242,25 @@ namespace GFGGame
 
 
         private void UpdateLayer()
         private void UpdateLayer()
         {
         {
-            //Debug.Log($"UpdateLayer add {itemCfg.id}");
+            Debug.Log($"add UpdateLayer {itemCfg.id} layerId {layerId}");
+            //string objName;
+            //if (showAni)
+            //{
+            //    objName = string.Format(DressUpUtil.FORMAT_ANIMATION_NAME, itemCfg.subType, layerId);
+            //}
+            //else
+            //{
+            //    objName = string.Format(DressUpUtil.FORMAT_SPRITE_NAME, itemCfg.subType, layerId);
+            //}
+            int sortingOrder = ItemTypeCfgArray.Instance.GetSortingOrder(itemCfg.subType, layerId);
+            //var gameObj = DressUpUtil.GetGameObjExisted(parentObj, objName, resPath);
+            //if (gameObj != null)
+            //{
+            //    LogHelper.LogEditor("GetGameObjExisted!");
+
+            //    DressUpUtil.SetRenderersOrder(gameObj, sortingOrder);
+            //    return;
+            //}
             //清理旧的
             //清理旧的
             var spritObjName = string.Format(DressUpUtil.FORMAT_SPRITE_NAME, itemCfg.subType, layerId);
             var spritObjName = string.Format(DressUpUtil.FORMAT_SPRITE_NAME, itemCfg.subType, layerId);
             DressUpUtil.TryRemoveSprite(parentObj, spritObjName);
             DressUpUtil.TryRemoveSprite(parentObj, spritObjName);
@@ -236,7 +269,6 @@ namespace GFGGame
             string effectObjName = string.Format(DressUpUtil.FORMAT_EFFECT_OBJ_NAME, itemCfg.subType, layerId);
             string effectObjName = string.Format(DressUpUtil.FORMAT_EFFECT_OBJ_NAME, itemCfg.subType, layerId);
             DressUpUtil.TryRemoveObj(parentObj, effectObjName);
             DressUpUtil.TryRemoveObj(parentObj, effectObjName);
             //添加新的
             //添加新的
-            int sortingOrder = ItemTypeCfgArray.Instance.GetSortingOrder(itemCfg.subType, layerId);
             if (this.showAni)
             if (this.showAni)
             {
             {
                 DressUpUtil.AddAnimationObj(resPath, aniObjName, parentObj, sortingOrder);
                 DressUpUtil.AddAnimationObj(resPath, aniObjName, parentObj, sortingOrder);
@@ -254,10 +286,27 @@ namespace GFGGame
 
 
         private void UpdateBody()
         private void UpdateBody()
         {
         {
+            Debug.Log("update UpdateBody");
             var spritObjName = DressUpUtil.BODY_SPRITE_NAME;
             var spritObjName = DressUpUtil.BODY_SPRITE_NAME;
             var aniObjName = DressUpUtil.BODY_ANIMATION_NAME;
             var aniObjName = DressUpUtil.BODY_ANIMATION_NAME;
             var effectObjName = DressUpUtil.BODY_EFFECT_OBJ_NAME;
             var effectObjName = DressUpUtil.BODY_EFFECT_OBJ_NAME;
+            //string objName;
+            //if (this.showAni)
+            //{
+            //    objName = DressUpUtil.BODY_ANIMATION_NAME;
+            //}
+            //else
+            //{
+            //    objName = DressUpUtil.BODY_SPRITE_NAME;
+            //}
             int sortingOrder = 0;
             int sortingOrder = 0;
+            //var gameObj = DressUpUtil.GetGameObjExisted(parentObj, objName, resPath);
+            //if (gameObj != null)
+            //{
+            //    LogHelper.LogEditor("GetGameObjExisted!");
+            //    DressUpUtil.SetRenderersOrder(gameObj, sortingOrder);
+            //    return;
+            //}
             var removeBodyAni = DressUpUtil.TryRemoveObj(parentObj, aniObjName);
             var removeBodyAni = DressUpUtil.TryRemoveObj(parentObj, aniObjName);
             DressUpUtil.TryRemoveObj(parentObj, effectObjName);
             DressUpUtil.TryRemoveObj(parentObj, effectObjName);
             DressUpUtil.TryRemoveSprite(parentObj, spritObjName);
             DressUpUtil.TryRemoveSprite(parentObj, spritObjName);
@@ -282,6 +331,7 @@ namespace GFGGame
 
 
         private void UpdateHead()
         private void UpdateHead()
         {
         {
+            Debug.Log("update UpdateHead");
             var spritObjName = DressUpUtil.HEAD_SPRITE_NAME; 
             var spritObjName = DressUpUtil.HEAD_SPRITE_NAME; 
             int sortingOrder = 1;
             int sortingOrder = 1;
             Transform transform_t = parentObj.transform.Find(spritObjName);
             Transform transform_t = parentObj.transform.Find(spritObjName);

+ 2 - 3
GameClient/Assets/Game/HotUpdate/DressUp/DressUpObjUI.cs

@@ -21,9 +21,8 @@ namespace GFGGame
 
 
         public void ResetSceneObj(int scale = 100, bool needSetMask = false, bool showSceneType = true, GameObject roleObj = null, bool showBg = true)
         public void ResetSceneObj(int scale = 100, bool needSetMask = false, bool showSceneType = true, GameObject roleObj = null, bool showBg = true)
         {
         {
-            dressUpObj.TakeOffAll();
-            if (sceneObject == null)
-                sceneObject = PrefabManager.Instance.InstantiateSync(ResPathUtil.GetPrefabPath(this.prefabName));
+            //这里每次都要实例化新的,复用会有bug
+            sceneObject = PrefabManager.Instance.InstantiateSync(ResPathUtil.GetPrefabPath(this.prefabName));
             sceneObject.transform.localScale = new Vector3(scale, scale, scale);
             sceneObject.transform.localScale = new Vector3(scale, scale, scale);
             dressUpObj.setSceneObj(sceneObject, needSetMask, showSceneType, roleObj, showBg);
             dressUpObj.setSceneObj(sceneObject, needSetMask, showSceneType, roleObj, showBg);
             Timers.inst.AddUpdate(OnUpdate);
             Timers.inst.AddUpdate(OnUpdate);

+ 18 - 14
GameClient/Assets/Game/HotUpdate/DressUp/DressUpRemoveOperation.cs

@@ -1,25 +1,23 @@
 using UnityEngine;
 using UnityEngine;
 using YooAsset;
 using YooAsset;
+using static FairyGUI.ControllerAction;
 
 
 namespace GFGGame
 namespace GFGGame
 {
 {
     public class DressUpRemoveOperation : DressUpOperationBase
     public class DressUpRemoveOperation : DressUpOperationBase
     {
     {
-        private int itemID;
-        private GameObject sceneObj;
-        private GameObject parentObj;
+        internal int itemID;
+        internal GameObject parentObj;
 
 
-        public DressUpRemoveOperation(int itemID, GameObject sceneObj, GameObject parentObj)
+        public DressUpRemoveOperation(int itemID, GameObject parentObj)
         {
         {
             this.itemID = itemID;
             this.itemID = itemID;
-            this.sceneObj = sceneObj;
             this.parentObj = parentObj;
             this.parentObj = parentObj;
-            Debug.Log($"remove {itemID}");
+            Debug.Log($"remove init {itemID}");
         }
         }
 
 
         internal override void Release()
         internal override void Release()
         {
         {
-            this.sceneObj = null;
             this.parentObj = null;
             this.parentObj = null;
         }
         }
 
 
@@ -41,21 +39,27 @@ namespace GFGGame
 
 
         internal override bool CheckRepeated(DressUpOperationBase t)
         internal override bool CheckRepeated(DressUpOperationBase t)
         {
         {
-            var operation = t as DressUpRemoveOperation;
-            return (operation != null 
-                && operation.itemID == this.itemID 
-                && operation.sceneObj == this.sceneObj);
+            DressUpLayerOperation layerOperation = t as DressUpLayerOperation;
+            if (layerOperation != null && layerOperation.actionType == DressUpLayerOperation.EAction.Layer)
+{
+                return (this.itemID == layerOperation.itemCfg.id
+                    && this.parentObj == layerOperation.parentObj);
+            }
+            var removeOperation = t as DressUpRemoveOperation;
+            return (removeOperation != null 
+                && removeOperation.itemID == this.itemID 
+                && removeOperation.parentObj == this.parentObj);
         }
         }
 
 
         internal override void UpdateView()
         internal override void UpdateView()
         {
         {
-            if(sceneObj == null)
+            if(parentObj == null)
             {
             {
                 this.Release();
                 this.Release();
                 return;
                 return;
             }
             }
-            Debug.Log($"UpdateView remove {itemID}");
-            DressUpUtil.RemoveItem(this.itemID, this.sceneObj, this.parentObj);
+            Debug.Log($"remove UpdateView {itemID}");
+            DressUpUtil.RemoveItem(this.itemID, this.parentObj);
         }
         }
     }
     }
 }
 }

+ 53 - 87
GameClient/Assets/Game/HotUpdate/DressUp/DressUpUtil.cs

@@ -92,62 +92,62 @@ namespace GFGGame
             return null;
             return null;
         }
         }
 
 
-        public static void RemoveItem(int itemID, GameObject sceneObj, GameObject parentObj = null)
+        public static void RemoveItem(int itemID, GameObject parentObj)
         {
         {
             ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemID);
             ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemID);
-            if (itemCfg != null)
+            if (itemCfg == null || parentObj== null) return;
+            string spritObjName;
+            string aniObjName;
+            //默认层
+            if (!string.IsNullOrEmpty(itemCfg.resLayer1))
+            {
+                spritObjName = string.Format(FORMAT_SPRITE_NAME, itemCfg.subType, 1);
+                TryRemoveSprite(parentObj, spritObjName);
+                aniObjName = string.Format(FORMAT_ANIMATION_NAME, itemCfg.subType, 1);
+                TryRemoveObj(parentObj, aniObjName);
+                aniObjName = string.Format(FORMAT_EFFECT_OBJ_NAME, itemCfg.subType, 1);
+                TryRemoveObj(parentObj, aniObjName);
+            }
+            //特殊层
+            if (!string.IsNullOrEmpty(itemCfg.resLayer2))
+            {
+                spritObjName = string.Format(FORMAT_SPRITE_NAME, itemCfg.subType, 2);
+                TryRemoveSprite(parentObj, spritObjName);
+                aniObjName = string.Format(FORMAT_ANIMATION_NAME, itemCfg.subType, 2);
+                TryRemoveObj(parentObj, aniObjName);
+                aniObjName = string.Format(FORMAT_EFFECT_OBJ_NAME, itemCfg.subType, 2);
+                TryRemoveObj(parentObj, aniObjName);
+            }
+            //第三层
+            if (!string.IsNullOrEmpty(itemCfg.resLayer3))
+            {
+                spritObjName = string.Format(FORMAT_SPRITE_NAME, itemCfg.subType, 3);
+                TryRemoveSprite(parentObj, spritObjName);
+                aniObjName = string.Format(FORMAT_ANIMATION_NAME, itemCfg.subType, 3);
+                TryRemoveObj(parentObj, aniObjName);
+                aniObjName = string.Format(FORMAT_EFFECT_OBJ_NAME, itemCfg.subType, 3);
+                TryRemoveObj(parentObj, aniObjName);
+            }
+        }
+
+        public static DressUpRemoveOperation RemoveItemAsync(int itemID, GameObject sceneObj, GameObject parentObj = null)
+        {
+            ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemID);
+            if (itemCfg == null) return null;
+            if (parentObj == null)
             {
             {
-                if (parentObj == null)
-                {
-                    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;
-                    }
-                }
-                string spritObjName;
-                string aniObjName;
-                //默认层
-                if (!string.IsNullOrEmpty(itemCfg.resLayer1))
-                {
-                    spritObjName = string.Format(FORMAT_SPRITE_NAME, itemCfg.subType, 1);
-                    TryRemoveSprite(parentObj, spritObjName);
-                    aniObjName = string.Format(FORMAT_ANIMATION_NAME, itemCfg.subType, 1);
-                    TryRemoveObj(parentObj, aniObjName);
-                    aniObjName = string.Format(FORMAT_EFFECT_OBJ_NAME, itemCfg.subType, 1);
-                    TryRemoveObj(parentObj, aniObjName);
-                }
-                //特殊层
-                if (!string.IsNullOrEmpty(itemCfg.resLayer2))
+                if (itemCfg.subType == ConstDressUpItemType.BEI_JING || DressUpMenuItemCfg1Array.Instance.CheckIsSceneTypeBySubType(itemCfg.subType))
                 {
                 {
-                    spritObjName = string.Format(FORMAT_SPRITE_NAME, itemCfg.subType, 2);
-                    TryRemoveSprite(parentObj, spritObjName);
-                    aniObjName = string.Format(FORMAT_ANIMATION_NAME, itemCfg.subType, 2);
-                    TryRemoveObj(parentObj, aniObjName);
-                    aniObjName = string.Format(FORMAT_EFFECT_OBJ_NAME, itemCfg.subType, 2);
-                    TryRemoveObj(parentObj, aniObjName);
+                    parentObj = sceneObj;
                 }
                 }
-                //第三层
-                if (!string.IsNullOrEmpty(itemCfg.resLayer3))
+                else
                 {
                 {
-                    spritObjName = string.Format(FORMAT_SPRITE_NAME, itemCfg.subType, 3);
-                    TryRemoveSprite(parentObj, spritObjName);
-                    aniObjName = string.Format(FORMAT_ANIMATION_NAME, itemCfg.subType, 3);
-                    TryRemoveObj(parentObj, aniObjName);
-                    aniObjName = string.Format(FORMAT_EFFECT_OBJ_NAME, itemCfg.subType, 3);
-                    TryRemoveObj(parentObj, aniObjName);
+                    //角色
+                    Transform role = sceneObj.transform.Find(ROLE_OBJ_NAME);
+                    parentObj = role.gameObject;
                 }
                 }
             }
             }
-        }
-
-        public static DressUpRemoveOperation RemoveItemAsync(int itemID, GameObject sceneObj, GameObject parentObj = null)
-        {
-            var operation = new DressUpRemoveOperation(itemID, sceneObj, parentObj);
+            var operation = new DressUpRemoveOperation(itemID, parentObj);
             operation.Begin();
             operation.Begin();
             return operation;
             return operation;
         }
         }
@@ -178,7 +178,6 @@ namespace GFGGame
             var extPng = "png";
             var extPng = "png";
             string resPath = null;
             string resPath = null;
             string effectResPath = null;
             string effectResPath = null;
-            string objName;
             bool showAni = !string.IsNullOrEmpty(actionRes);
             bool showAni = !string.IsNullOrEmpty(actionRes);
             string aniResPath = null;
             string aniResPath = null;
             if (showAni)
             if (showAni)
@@ -192,7 +191,6 @@ namespace GFGGame
             if(showAni)
             if(showAni)
             {
             {
                 resPath = aniResPath;
                 resPath = aniResPath;
-                objName = BODY_ANIMATION_NAME;
                 //特效
                 //特效
                 effectResPath = ResPathUtil.GetDressUpEffectPath(actionRes, true);
                 effectResPath = ResPathUtil.GetDressUpEffectPath(actionRes, true);
                 if (!YooAssets.CheckResExist(effectResPath))
                 if (!YooAssets.CheckResExist(effectResPath))
@@ -203,9 +201,8 @@ namespace GFGGame
             else
             else
             {
             {
                 resPath = ResPathUtil.GetDressUpPath(BODY_DEFAULT_RES_NAME, extPng);
                 resPath = ResPathUtil.GetDressUpPath(BODY_DEFAULT_RES_NAME, extPng);
-                objName = BODY_SPRITE_NAME;
             }
             }
-            if (GetGameObjExisted(parentObj, objName, resPath) != null || !YooAssets.CheckResExist(resPath))
+            if (!YooAssets.CheckResExist(resPath))
             {
             {
                 return null;
                 return null;
             }
             }
@@ -230,20 +227,16 @@ namespace GFGGame
                 }
                 }
             }
             }
 
 
-            string objName;
             if (showAni)
             if (showAni)
             {
             {
                 resPath = aniResPath;
                 resPath = aniResPath;
-                objName = string.Format(DressUpUtil.FORMAT_ANIMATION_NAME, itemCfg.subType, layerId);
             }
             }
             else
             else
             {
             {
                 resPath = ResPathUtil.GetDressUpPath(itemCfg, layerId);
                 resPath = ResPathUtil.GetDressUpPath(itemCfg, layerId);
-                objName = string.Format(DressUpUtil.FORMAT_SPRITE_NAME, itemCfg.subType, layerId);
             }
             }
 
 
-            var gameObj = DressUpUtil.GetGameObjExisted(parentObj, objName, resPath);
-            if (gameObj != null || !YooAssets.CheckResExist(resPath))
+            if (!YooAssets.CheckResExist(resPath))
             {
             {
                 return null;
                 return null;
             }
             }
@@ -469,7 +462,7 @@ namespace GFGGame
             }
             }
         }
         }
 
 
-        private static void SetRenderersOrder(GameObject gameObj, int sortingOrder, bool isAdd = false)
+        public static void SetRenderersOrder(GameObject gameObj, int sortingOrder)
         {
         {
             var meshRenderers = gameObj.transform.GetComponentsInChildren<MeshRenderer>();
             var meshRenderers = gameObj.transform.GetComponentsInChildren<MeshRenderer>();
             for (int i = 0; i < meshRenderers.Length; i++)
             for (int i = 0; i < meshRenderers.Length; i++)
@@ -477,14 +470,7 @@ namespace GFGGame
                 var renderer = meshRenderers[i].GetComponent<Renderer>();
                 var renderer = meshRenderers[i].GetComponent<Renderer>();
                 if (renderer != null)
                 if (renderer != null)
                 {
                 {
-                    if (isAdd)
-                    {
-                        renderer.sortingOrder = renderer.sortingOrder + sortingOrder;
-                    }
-                    else
-                    {
-                        renderer.sortingOrder = sortingOrder;
-                    }
+                    renderer.sortingOrder = sortingOrder;
                 }
                 }
             }
             }
             ParticleSystem[] particles = gameObj.transform.GetComponentsInChildren<ParticleSystem>();
             ParticleSystem[] particles = gameObj.transform.GetComponentsInChildren<ParticleSystem>();
@@ -493,33 +479,13 @@ namespace GFGGame
                 var renderer = particles[i].GetComponent<Renderer>();
                 var renderer = particles[i].GetComponent<Renderer>();
                 if (renderer != null)
                 if (renderer != null)
                 {
                 {
-                    if (isAdd)
-                    {
-                        renderer.sortingOrder = renderer.sortingOrder + sortingOrder;
-                    }
-                    else
-                    {
-
-                        renderer.sortingOrder = sortingOrder;
-                    }
+                    renderer.sortingOrder = sortingOrder;
                 }
                 }
             }
             }
 
 
-            SetGoLayers(gameObj, 0);
         }
         }
 
 
 
 
-        private static void SetGoLayers(GameObject gameObject, int layer)
-        {
-            if (gameObject == null || gameObject.layer == layer)
-                return;
-
-            var helperTransformList = gameObject.GetComponentsInChildren<Transform>(true);
-            int cnt = helperTransformList.Length;
-            for (int i = 0; i < cnt; i++)
-                helperTransformList[i].gameObject.layer = layer;
-        }
-
     }
     }
 
 
 }
 }