Files
tianrunCRM/Assets/CoolapeFrame/3rd/Hivemind/Scripts/BTAsset.cs
2020-07-04 14:41:25 +08:00

210 lines
6.9 KiB
C#

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Coolape;
namespace Hivemind
{
[System.Serializable]
public class BTAsset : ScriptableObject
{
public string serializedBehaviorTree;
public BehaviorTree behaviorTree;
public BehaviorTree Deserialize ()
{
Hashtable map = JSON.DecodeMap (serializedBehaviorTree);
// Behavior Tree
BehaviorTree bt = ScriptableObject.CreateInstance<BehaviorTree> ();
ArrayList nodes = MapEx.getList (map, "nodes");
string type = "";
Node node = null;
//先把所有的node创建好
for (int i = 0; i < nodes.Count; i++) {
type = MapEx.getString (nodes [i], "type");
switch (type) {
case "Hivemind.Root":
node = bt.CreateNode<Root> ();
((Root)node).Deserialize (ListEx.getMap (nodes, i));
bt.SetRoot ((Root)node);
break;
case "Hivemind.NodeAction":
node = bt.CreateNode<NodeAction> ();
node.Deserialize (ListEx.getMap (nodes, i));
bt.nodes.Add (node);
break;
case "Hivemind.NodeBranch":
node = bt.CreateNode<NodeBranch> ();
node.Deserialize (ListEx.getMap (nodes, i));
bt.nodes.Add (node);
break;
case "Hivemind.NodeTogether":
node = bt.CreateNode<NodeTogether> ();
node.Deserialize (ListEx.getMap (nodes, i));
bt.nodes.Add (node);
break;
default:
node = bt.CreateNode<Node> ();
node.Deserialize (ListEx.getMap (nodes, i));
bt.nodes.Add (node);
break;
}
}
// 处理子节点的的关系
for (int i = 0; i < nodes.Count; i++) {
node = bt.getNodeByID (MapEx.getInt (nodes [i], "id"));
node.DeserializeChildren (ListEx.getMap (nodes, i));
}
behaviorTree = bt;
return bt;
//=============================
// XmlDocument doc = new XmlDocument();
// doc.LoadXml(serializedBehaviorTree);
// Behavior Tree
// BehaviorTree bt = ScriptableObject.CreateInstance<BehaviorTree>();
// Root
// XmlElement rootEl = (XmlElement)doc.GetElementsByTagName ("root").Item (0);
// Root root = (Root)DeserializeSubTree (rootEl, bt);
// bt.SetRoot (root);
//
// // Unparented nodes
// XmlElement unparentedRoot = (XmlElement)doc.GetElementsByTagName ("unparented").Item (0);
// foreach (XmlNode xmlNode in unparentedRoot.ChildNodes) {
// XmlElement el = xmlNode as XmlElement;
// if (el != null)
// DeserializeSubTree (el, bt);
// }
//
// behaviorTree = bt;
// return bt;
}
// private Node DeserializeSubTree (XmlElement el, BehaviorTree bt)
// {
// Node node = null;
//
// if (el.Name == "root")
// node = bt.CreateNode<Root> ();
// else if (el.Name == "action")
// node = bt.CreateNode<NodeAction> ();
//
//// else if(el.Name == "sequence") node = bt.CreateNode<Sequence>();
//// else if(el.Name == "selector") node = bt.CreateNode<Selector>();
//// else if(el.Name == "randomselector") node = bt.CreateNode<RandomSelector>();
//// else if(el.Name == "parallel") node = bt.CreateNode<Parallel>();
////
//// else if(el.Name == "repeater") node = bt.CreateNode<Repeater>();
//// else if(el.Name == "untilsucceed") node = bt.CreateNode<UntilSucceed>();
//// else if(el.Name == "inverter") node = bt.CreateNode<Inverter>();
//// else if(el.Name == "succeeder") node = bt.CreateNode<Succeeder>();
//
// else
// throw new System.NotImplementedException (string.Format ("{0} deserialization not implemented", el.Name));
//
// float x = float.Parse (el.GetAttribute ("editorx"));
// float y = float.Parse (el.GetAttribute ("editory"));
// node.editorPosition = new Vector2 (x, y);
//
//// if (node is NodeAction) ((NodeAction) node).Deserialize(el);
//// else if (node is Sequence) ((Sequence) node).Deserialize(el);
//// else if (node is Selector) ((Selector) node).Deserialize(el);
//
// bt.nodes.Add (node);
//
// foreach (XmlNode xmlNode in el.ChildNodes) {
// XmlElement childEl = xmlNode as XmlElement;
// if (childEl != null && childEl.Name != "param") {
// Node child = DeserializeSubTree (childEl, bt);
// node.ConnectChild (child);
// }
// }
//
// return node;
// }
public void Serialize (BehaviorTree behaviorTree)
{
Hashtable map = new Hashtable ();
// map ["root"] = behaviorTree.rootNode.Serialize ();
ArrayList nodes = new ArrayList ();
for (int i = 0; i < behaviorTree.nodes.Count; i++) {
nodes.Add (behaviorTree.nodes [i].Serialize ());
}
map ["nodes"] = nodes;
serializedBehaviorTree = JSON.JsonEncode (map);
}
// XML Document
// XmlDocument doc = new XmlDocument();
// Hashtable doc = new Hashtable();
//
// // Behavior Tree
//// XmlElement btEl = doc.CreateElement("behaviortree");
//// doc.AppendChild(btEl);
// Hashtable btEl=new Hashtable ();
// doc ["behaviortree"] = btEl;
//
// // Root SubTree
// SerializeSubTree (behaviorTree.rootNode, btEl);
//
// // Unparented nodes root
// XmlElement unparentedEl = doc.CreateElement("unparented");
// btEl.AppendChild(unparentedEl);
//
// // Unparented nodes
// for (int i = 0; i < behaviorTree.nodes.Count; i++) {
// if (behaviorTree.nodes[i].parents.Count == 0 && !(behaviorTree.nodes[i] is Root)) {
// SerializeSubTree(behaviorTree.nodes[i], unparentedEl);
// }
// }
//
// serializedBehaviorTree = doc.InnerXml;
// }
// private void SerializeSubTree(Node node, Hashtable parentEl) {
// Hashtable doc = parentEl;
//
// string tagName = TagForNodeType(node.GetType());
// Hashtable el = new Hashtable ();
// doc [tagName] = el;
// el["editorx"]= node.editorPosition.x.ToString();
// el["editory"]= node.editorPosition.y.ToString();
//
// if (node is NodeAction) ((NodeAction) node).Serialize(ref el);
//// else if (node is Sequence) ((Sequence) node).Serialize(ref el);
//// else if (node is Selector) ((Selector) node).Serialize(ref el);
//
//// parentEl.AppendChild(el);
//
// int count = node.ChildCount;
// for (int i = 0; i < count; i ++) {
// SerializeSubTree(node.Children[i], el);
// }
// }
// private string TagForNodeType(System.Type nodeType) {
// if (nodeType == typeof(Root)) return "root";
// else if (nodeType == typeof(NodeAction)) return "action";
// else if (nodeType == typeof(NodeBranch)) return "branch";
// else if (nodeType == typeof(Sequence)) return "sequence";
// else if (nodeType == typeof(Selector)) return "selector";
// else if (nodeType == typeof(RandomSelector)) return "randomselector";
// else if (nodeType == typeof(Parallel)) return "parallel";
//
// else if (nodeType == typeof(Repeater)) return "repeater";
// else if (nodeType == typeof(UntilSucceed)) return "untilsucceed";
// else if (nodeType == typeof(Succeeder)) return "succeeder";
// else if (nodeType == typeof(Inverter)) return "inverter";
// else return "node";
//
// }
}
}