zhaoyang 3 жил өмнө
parent
commit
251ea30c74

+ 8 - 0
GameClient/Assets/Game/HotUpdate/Data/PhotographDataManager.cs

@@ -1,4 +1,5 @@
 using System.Collections.Generic;
+using UnityEngine;
 
 namespace GFGGame
 {
@@ -55,5 +56,12 @@ namespace GFGGame
                 }
             }
         }
+        //maxLayer:当前所有物件的最上层
+        private int GetObjMaxSortingOrder(GameObject gameObject, int maxLayer)
+        {
+            SpriteRenderer spr = gameObject.GetComponent<SpriteRenderer>();
+
+            return spr.sortingOrder > maxLayer ? spr.sortingOrder : maxLayer;
+        }
     }
 }

+ 11 - 6
GameClient/Assets/Game/HotUpdate/DressUp/DressUpUtil.cs

@@ -15,7 +15,7 @@ namespace GFGGame
         private const string FORMAT_EFFECT_OBJ_NAME = "T{0}_eff";
         private const string FORMAT_LAYER_RES_NAME_WITH_T = "{0}_t";
 
-        public static void AddItem(int itemID, GameObject sceneObj, bool needSetMask = false, bool showAni = true, GameObject parentObj = null, int layer = -1)
+        public static void AddItem(int itemID, GameObject sceneObj, bool needSetMask = false, bool showAni = true, GameObject parentObj = null, int layerId = int.MinValue, int layer = int.MinValue)
         {
             ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemID);
             if (itemCfg != null)
@@ -34,24 +34,25 @@ namespace GFGGame
                         parentObj = role.gameObject;
                     }
                 }
-                if (layer > 0)
+                if (layerId > int.MinValue)
                 {
-                    updateLayerRes(itemCfg, parentObj, layer, itemCfg.resLayer1 == 2, needSetMask, showAni);
+                    updateLayerRes(itemCfg, parentObj, layerId, layerId == 2, needSetMask, showAni, layer);
                 }
                 else
                 {
                     //普通层
                     if (itemCfg.resLayer1 > 0)
                     {
-                        updateLayerRes(itemCfg, parentObj, 1, itemCfg.resLayer1 == 2, needSetMask, showAni);
+                        updateLayerRes(itemCfg, parentObj, 1, itemCfg.resLayer1 == 2, needSetMask, showAni, layer);
                     }
                     //特殊层
                     if (itemCfg.resLayer2 > 0)
                     {
 
-                        updateLayerRes(itemCfg, parentObj, 2, itemCfg.resLayer2 == 2, needSetMask, showAni);
+                        updateLayerRes(itemCfg, parentObj, 2, itemCfg.resLayer2 == 2, needSetMask, showAni, layer);
                     }
                 }
+
                 //特效
                 if (itemCfg.effLayer > 0 && showAni)
                 {
@@ -179,7 +180,7 @@ namespace GFGGame
             assetDisposer.resPath = resPath;
         }
 
-        private static void updateLayerRes(ItemCfg itemCfg, GameObject parentObj, int layerId, bool isT, bool needSetMask, bool showAni = true)
+        private static void updateLayerRes(ItemCfg itemCfg, GameObject parentObj, int layerId, bool isT, bool needSetMask, bool showAni = true, int layer = int.MinValue)
         {
 
             ItemTypeCfg typeCfg = ItemTypeCfgArray.Instance.GetCfg(itemCfg.subType);
@@ -190,6 +191,10 @@ namespace GFGGame
             {
                 sortingOrder = typeCfg.specialLayer;
             }
+            if (layer > int.MinValue)
+            {
+                sortingOrder = layer;
+            }
             if (isT)
             {
                 res = string.Format(FORMAT_LAYER_RES_NAME_WITH_T, res);

+ 34 - 18
GameClient/Assets/Game/HotUpdate/DressUp/SceneController.cs

@@ -155,9 +155,9 @@ namespace GFGGame
         }
 
 
-        public static void UpdatePhotographBgOrNpcOrBorder(GameObject sceneObj, EnumPhotographType type, int itemId)
+        public static void UpdatePhotographBgOrNpcOrBorder(GameObject sceneObj, EnumPhotographType type, int itemId, int maxlayer, out int maxLayer)
         {
-
+            maxLayer = maxlayer;
             string objName = "";
             ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId);
             var resPath = ""; ResPathUtil.GetDressUpPath(itemCfg.res, ItemUtil.GetItemResExt(itemCfg.itemType, itemCfg.subType));
@@ -196,12 +196,20 @@ namespace GFGGame
             {
                 ItemTypeCfg typeCfg = ItemTypeCfgArray.Instance.GetCfg(ConstDressUpItemType.BEI_JING);
                 spr.sortingOrder = typeCfg.defaultLayer;
-                return;
+
+            }
+            if (type == EnumPhotographType.NPC)
+            {
+                maxlayer++;
+                maxLayer = maxlayer;
+                spr.sortingOrder = maxLayer;
             }
+            if (type != EnumPhotographType.BORDER)//边框不加碰撞盒
+            {
 
-            if (type == EnumPhotographType.BORDER) return;//边框不加碰撞盒
+                PhotographAddCollider(tf.gameObject);
+            }
 
-            PhotographAddCollider(tf.gameObject);
         }
         //添加碰撞盒
         public static void PhotographAddCollider(GameObject gameObject)
@@ -219,7 +227,7 @@ namespace GFGGame
 
 
         //场景添加单个道具
-        public static void AddScene(GameObject sceneObj, int itemId, int index)
+        public static void AddScene(GameObject sceneObj, int itemId, int index, int resLayer = int.MinValue)
         {
             ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId);
             //普通层
@@ -227,7 +235,7 @@ namespace GFGGame
             {
                 var parentGameObj = new GameObject(string.Format("{0}_{1}_{2}", itemId, index, itemCfg.resLayer1));
                 parentGameObj.transform.SetParent(sceneObj.transform.Find("Scene"), false);
-                DressUpUtil.AddItem(itemId, sceneObj, false, false, parentGameObj, itemCfg.resLayer1);
+                DressUpUtil.AddItem(itemId, sceneObj, false, false, parentGameObj, itemCfg.resLayer1, resLayer);
                 SceneController.PhotographAddCollider(parentGameObj.transform.GetChild(0).gameObject);
 
             }
@@ -236,20 +244,11 @@ namespace GFGGame
             {
                 var parentGameObj = new GameObject(string.Format("{0}_{1}_{2}", itemId, index, itemCfg.resLayer2));
                 parentGameObj.transform.SetParent(sceneObj.transform.Find("Scene"), false);
-                DressUpUtil.AddItem(itemId, sceneObj, false, false, parentGameObj, itemCfg.resLayer2);
+                DressUpUtil.AddItem(itemId, sceneObj, false, false, parentGameObj, itemCfg.resLayer2, resLayer);
                 SceneController.PhotographAddCollider(parentGameObj.transform.GetChild(0).gameObject);
 
             }
-            // for (int i = 0; i < parentGameObj.transform.childCount; i++)
-            // {
-            //     var parentGameObj = new GameObject(string.Format("{0}_{1}", itemId, index));
-            //     parentGameObj.transform.SetParent(sceneObj.transform.Find("Scene"), false);
 
-            // DressUpUtil.AddItem(itemId, sceneObj, false, false, parentGameObj);
-
-            // GameObject childGameObj = parentGameObj.transform.GetChild(i).gameObject;
-            // SceneController.PhotographAddCollider(childGameObj);
-            // }
         }
         //传入父物体,根据所有子物体大小计算父物体边框大小
         public static Vector2 GetGameObjectSize(GameObject parentObj)
@@ -261,7 +260,7 @@ namespace GFGGame
                 BoxCollider2D boxCollider2D = childGameObj.GetComponent<BoxCollider2D>();
                 if (boxCollider2D != null)
                 {
-                    return boxCollider2D.size * 100;
+                    return boxCollider2D.size * childGameObj.transform.localScale * 100;
                 }
             }
             return Vector2.zero;
@@ -309,5 +308,22 @@ namespace GFGGame
             angle *= Mathf.Sign(Vector3.Dot(normal, Vector3.forward));  //Mathf.Sign()求符号,Vector3.Dot()求方向,求法线向量与物体上方向向量点乘,结果为1或-1,修正旋转方向 
             return angle;
         }
+
+        public static GameObject GetFirstHitObj(RaycastHit2D[] hit2Ds)
+        {
+            int layer = int.MinValue;
+            GameObject gameObject = null;
+            for (int i = 0; i < hit2Ds.Length; i++)
+            {
+                SpriteRenderer spr = hit2Ds[i].collider.gameObject.GetComponent<SpriteRenderer>();
+
+                if (spr && spr.sortingOrder > layer)
+                {
+                    gameObject = hit2Ds[i].collider.gameObject;
+                    layer = spr.sortingOrder;
+                }
+            }
+            return gameObject;
+        }
     }
 }

+ 2 - 2
GameClient/Assets/Game/HotUpdate/Views/DressUp/PhotographSaveView.cs

@@ -43,7 +43,7 @@ namespace GFGGame
             int index = Application.persistentDataPath.IndexOf("Android");
             path = index < 0 ? path : Application.persistentDataPath.Substring(0, index);
 
-            path = "file://sdcard/DCIM/";
+            // path = "file://sdcard/DCIM/";
 
 #endif
             //判断目录是否存在,不存在则会创建目录
@@ -65,7 +65,7 @@ namespace GFGGame
             Debug.Log("文件路径:" + path);
             Texture2D tex = this.viewData as Texture2D;
             byte[] bytes = tex.EncodeToPNG();//将纹理数据,转化成一个png图片
-            File.WriteAllBytes(path + "/" + fileName, bytes);
+            File.WriteAllBytes(path + "/Pictures" + fileName, bytes);
             Timers.inst.StartCoroutine(GetSaveState(path));// ();
             // string[] paths = new string[1];
             // paths[0] = path;

+ 21 - 7
GameClient/Assets/Game/HotUpdate/Views/DressUp/PhotographView.cs

@@ -48,7 +48,7 @@ namespace GFGGame
         private RotationGesture rotationGesture;
 
         private bool isTouchUI = false;
-
+        private int maxLayer = int.MinValue;//最上层的层级数
         protected override void OnInit()
         {
             base.OnInit();
@@ -170,8 +170,9 @@ namespace GFGGame
                         _equipSceneData.Add(itemID, new List<int>());
                     }
                     _equipSceneData[itemID].Add(itemID);
-                    SceneController.AddScene(_sceneObject, itemID, _equipSceneData[itemID].Count - 1);
 
+                    SceneController.AddScene(_sceneObject, itemID, _equipSceneData[itemID].Count - 1, maxLayer + 1);
+                    maxLayer++;
                     break;
                 case EnumPhotographType.EFFECT:
 
@@ -186,11 +187,19 @@ namespace GFGGame
             if (_ui.m_ComSelectRes.target.visible == true) return;
             if (context.inputEvent.touchId != 0) return;
             if (isTouchUI) return;
-            RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
-            if (hit.collider != null)
+            RaycastHit2D[] hit2Ds = Physics2D.RaycastAll(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
+            if (hit2Ds.Length > 0)
             {
+                hitParentGameObj = SceneController.GetFirstHitObj(hit2Ds);
+                maxLayer++;
+                if (hitParentGameObj.name != "BgRes")
+                {
+                    hitParentGameObj.GetComponent<SpriteRenderer>().sortingOrder = maxLayer;
+                    hitParentGameObj = hitParentGameObj.transform.parent.gameObject;
+                }
 
-                hitParentGameObj = hit.collider.name == "BgRes" ? hit.collider.gameObject : hit.collider.transform.parent.gameObject;
+
+                // hitParentGameObj = hitParentGameObj.name == "BgRes" ? hitParentGameObj :
                 distance = Input.mousePosition - Camera.main.WorldToScreenPoint(hitParentGameObj.transform.position);
 
 
@@ -202,7 +211,7 @@ namespace GFGGame
                     // _ui.m_comSelectBox.target.SetScale(1, 1);
                     _ui.m_comSelectBox.target.rotation = -hitParentGameObj.transform.eulerAngles.z;
                     _ui.m_comSelectBox.target.size = SceneController.GetGameObjectSize(hitParentGameObj);
-                    _ui.m_comSelectBox.target.SetScale(hitParentGameObj.transform.localScale.x, hitParentGameObj.transform.localScale.y);
+                    // _ui.m_comSelectBox.target.SetScale(hitParentGameObj.transform.localScale.x, hitParentGameObj.transform.localScale.y);
 
                 }
                 _ui.m_comSelectBox.m_btnDelete.visible = true;
@@ -376,7 +385,7 @@ namespace GFGGame
         private void UpdateBgOrNpcOrBorder(EnumPhotographType type, int itemId)
         {
 
-            SceneController.UpdatePhotographBgOrNpcOrBorder(_sceneObject, type, itemId);
+            SceneController.UpdatePhotographBgOrNpcOrBorder(_sceneObject, type, itemId, maxLayer, out maxLayer);
         }
 
         //主角
@@ -403,7 +412,12 @@ namespace GFGGame
             {
                 for (int i = 0; i < _equipSceneData[key].Count; i++)
                 {
+
                     SceneController.AddScene(_sceneObject, key, i);
+                    ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(key);
+                    if (itemCfg.resLayer1 > maxLayer) maxLayer = itemCfg.resLayer1;
+                    if (itemCfg.resLayer2 > maxLayer) maxLayer = itemCfg.resLayer2;
+
                 }
             }
         }