Files
HX_MapEditor/Assets/Scripts/UI/UIMonsterPanel.cs
2025-07-19 01:21:40 +08:00

327 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using HxGame.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
using static HxGame.Data.MonstersConfig;
/*
* 如果坐标点一样
* 算是一个分页
*
*/
public class UIMonsterPanel : MonoBehaviour
{
[HideInInspector]
public InputField curActiveInput;
[HideInInspector]
public List<string> 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 = 0;
private UIMonsterItem _curMonsterItem;
public MonstersConfig monstersConfig = new();
private void Awake()
{
btnClose.onClick.AddListener(OnClickClose);
btnAddGroup.onClick.AddListener(OnAddGroup);
txtMonsterID.onEndEdit.AddListener(OnEditorMonsterId);
txtName.onEndEdit.AddListener(OnEditorMonsterName);
txtRadius.onEndEdit.AddListener(OnEditorMonsterRadius);
txtCount.onEndEdit.AddListener(OnEditorMonsterCount);
txtRefreshTime.onEndEdit.AddListener(OnEditorRefTime);
dropRefreshType.onValueChanged.AddListener(OnEditorRefType);
}
private void OnEditorRefType(int arg0)
{
if (_curMonsterItem == null) return;
_curMonsterItem.monster.createMode = (CreateMonsterMode)arg0;
}
private void OnEditorRefTime(string arg0)
{
if (_curMonsterItem == null) return;
if (!int.TryParse(arg0, out var intValue))
{
UIWindow.Instance.ShowMessage("格式不正确");
return;
}
_curMonsterItem.monster.delayTime = intValue;
}
private void OnEditorMonsterCount(string arg0)
{
if (!int.TryParse(arg0, out var intValue))
{
UIWindow.Instance.ShowMessage("格式不正确");
return;
}
_curMonsterItem.monster.num = intValue;
_curMonsterItem.RefreshItem();
}
private void OnEditorMonsterRadius(string arg0)
{
if (_curMonsterItem == null || _curMonsterItem.monster.itemIdx == -1)
return;
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;
}
var gropcfg = monstersConfig.monsterConfigs.Find((monster) => monster.itemIdx == _curMonsterItem.monster.itemIdx);
if (gropcfg == null) return;
int index = monstersConfig.monsterConfigs.IndexOf(gropcfg);
MonstersConfig.MonsterConfig newmonster = new MonstersConfig.MonsterConfig();
monstersConfig.monsterConfigs.Insert(index + 1, newmonster);
foreach (var prop in typeof(MonsterConfig).GetFields())
{
prop.SetValue(newmonster, prop.GetValue(gropcfg));
}
newmonster.itemIdx = -1;
newmonster.groupId = gropcfg.itemIdx;
AddItem(newmonster);
}
public void AddItem()
{
Cleanup();
MonstersConfig.MonsterConfig monster = new MonstersConfig.MonsterConfig();
monster.itemIdx = ++itemIdx;
monster.groupId = -1;
monster.radius = 10;
monster.pos = new Vector2Int(MapManager.Instance.map.selector.horizontalNumber / 2, MapManager.Instance.map.selector.verticalNumber / 2);
monstersConfig.monsterConfigs.Insert(0, monster);
var createItem = AddItem(monster);
OnClickItem(createItem);
}
public void LoadMonsterConfig(int mapId)
{
monstersConfig.ClearAll();
if (!monstersConfig.LoadXML(mapId))
return;
for (int i = 0; i < monstersConfig.monsterConfigs.Count; i++)
{
MonstersConfig.MonsterConfig monster = monstersConfig.monsterConfigs[i];
if (monster.itemIdx == -1) continue;
var itemMonster = AddItem(monster);
if (itemMonster == null) continue;
var groupList = monstersConfig.monsterConfigs.Where(item => item.groupId == monster.itemIdx).ToList();
foreach (var item in groupList)
{
AddItem(item);
}
}
}
public UIMonsterItem AddItem(MonstersConfig.MonsterConfig monster)
{
UnityEngine.Object obj = Resources.Load("Prefabs/monsterItem");
if (obj == null)
{
UIWindow.Instance.ShowMessage("monsterItem.prefab失败");
return null;
}
var cfgindex = monstersConfig.monsterConfigs.IndexOf(monster);
itemIdx = Math.Max(monster.itemIdx, itemIdx);
GameObject go = Instantiate(obj) as GameObject; ;
go.transform.SetParent(itemParent, false);
go.transform.SetSiblingIndex(cfgindex);
UIMonsterItem item = go.transform.Find("monsterSubItem").GetComponent<UIMonsterItem>();
item.editCellType = MapManager.EditCellType.MonsterArea;
item.SetItem(monster);
item.OnClick = OnClickItem;
item.OnCopyItem = OnCopyItem;
_curMonsterItem = item;
return item;
}
public void OnClickItem(UIMonsterItem item)
{
//先保存上一条信息
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;
ScrollToTarget(item);
}
public void OnCopyItem(UIMonsterItem item)
{
var gropcfg = monstersConfig.monsterConfigs.Find((monster) => monster.itemIdx == item.monster.itemIdx);
if (gropcfg == null) return;
int index = monstersConfig.monsterConfigs.IndexOf(gropcfg);
if (item.monster.itemIdx == -1)
{
MonstersConfig.MonsterConfig newmonster = new MonstersConfig.MonsterConfig();
monstersConfig.monsterConfigs.Insert(index + 1, newmonster);
foreach (var prop in typeof(MonsterConfig).GetFields())
{
prop.SetValue(newmonster, prop.GetValue(gropcfg));
}
newmonster.itemIdx = -1;
newmonster.groupId = gropcfg.itemIdx;
AddItem(newmonster);
}
else {
var grops = monstersConfig.monsterConfigs.FindAll((tt) => tt.groupId == item.monster.itemIdx);
int inserIndex = index + grops.Count + 1;
//先拷贝自己,再拷贝组内
MonstersConfig.MonsterConfig newmonster = new MonstersConfig.MonsterConfig();
monstersConfig.monsterConfigs.Insert(inserIndex, newmonster);
foreach (var prop in typeof(MonsterConfig).GetFields())
{
prop.SetValue(newmonster, prop.GetValue(item.monster));
}
newmonster.itemIdx = ++itemIdx;
newmonster.groupId = -1;
AddItem(newmonster);
foreach (var gropItem in grops)
{
MonsterConfig config = new MonsterConfig();
monstersConfig.monsterConfigs.Insert(++inserIndex, config);
foreach (var prop in typeof(MonsterConfig).GetFields())
{
prop.SetValue(config, prop.GetValue(gropItem));
}
config.groupId = newmonster.itemIdx;
config.itemIdx = -1;
AddItem(config);
}
}
}
public void SaveMonsterConfig()
{
int mapId = MapManager.Instance._curOpenMapId;
monstersConfig.SaveXML(mapId);
}
public void RemoveAllGrop(MonsterConfig config)
{
if (config.itemIdx == -1)
return;
foreach (Transform child in svMonsters.content)
{
UIMonsterItem item = child.GetComponentInChildren<UIMonsterItem>();
if (item != null && item.monster.groupId == config.itemIdx)
{
item.DestoryGrop();
}
}
}
public void ScrollToTarget(UIMonsterItem target)
{
var index = monstersConfig.monsterConfigs.IndexOf(target.monster);
if (index != -1)
{
svMonsters.verticalNormalizedPosition = 1 - (float)index / (monstersConfig.monsterConfigs.Count - 1);
}
}
public void UpdateGroupInfo(UIMonsterItem target)
{
if (target.monster.itemIdx != -1)
{
var allitems = monstersConfig.monsterConfigs.FindAll((item) => item.groupId == target.monster.itemIdx);
foreach (var item in allitems)
{
item.pos = target.monster.pos;
item.radius = target.monster.radius;
}
foreach (Transform child in svMonsters.content)
{
UIMonsterItem item = child.GetComponentInChildren<UIMonsterItem>();
if (item != null && item.monster.groupId == target.monster.itemIdx)
{
item.RefreshItem();
}
}
}
}
public void RemoveAll()
{
int size = itemParent.childCount;
for (int i=0; i<size; i++)
{
DestroyImmediate(itemParent.GetChild(0).gameObject);
}
}
}