public static List<OperItem> ReadXML(string fileName, Transform rootTrans) { /// <summary> /// 操作列表 /// </summary> List<OperItem> oper = new List<OperItem>(); XmlDocument doc = new XmlDocument(); TextAsset textAsset = (TextAsset)Resources.Load(fileName, typeof(TextAsset)); doc.LoadXml(textAsset.text); // doc.Load(Application.dataPath + "\\" + fileName); XmlNode root = doc.SelectSingleNode("root"); XmlNodeList list = root.ChildNodes; foreach (XmlNode item in list) { OperItem o = new OperItem(); XmlElement element = (XmlElement)item; o.name = element.GetAttribute("Name"); o.transName = element.GetAttribute("transName"); //获取要操作的物体对象 o.tag = element.GetAttribute("tag"); foreach (Transform trans in rootTrans.GetComponentsInChildren<Transform>()) { if (o.transName == trans.name) { o.trans = trans; o.originPos = trans.position; o.originRot = trans.localEulerAngles; break; } } //根据操作类型填充对象值 o.type = (EOperType)Enum.Parse(typeof(EOperType), element.GetAttribute("type")); switch (o.type) { case EOperType.SetTransform: foreach (Transform trans in rootTrans.GetComponentsInChildren<Transform>()) { if (element.GetAttribute("targetName") == trans.name) { o.transTarget = trans; break; } } o.speed = float.Parse(element.GetAttribute("speed")); o.precision = float.Parse(element.GetAttribute("precision")); break; case EOperType.SetParent: foreach (Transform trans in rootTrans.GetComponentsInChildren<Transform>()) { if (element.GetAttribute("parent") == trans.name) { o.parent = trans; break; } } break; case EOperType.SetActive: o.isActive = !string.IsNullOrEmpty(element.GetAttribute("active")); break; case EOperType.WaitTime: o.time = float.Parse(element.GetAttribute("time")); break; } o.msg = element.GetAttribute("msg"); o.errorMsg = element.GetAttribute("errorMsg"); o.groupID = element.GetAttribute("group"); if (!String.IsNullOrEmpty(o.groupID)) { o.group = true; } else o.group = false; o.isFinishPause = !string.IsNullOrEmpty(element.GetAttribute("pause")); oper.Add(o); } return oper; }
/// <summary> /// 执行下一步操作 /// </summary> void NextStep() { SetOrderContent(); if (currentItem != null && currentItem.isFinishPause) { b_pause = true; } if (++id < list.Count) { if (list[id].group) { string groupid = list[id].groupID; for (; id < list.Count; ++id) { if (list[id].groupID == groupid) { groupList.Add(list[id]); } else { --id; return; } } } Debug.Log("当前运动对象编号: " + list.Count + "--" + id + "--" + list[id].msg); currentItem = list[id]; } }
/// <summary> /// 组合执行 /// </summary> void Group() { for (int i = 0; i < groupList.Count; i++) { OperItem item = groupList[i]; currentItem = item; Debug.Log("组合运动物体名称:" + item.transName); switch (item.type) { case EOperType.SetParent: item.trans.SetParent(item.parent); groupList.Remove(item); break; case EOperType.SetActive: item.trans.gameObject.SetActive(item.isActive); groupList.Remove(item); break; case EOperType.SetTransform: if (Vector3.Distance(item.trans.position, item.transTarget.position) > item.precision) { item.trans.position = Vector3.Lerp(item.trans.position, item.transTarget.position, item.speed); item.trans.localEulerAngles = Vector3.Lerp(item.trans.localEulerAngles, item.transTarget.localEulerAngles, item.speed); } else groupList.Remove(item); break; } } if (groupList.Count == 0) { NextStep(); } }
public OperItem(OperItem item) { this.name = item.name; this.trans = item.trans; this.transName = item.transName; this.tag = item.tag; this.type = item.type; this.transTarget = item.transTarget; this.speed = item.speed; this.precision = item.precision; this.parent = item.parent; this.isActive = item.isActive; this.msg = item.msg; this.errorMsg = item.errorMsg; this.group = item.group; this.groupID = item.groupID; this.isFinishPause = item.isFinishPause; }