using HxGame.Data; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using static System.Net.Mime.MediaTypeNames; /* * 如果坐标点一样 * 算是一个分页 * */ public class UIMonsterPanel : MonoBehaviour { [HideInInspector] public InputField curActiveInput; [HideInInspector] public List curActiveList; public Button btnClose; public Button btnAddMonster; public Button btnAddGroup; public Button btnDeleteGroup; #region MonsterInfo public InputField txtMonsterID; //怪物ID public InputField txtName; //怪物名称 public Dropdown dropRefreshType; //刷怪类型 public InputField txtRefreshTime; //刷怪时间(毫秒) public InputField txtCount; //刷怪数量 public InputField txtRadius; //刷怪范围 public Dropdown dropPatrol; //巡逻类型 public InputField txtPath; //巡逻路径 #endregion public ScrollRect svMonsters; public Transform itemParent; public int itemIdx; private UIMonsterItem _curMonsterItem; //private Dictionary> _dicGroupItem; private Dictionary _dicGroupItem; //分组归属的item private void Awake() { itemIdx = 0; //_dicGroupItem = new Dictionary>(); _dicGroupItem = new Dictionary(); btnClose.onClick.AddListener(OnClickClose); btnAddGroup.onClick.AddListener(OnAddGroup); btnDeleteGroup.onClick.AddListener(OnDeleteGroup); txtMonsterID.onEndEdit.AddListener(OnEditorMonsterId); txtName.onEndEdit.AddListener(OnEditorMonsterName); txtRadius.onEndEdit.AddListener(OnEditorMonsterRadius); txtCount.onEndEdit.AddListener(OnEditorMonsterCount); } private void OnEditorMonsterCount(string arg0) { if (!int.TryParse(arg0, out var intValue)) { UIWindow.Instance.ShowMessage("格式不正确"); return; } _curMonsterItem.monster.id = intValue; _curMonsterItem.RefreshItem(); } private void OnEditorMonsterRadius(string arg0) { if (!int.TryParse(arg0, out var intValue)) { UIWindow.Instance.ShowMessage("格式不正确"); return; } _curMonsterItem.monster.radius = intValue; _curMonsterItem.RefreshItem(); } private void OnEditorMonsterName(string arg0) { if (_curMonsterItem == null) return; _curMonsterItem.RefreshItem(); } private void OnEditorMonsterId(string arg0) { if (_curMonsterItem == null) return; if (!int.TryParse(arg0, out var intValue)) { UIWindow.Instance.ShowMessage("格式不正确"); return; } _curMonsterItem.monster.id = intValue; _curMonsterItem.RefreshItem(); } private void OnClickClose() { UIWindow.Instance.uiEditMapConfig.togEditMonsters.isOn = false; } private void Cleanup() { txtMonsterID.text = string.Empty; txtName.text = string.Empty; txtRefreshTime.text = string.Empty; txtCount.text = string.Empty; txtRadius.text = string.Empty; txtPath.text = string.Empty; } //添加分组,将item赋予分组ID private void OnAddGroup() { if (_curMonsterItem == null) return; if(_curMonsterItem.groupId > 0) { UIWindow.Instance.ShowMessage("不能在分页上创建分页"); return; } _curMonsterItem.transform.parent.GetComponent().sizeDelta += Vector2Int.up * 30; UnityEngine.Object obj = Resources.Load("Prefabs/monsterSubItem"); if (obj == null) { UIWindow.Instance.ShowMessage("monsterSubItem.prefab失败"); return; } GameObject go = Instantiate(obj) as GameObject; ; go.transform.SetParent(_curMonsterItem.transform.parent, false); UIMonsterItem item = go.GetComponent(); item.SetGroup(_curMonsterItem.monster.itemIdx); //将item的索引设置为groupId MonstersConfig.MonsterConfig monster = new MonstersConfig.MonsterConfig(); monster.groupId = _curMonsterItem.monster.itemIdx; monster.itemIdx = -1; item.SetItem(monster); item.OnClick = OnClickItem; item.OnCopyItem = OnCopyItem; item.btnClickSelf.Select(); AddGroupMap(_curMonsterItem.monster.itemIdx, _curMonsterItem); } private void OnAddGroup(MonstersConfig.MonsterConfig monster) { if (_curMonsterItem == null) return; _curMonsterItem.transform.parent.GetComponent().sizeDelta += Vector2Int.up * 30; UnityEngine.Object obj = Resources.Load("Prefabs/monsterSubItem"); if (obj == null) { UIWindow.Instance.ShowMessage("monsterSubItem.prefab失败"); return; } GameObject go = Instantiate(obj) as GameObject; ; go.transform.SetParent(_curMonsterItem.transform.parent, false); UIMonsterItem item = go.GetComponent(); item.SetGroup(_curMonsterItem.monster.itemIdx); //将item的索引设置为groupId monster.groupId = _curMonsterItem.monster.itemIdx; item.SetItem(monster); item.OnClick = OnClickItem; item.OnCopyItem = OnCopyItem; AddGroupMap(_curMonsterItem.monster.itemIdx, _curMonsterItem); } private void OnDeleteGroup() { if (_curMonsterItem == null) return; _curMonsterItem.transform.parent.GetComponent().sizeDelta -= Vector2Int.up * 30; DestroyImmediate(_curMonsterItem.gameObject); _curMonsterItem = null; } public void AddItem() { Cleanup(); UnityEngine.Object obj = Resources.Load("Prefabs/monsterItem"); if (obj == null) { UIWindow.Instance.ShowMessage("monsterItem.prefab失败"); return; } GameObject go = Instantiate(obj) as GameObject; ; go.transform.SetParent(itemParent, false); UIMonsterItem item = go.transform.Find("monsterSubItem").GetComponent(); MonstersConfig.MonsterConfig monster = new MonstersConfig.MonsterConfig(); monster.itemIdx = ++itemIdx; monster.radius = 1; monster.id = 0; monster.num = 0; monster.pos = MapManager.Instance.map.selector.getMapGrid(Camera.main.transform.position); item.SetItem(monster); item.OnClick = OnClickItem; item.OnCopyItem = OnCopyItem; _curMonsterItem = item; item.btnClickSelf.Select(); } public void LoadMonsterConfig(int mapId) { MonstersConfig mc = new MonstersConfig(); if (!mc.LoadXML(mapId)) return; //怪物 for (int i = 0; i < mc.monsterConfigs.Count; i++) { MonstersConfig.MonsterConfig monster = mc.monsterConfigs[i]; if (_curMonsterItem != null && monster.groupId >= 0 && monster.groupId == _curMonsterItem.monster.itemIdx) OnAddGroup(monster); else AddItem(monster); } } public void AddItem(MonstersConfig.MonsterConfig monster) { UnityEngine.Object obj = Resources.Load("Prefabs/monsterItem"); if (obj == null) { UIWindow.Instance.ShowMessage("monsterItem.prefab失败"); return; } if (monster.itemIdx < 0) monster.itemIdx = itemIdx++; else itemIdx = monster.itemIdx; GameObject go = Instantiate(obj) as GameObject; ; go.transform.SetParent(itemParent, false); UIMonsterItem item = go.transform.Find("monsterSubItem").GetComponent(); //item.SetItem(itemIdx++, monster); item.SetItem(monster); item.OnClick = OnClickItem; item.OnCopyItem = OnCopyItem; _curMonsterItem = item; } private void SaveItem() { if (_curMonsterItem == null) return; if (string.IsNullOrEmpty(txtMonsterID.text)) return; //分组的不保存位置 if(_curMonsterItem.groupId < 0) { string[] tmp = _curMonsterItem.txtPos.text.Split(','); if (tmp.Length != 2) return; int x = Convert.ToInt32(tmp[0]); int y = Convert.ToInt32(tmp[1]); _curMonsterItem.monster.pos = new Vector2Int(x, y); } else { if(_dicGroupItem.ContainsKey(_curMonsterItem.groupId)) { string[] tmp = _dicGroupItem[_curMonsterItem.groupId].txtPos.text.Split(','); if (tmp.Length != 2) return; int x = Convert.ToInt32(tmp[0]); int y = Convert.ToInt32(tmp[1]); _curMonsterItem.monster.pos = new Vector2Int(x, y); } } _curMonsterItem.monster.id = Convert.ToInt32(txtMonsterID.text); _curMonsterItem.monster.createMode = (CreateMonsterMode)dropRefreshType.value; if (_curMonsterItem.monster.createMode == CreateMonsterMode.Death) _curMonsterItem.monster.delayTime = Convert.ToInt32(txtRefreshTime.text); else _curMonsterItem.monster.strTime = txtRefreshTime.text; _curMonsterItem.monster.num = Convert.ToInt32(txtCount.text); _curMonsterItem.monster.radius = Convert.ToInt32(txtRadius.text); _curMonsterItem.monster.patrolMode = (PatrolMode)dropPatrol.value; _curMonsterItem.RefreshItem(); } public void OnClickItem(UIMonsterItem item) { //先保存上一条信息 SaveItem(); Cleanup(); _curMonsterItem = item; MonstersConfig.MonsterConfig monster = _curMonsterItem.monster; txtMonsterID.text = monster.id.ToString(); dropRefreshType.value = (int)monster.createMode; if (monster.createMode == CreateMonsterMode.Death) txtRefreshTime.text = monster.delayTime.ToString(); else txtRefreshTime.text = monster.strTime; txtCount.text = monster.num.ToString(); txtRadius.text = monster.radius.ToString(); dropPatrol.value = (int)monster.patrolMode; for (int i = 0; i < monster.paths.Count; i++) { string[] pos = monster.paths[i].Split('_'); int x = Convert.ToInt32(pos[0]); int y = Convert.ToInt32(pos[1]); txtPath.text += $"[{monster.paths[i].Replace('_', ',')}]"; MapManager.Instance.AddMonsterPathSize(); MapManager.Instance.CreateSpecialPoint(x, y, MapManager.EditCellType.MonsterPath); } } private void CopyItem(MonstersConfig.MonsterConfig monster) { MonstersConfig.MonsterConfig m = new MonstersConfig.MonsterConfig(); m.itemIdx = ++itemIdx; m.id = monster.id; m.num = monster.num; m.radius = monster.radius; m.pos = monster.pos; m.createMode = monster.createMode; m.delayTime = monster.delayTime; m.strTime = monster.strTime; m.patrolMode = monster.patrolMode; m.paths = monster.paths; AddItem(m); } //public void OnCopyItem(MonstersConfig.MonsterConfig monster) public void OnCopyItem(UIMonsterItem item) { SaveItem(); CopyItem(item.monster); if (!_dicGroupItem.ContainsKey(item.monster.itemIdx)) return; var count = item.transform.parent.childCount; if (count == 1) return; //忽略第一条 for (int i = 1; i < count; i++) { var tf = item.transform.parent.GetChild(i); UIMonsterItem item_new = tf.GetComponent(); MonstersConfig.MonsterConfig m = new MonstersConfig.MonsterConfig(); m.itemIdx = -1; m.id = item_new.monster.id; m.num = item_new.monster.num; m.radius = item_new.monster.radius; m.pos = item_new.monster.pos; m.createMode = item_new.monster.createMode; m.delayTime = item_new.monster.delayTime; m.strTime = item_new.monster.strTime; m.patrolMode = item_new.monster.patrolMode; m.paths = item_new.monster.paths; //复制 OnAddGroup(m); } } public void SaveMonsterConfig() { if(_curMonsterItem != null) OnClickItem(_curMonsterItem); //刷怪 int x, y; MonstersConfig mc = new MonstersConfig(); for (int i = 0; i < itemParent.childCount; i++) { var tf = itemParent.GetChild(i); for(int j=0; j(); //如果是分组item,复制pos if(item.groupId > 0) { if (_dicGroupItem.ContainsKey(item.groupId)) { string[] tmp = _dicGroupItem[item.groupId].txtPos.text.Split(','); if (tmp.Length != 2) return; x = Convert.ToInt32(tmp[0]); y = Convert.ToInt32(tmp[1]); item.monster.pos = new Vector2Int(x, y); } } mc.monsterConfigs.Add(item.monster); } } int mapId = MapManager.Instance._curOpenMapId; mc.SaveXML(mapId); } private void AddGroupMap(int groupId, UIMonsterItem item) { if (_dicGroupItem.ContainsKey(groupId)) return; _dicGroupItem.Add(groupId, item); } public void RemoveAll() { int size = itemParent.childCount; for (int i=0; i