using System.Collections.Generic; using FairyGUI; using UI.DressUp; using UnityEngine; namespace GFGGame { public enum EnumPhotographType { BG, NPC, SCENE, BORDER, EFFECT } public class PhotographDataManager : SingletonBase { public List itemGameObjs = new List(); public List _equipRoleData = new List();//当前穿戴的角色数据 public Dictionary> _equipSceneData = new Dictionary>();//当前穿戴的场景数据 public List listBgData = new List(); public List listNpcData = new List(); public List listSceneData = new List(); public List listBorderData = new List(); public List listEffectData = new List(); public void Clear() { listBgData.Clear(); listNpcData.Clear(); listSceneData.Clear(); listBorderData.Clear(); listEffectData.Clear(); } public void Add(int itemID) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemID); if (itemCfg.itemType == ConstItemType.DRESS_UP) { if (itemCfg.subType == ConstDressUpItemType.BEI_JING) { if (listBgData.IndexOf(itemID) < 0) listBgData.Add(itemID); } else if (itemCfg.subType == ConstDressUpItemType.QIAN_JING || itemCfg.subType == ConstDressUpItemType.BEI_SHI || itemCfg.subType == ConstDressUpItemType.HUAN_JING) { if (listSceneData.IndexOf(itemID) < 0) listSceneData.Add(itemID); } } else if (itemCfg.itemType == ConstItemType.ITEM) { if (itemCfg.subType == ConstItemSubType.NPC) { if (listNpcData.IndexOf(itemID) < 0) listNpcData.Add(itemID); } else if (itemCfg.subType == ConstItemSubType.BOREDR) { if (listBorderData.IndexOf(itemID) < 0) listBorderData.Add(itemID); } else if (itemCfg.subType == ConstItemSubType.EFFECT) { if (listEffectData.IndexOf(itemID) < 0) listEffectData.Add(itemID); } } } //将穿戴数据分类 public void ClassifyEquipData() { _equipRoleData.Clear(); _equipSceneData.Clear(); for (int i = 0; i < EquipDataCache.cacher.equipDatas.Count; i++) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(EquipDataCache.cacher.equipDatas[i]); if (itemCfg.subType == ConstDressUpItemType.QIAN_JING || itemCfg.subType == ConstDressUpItemType.BEI_SHI || itemCfg.subType == ConstDressUpItemType.HUAN_JING || itemCfg.subType == ConstDressUpItemType.FEN_WEI) { PhotographDataManager.Instance.AddEquipItem(_equipSceneData, itemCfg.id, out _equipSceneData); } else { _equipRoleData.Add(EquipDataCache.cacher.equipDatas[i]); } } } public void AddEquipItem(Dictionary> _equipSceneData, int itemID, out Dictionary> equipSceneData) { if (!_equipSceneData.ContainsKey(itemID)) { _equipSceneData.Add(itemID, new List()); } _equipSceneData[itemID].Add(itemID); equipSceneData = _equipSceneData; } public List GetListData(EnumPhotographType index) { List _listData = null; switch (index) { case EnumPhotographType.BG: _listData = PhotographDataManager.Instance.listBgData; break; case EnumPhotographType.NPC: _listData = PhotographDataManager.Instance.listNpcData; break; case EnumPhotographType.SCENE: _listData = PhotographDataManager.Instance.listSceneData; break; case EnumPhotographType.BORDER: _listData = PhotographDataManager.Instance.listBorderData; break; case EnumPhotographType.EFFECT: _listData = PhotographDataManager.Instance.listEffectData; break; } return _listData; } //是否点击在UI上 public bool IsTouchUI(GComponent viewCom) { GObject obj = GRoot.inst.touchTarget; UI_PhotographUI _viewCom = UI_PhotographUI.Proxy(viewCom); return _viewCom.m_comSelectBox.m_btnSize.GetChild("icon").asLoader == obj || _viewCom.m_comSelectBox.m_btnDelete.GetChild("icon").asLoader == obj || _viewCom.m_comSelectBox.m_btnFlip.GetChild("icon").asLoader == obj || _viewCom.m_btnBack == obj || _viewCom.m_btnChoose.GetChild("icon").asLoader == obj || _viewCom.m_btnPhotograph.GetChild("icon").asLoader == obj || _viewCom.m_btnUp.GetChild("icon").asLoader == obj || _viewCom.m_btnDown.GetChild("icon").asLoader == obj; } public void SetLayer(GameObject hitGameObj, string state) { if (state != "refresh") { int index = itemGameObjs.IndexOf(hitGameObj); if (state != "top") { if (index < 0) { PromptController.Instance.ShowFloatTextPrompt("未选中任物品"); return; } if (index == 0 && state == "down") { PromptController.Instance.ShowFloatTextPrompt("已经在最下层了"); return; } if (index == itemGameObjs.Count - 1 && state == "up") { PromptController.Instance.ShowFloatTextPrompt("已经在最上层了"); return; } } GameObject gameObject = itemGameObjs[index]; itemGameObjs.RemoveAt(index); if (state == "up") { itemGameObjs.Insert((index + 1), gameObject); } else if (state == "down") { itemGameObjs.Insert((index - 1), gameObject); } else if (state == "top") { itemGameObjs.Add(gameObject); } else { PromptController.Instance.ShowFloatTextPrompt(state + "操作失败"); return; } } for (int i = 0; i < itemGameObjs.Count; i++) { PhotographDataManager.Instance.ChangeLayer(itemGameObjs[i], i * 100, state); } } private void ChangeLayer(GameObject parentObj, int layer, string state) { int count = 0; if (state == "up" || state == "top") { count = layer - GetMinLayer(parentObj); } else if (state == "down") { count = layer - GetMaxLayer(parentObj); } int maxLayer = int.MinValue; SpriteRenderer[] sps = parentObj.GetComponentsInChildren(); for (int i = 0; i < sps.Length; i++) { sps[i].sortingOrder = sps[i].sortingOrder + layer + count; if (maxLayer < sps[i].sortingOrder) { maxLayer = sps[i].sortingOrder; } } for (int i = 0; i < parentObj.transform.childCount; i++) { Transform tf = parentObj.transform.GetChild(i); string[] strs = tf.name.Split('_'); if (strs.Length > 1 && strs[1] == "eff")//子物体是特效 { DressUpUtil.SetParticleSortingOrder(tf.gameObject, maxLayer); } } } private int GetMaxLayer(GameObject parentObj) { int layer = int.MinValue; for (int i = 0; i < parentObj.transform.childCount; i++) { Transform tf = parentObj.transform.GetChild(i); SpriteRenderer sp = tf.GetComponent(); if (sp && layer < sp.sortingOrder) { layer = sp.sortingOrder; } } return layer; } public int GetMinLayer(GameObject parentObj) { int layer = int.MaxValue; for (int i = 0; i < parentObj.transform.childCount; i++) { Transform tf = parentObj.transform.GetChild(i); SpriteRenderer sp = tf.GetComponent(); if (sp && sp.sortingOrder < layer) { layer = sp.sortingOrder; } } return layer; } public void SetBgPos(GameObject hitGameObj, Vector2 uiSize) { Vector2 size = hitGameObj.GetComponent().size; float deviationWidth = (size.x - uiSize.x / 100) / 2; float deviationHeigh = (size.y - uiSize.y / 100) / 2; Vector2 pos = hitGameObj.transform.position; if (pos.x <= -deviationWidth) { hitGameObj.transform.position = new Vector2(-deviationWidth, hitGameObj.transform.position.y); } if (pos.x >= deviationWidth) { hitGameObj.transform.position = new Vector2(deviationWidth, hitGameObj.transform.position.y); } if (pos.y <= -deviationHeigh) { hitGameObj.transform.position = new Vector2(hitGameObj.transform.position.x, -deviationHeigh); } if (pos.y >= deviationHeigh) { hitGameObj.transform.position = new Vector2(hitGameObj.transform.position.x, deviationHeigh); } } public void AddItemGameObject(GameObject parentGameObj, bool setLayer) { itemGameObjs.Add(parentGameObj); if (setLayer) { int index = itemGameObjs.Count - 1; PhotographDataManager.Instance.ChangeLayer(itemGameObjs[index], index * 100, "up"); } itemGameObjs.Sort((GameObject a, GameObject b) => { int layerA = PhotographDataManager.Instance.GetMinLayer(a); int layerB = PhotographDataManager.Instance.GetMinLayer(b); if (layerA < layerB) { return -1; } else if (layerA > layerB) { return 1; } return 0; }); } } }