using AX.MessageSystem; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Xml; using UnityEngine; using UnityEngine.UI; public class SecondNodeManager : MonoBehaviour { public Button addButton; public Button deleteButton; public Button editorButton; public Button saveButton; public Button addTagButton; public Toggle recordStop; public Transform itemParent; public GameObject nodeWindow; public GameObject tagWindow; public ReplayManager replayManager; private GameObject itemPrefab; private List list; public static SecondNodeObject selectNode; public GameObject tagListPanel; private void Awake() { MessageDispatcher.AddListener("FirstNodeSelected", DrawItem); MessageDispatcher.AddListener("DataInitializationComplete", SetItemUI); } // Use this for initialization void Start() { addButton.onClick.AddListener(AddNodeWindow); deleteButton.onClick.AddListener(DeleteNodeWindow); editorButton.onClick.AddListener(EditorNodeWindow); saveButton.onClick.AddListener(SaveNodeWindow); addTagButton.onClick.AddListener(AddTagWindow); recordStop.onValueChanged.AddListener(ChangeRecordStatus); //list = DisasterManager.secondNodeObjects; itemPrefab = Resources.Load("UI/SecondNodeItem") as GameObject; MessageDispatcher.AddListener("DeleteFirstNode", DestoryItem); MessageDispatcher.AddListener("PlayStatusChanged", SetUIByPlayStatus); SetUI(); } // Update is called once per frame void Update() { } private void OnDestroy() { MessageDispatcher.RemoveListener("FirstNodeSelected", DrawItem); MessageDispatcher.RemoveListener("DeleteFirstNode", DestoryItem); MessageDispatcher.RemoveListener("PlayStatusChanged", SetUIByPlayStatus); MessageDispatcher.RemoveListener("DataInitializationComplete", SetItemUI); } private void SetItemUI(IMessage obj) { selectNode = null; foreach (Transform item in itemParent) { Destroy(item.gameObject); } } /// /// 一级节点更改后绘制二级节点 /// /// private void DrawItem(IMessage data) { selectNode = null; foreach (Transform item in itemParent) { Destroy(item.gameObject); } var firstNode = FirstNodeManager.selectNode; if (itemPrefab == null) { itemPrefab = Resources.Load("UI/SecondNodeItem") as GameObject; } list = DisasterManager.secondNodeObjects; foreach (var obj in list) { if (obj.ParentID == firstNode.nodeID) { AddNodeItem(obj); } } } /// /// 一级节点删除后删除二级节点 /// /// private void DestoryItem(IMessage data) { selectNode = null; foreach (Transform item in itemParent) { var obj = item.GetComponent().obj; DeleteXml(obj);//xml文件中删除 list.Remove(obj); Destroy(item.gameObject); } } /// /// 添加节点 /// private void AddNodeWindow() { if (FirstNodeManager.selectNode == null) { ResourceLoadWindow.Instance.LoadTextHintWindow("请先选择一级节点", 0.5f); return; } ReplaySetting.PlayStatus = PlayStatus.isEditor;//编辑状态 RecordManager.Instance.RecordTimer = 0; RecordManager.Instance.jsonData = new JsonData(); recordStop.isOn = false; } /// /// 保存节点 /// private void SaveNodeWindow() { recordStop.isOn = true;//暂停记录 nodeWindow.SetActive(true); var node = new SecondNodeObject(); node.nodeID = -1; node.ParentID = FirstNodeManager.selectNode.nodeID; nodeWindow.GetComponent().SetWindow(node); } /// /// 继续记录 /// public void ContinueRecord() { recordStop.isOn = false; } /// /// 放弃本次记录 /// public void DeleteRecord() { ReplaySetting.PlayStatus = PlayStatus.normal; } /// /// 添加标签 /// private void AddTagWindow() { if (ReplaySetting.PlayStatus == PlayStatus.isEditor) { //在编辑状态下 recordStop.isOn = true;//暂停记录 } else if (ReplaySetting.PlayStatus == PlayStatus.isReplay) { //在回放状态下 replayManager.playOrPause.isOn = false;//暂停回放 } tagWindow.SetActive(true); var tag = new TagData(); tagWindow.GetComponent().SetWindow(tag); } /// /// 暂停,继续纪录改变状态 /// /// private void ChangeRecordStatus(bool isOn) { if (isOn) { RecordManager.Instance.recordStatus = RecordStatus.pause; addTagButton.gameObject.SetActive(false);//暂停时,禁止添加标签 MessageDispatcher.SendMessage("RecordStatusPause"); } else { RecordManager.Instance.RecordFrame();//记录开始或继续时记录状态数据 RecordManager.Instance.recordStatus = RecordStatus.normal; addTagButton.gameObject.SetActive(true); } } private void DeleteNodeWindow() { if (selectNode == null) { return; } ResourceLoadWindow.Instance.LoadTipWindow("确定删除该二级节点?", DeleteNode, null); } private void EditorNodeWindow() { if (selectNode == null) { return; } nodeWindow.SetActive(true); nodeWindow.GetComponent().SetWindow(selectNode); } /// /// 新增二级节点 /// /// public void AddNode(SecondNodeObject node) { if (node.nodeName == "") { ResourceLoadWindow.Instance.LoadTextHintWindow("节点名不能为空", 0.5f); return; } //查看有没有相同名称 if (CheckSameName(node.nodeName, node.nodeID)) { ResourceLoadWindow.Instance.LoadTextHintWindow("已有相同名称", 0.5f); return; } node.nodeID = GetNextID(); list.Add(node); AddNodeItem(node);//UI中添加 AddXml(node);//xml文件中添加 RecordManager.Instance.RecordFrame();//添加节点最后帧数据 RecordManager.Instance.jsonData.sumTime = RecordManager.Instance.RecordTimer;//总时间 RecordManager.Instance.SaveRecord(node.nodeName); nodeWindow.SetActive(false); ReplaySetting.PlayStatus = PlayStatus.normal; } /// /// 修改二级节点xml顺序 /// public void UpdateSecondNodeSort(Transform NodeParent) { SecondNodeItem[] thisNodes = NodeParent.GetComponentsInChildren(); if (thisNodes.Length<1) { return; } for (int i = 0; i < thisNodes.Length; i++) { UpdataNodeXml(thisNodes[i].obj); } for (int i = 0; i < thisNodes.Length; i++) { for (int j = 0; j < list.Count; j++) { if (list[j].nodeID == thisNodes[i].obj.nodeID) { list.Remove(list[j]); } } } for (int i = 0; i < thisNodes.Length; i++) { AddXml(thisNodes[i].obj); DisasterManager.secondNodeObjects.Add(thisNodes[i].obj); } } private void AddNodeItem(SecondNodeObject obj) { GameObject item = Instantiate(itemPrefab, itemParent) as GameObject; item.GetComponent().group = itemParent.GetComponent(); item.GetComponent().SetItem(obj); } private void AddXml(SecondNodeObject obj) { string filepath = DisasterManager.GetNodeListXML(); if (File.Exists(filepath)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(filepath); XmlNode nodes = xmlDoc.SelectSingleNode("NodeList/SecondNode/Nodes"); XmlElement node = xmlDoc.CreateElement("Node"); node.SetAttribute("ID", obj.nodeID.ToString()); node.SetAttribute("ParentID", obj.ParentID.ToString()); node.SetAttribute("Name", obj.nodeName); node.SetAttribute("Detail", obj.nodeDetail); nodes.AppendChild(node); xmlDoc.Save(filepath); } } /// /// 删除二级节点 /// private void DeleteNode() { foreach (Transform item in itemParent) { var msg = item.GetComponent(); if (msg.obj == selectNode) { Destroy(item.gameObject); break; } } DeleteXml(selectNode);//xml文件中删除 list.Remove(selectNode); } /// /// 修改二级节点xml文件 /// private void UpdataNodeXml(SecondNodeObject obj) { string filepath = DisasterManager.GetNodeListXML(); if (File.Exists(filepath)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(filepath); XmlNode nodes = xmlDoc.SelectSingleNode("NodeList/SecondNode/Nodes"); XmlNodeList nodeList = nodes.ChildNodes; for (int i = 0; i < nodeList.Count; i++) { var node = nodeList[i] as XmlElement; if (node.GetAttribute("ID") == obj.nodeID.ToString()) { nodes.RemoveChild(node); break; } } xmlDoc.Save(filepath); } } private void DeleteXml(SecondNodeObject obj) { //修改节点文件 string filepath = DisasterManager.GetNodeListXML(); if (File.Exists(filepath)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(filepath); XmlNode nodes = xmlDoc.SelectSingleNode("NodeList/SecondNode/Nodes"); XmlNodeList nodeList = nodes.ChildNodes; for (int i = 0; i < nodeList.Count; i++) { var node = nodeList[i] as XmlElement; if (node.GetAttribute("ID") == obj.nodeID.ToString()) { nodes.RemoveChild(node); break; } } xmlDoc.Save(filepath); } //删除数据文件 string dataFilePath = Application.dataPath + @"/Data/" + DisasterManager.disaster.Id + "/File/XmlData/" + obj.nodeName + ".xml"; if (File.Exists(dataFilePath)) { File.Delete(dataFilePath); } } /// /// 编辑二级节点 /// /// public void EditorNode(SecondNodeObject node) { if (node.nodeName == "") { ResourceLoadWindow.Instance.LoadTextHintWindow("节点名不能为空", 0.5f); return; } //查看有没有相同名称 if (CheckSameName(node.nodeName, node.nodeID)) { ResourceLoadWindow.Instance.LoadTextHintWindow("已有相同名称", 0.5f); return; } EditorNodeItem(node);//UI中修改 EditorXML(node);//xml文件中修改 nodeWindow.SetActive(false); } private void EditorNodeItem(SecondNodeObject obj) { foreach (Transform item in itemParent) { var msg = item.GetComponent(); if (msg.obj.nodeID == obj.nodeID) { msg.SetUI(); break; } } } private void EditorXML(SecondNodeObject obj) { string filepath = DisasterManager.GetNodeListXML(); if (File.Exists(filepath)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(filepath); XmlNode nodes = xmlDoc.SelectSingleNode("NodeList/SecondNode/Nodes"); XmlNodeList nodeList = nodes.ChildNodes; for (int i = 0; i < nodeList.Count; i++) { var node = nodeList[i] as XmlElement; if (node.GetAttribute("ID") == obj.nodeID.ToString()) { node.SetAttribute("Name", obj.nodeName.ToString()); node.SetAttribute("Detail", obj.nodeDetail.ToString()); break; } } xmlDoc.Save(filepath); } //修改数据文件名称 var oldNodeName = nodeWindow.GetComponent().oldNodeName; if (oldNodeName != obj.nodeName) { string oldPath = Application.dataPath + @"/Data/" + DisasterManager.disaster.Id + "/File/XmlData/" + oldNodeName + ".xml"; string dataFilePath = Application.dataPath + @"/Data/" + DisasterManager.disaster.Id + "/File/XmlData/" + obj.nodeName + ".xml"; if (File.Exists(oldPath)) { File.Move(oldPath,dataFilePath); } } } public void ShowTagList(GameObject node) { var nodeObject = node.GetComponent().obj; string nodeName = nodeObject.nodeName; //这里有问题,由于标签存储在每个节点的数据文件里,所以每次获取标签需要解读文件,这是数据存储设计导致的问题 string filePath = Application.dataPath + @"/Data/" + DisasterManager.disaster.Id + "/File/XmlData/" + nodeName + ".xml"; if (File.Exists(filePath)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(filePath); XmlNode firstNodes = xmlDoc.SelectSingleNode("Record"); var jsonData = JsonUtility.FromJson(firstNodes.InnerText); tagListPanel.SetActive(true); tagListPanel.transform.position = node.transform.position + new Vector3(0, -0.2f, 0); tagListPanel.GetComponent().Draw(jsonData.tagDataList); } } public void HideTagList() { tagListPanel.SetActive(false); } private void SetUI() { if (DisasterManager.editorRight) { addButton.gameObject.SetActive(true); deleteButton.gameObject.SetActive(true); editorButton.gameObject.SetActive(true); saveButton.gameObject.SetActive(false); addTagButton.gameObject.SetActive(false); recordStop.gameObject.SetActive(false); } else { addButton.gameObject.SetActive(false); deleteButton.gameObject.SetActive(false); editorButton.gameObject.SetActive(false); saveButton.gameObject.SetActive(false); addTagButton.gameObject.SetActive(false); recordStop.gameObject.SetActive(false); } } /// /// 根据游戏状态显示UI /// /// private void SetUIByPlayStatus(IMessage data) { if (DisasterManager.editorRight) { var playStatus = ReplaySetting.PlayStatus; if (playStatus == PlayStatus.normal) { addButton.gameObject.SetActive(true); deleteButton.gameObject.SetActive(true); editorButton.gameObject.SetActive(true); saveButton.gameObject.SetActive(false); addTagButton.gameObject.SetActive(false); recordStop.gameObject.SetActive(false); } else if (playStatus == PlayStatus.isEditor) { addButton.gameObject.SetActive(false); deleteButton.gameObject.SetActive(false); editorButton.gameObject.SetActive(false); saveButton.gameObject.SetActive(true); addTagButton.gameObject.SetActive(true); recordStop.gameObject.SetActive(true); } else if (playStatus == PlayStatus.isReplay) { addButton.gameObject.SetActive(false); deleteButton.gameObject.SetActive(false); editorButton.gameObject.SetActive(false); saveButton.gameObject.SetActive(false); addTagButton.gameObject.SetActive(true); recordStop.gameObject.SetActive(false); } } else { addButton.gameObject.SetActive(false); deleteButton.gameObject.SetActive(false); editorButton.gameObject.SetActive(false); saveButton.gameObject.SetActive(false); addTagButton.gameObject.SetActive(false); recordStop.gameObject.SetActive(false); } } /// /// 检查是否重名 /// /// /// private bool CheckSameName(string name, int id) { foreach (var node in list) { if (node.nodeName == name) { if (node.nodeID == id)//ID相同代表同一个节点 { continue; } return true; } } return false; } /// /// 从xml文件中获取自增主键 /// /// public int GetNextID() { int result = 0; string filepath = DisasterManager.GetNodeListXML(); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(filepath); XmlNode nextID = xmlDoc.SelectSingleNode("NodeList/SecondNode/NextID"); result = int.Parse(nextID.InnerText); nextID.InnerText = (result + 1).ToString(); xmlDoc.Save(filepath); return result; } }