Просмотр исходного кода

整理行为树编辑器代码

tanghai 8 лет назад
Родитель
Сommit
5a981c3e50
26 измененных файлов с 600 добавлено и 900 удалено
  1. 6 6
      Unity/Assets/Editor/BehaviorTreeEditor/BehaviorBatchOperation.cs
  2. 12 14
      Unity/Assets/Editor/BehaviorTreeEditor/BehaviorDesignerWindow.cs
  3. 48 48
      Unity/Assets/Editor/BehaviorTreeEditor/BehaviorManager.cs
  4. 12 12
      Unity/Assets/Editor/BehaviorTreeEditor/BehaviorNodeConfigExtension.cs
  5. 8 8
      Unity/Assets/Editor/BehaviorTreeEditor/BehaviorNodeData.cs
  6. 3 4
      Unity/Assets/Editor/BehaviorTreeEditor/BehaviorTreeNodeClassPopup.cs
  7. 6 6
      Unity/Assets/Editor/BehaviorTreeEditor/BehaviorTreeOperateUtility.cs
  8. 3 3
      Unity/Assets/Editor/BehaviorTreeEditor/CustomArrayField.cs
  9. 18 18
      Unity/Assets/Editor/BehaviorTreeEditor/ExportNodeTypeConfig.cs
  10. 4 4
      Unity/Assets/Editor/BehaviorTreeEditor/GraphDesigner.cs
  11. 4 4
      Unity/Assets/Editor/BehaviorTreeEditor/NodeDesigner.cs
  12. 7 7
      Unity/Assets/Editor/BehaviorTreeEditor/NodeExtension.cs
  13. 44 120
      Unity/Assets/Editor/BehaviorTreeEditor/PropertyDesigner.cs
  14. 0 306
      Unity/Assets/Editor/BehaviorTreeEditor/RightDesigner.cs
  15. 147 119
      Unity/Assets/Res/BT/BT_大厅UI创建时执行行为树.prefab
  16. 4 4
      Unity/Assets/Scripts/BehaviorTree/BehaviorNodeConfig.cs
  17. 10 186
      Unity/Assets/Scripts/BehaviorTree/BehaviorTreeArgsDict.cs
  18. 37 4
      Unity/Assets/Scripts/BehaviorTree/BehaviorTreeType/BTTypeManager.cs
  19. 4 4
      Unity/Assets/Scripts/BehaviorTree/Node.cs
  20. 6 6
      Unity/Assets/Scripts/BehaviorTree/NodeProto.cs
  21. 179 0
      Unity/Assets/Scripts/BehaviorTree/TypeHelper.cs
  22. 3 3
      Unity/Assets/Scripts/BehaviorTree/TypeHelper.cs.meta
  23. 12 1
      Unity/Assets/Scripts/BehaviorTreeNode/UIScale.cs
  24. 13 7
      Unity/Assets/Scripts/Component/BehaviorTreeComponent.cs
  25. 7 5
      Unity/Unity.Editor.csproj
  26. 3 1
      Unity/Unity.sln.DotSettings.user

+ 6 - 6
Unity/Assets/Editor/BehaviorTreeEditor/BehaviorBatchOperation.cs

@@ -17,17 +17,17 @@ namespace MyEditor
 
 		public static void HasUseNode(NodeProto node, string treePath)
 		{
-			if (string.IsNullOrEmpty(node.name))
+			if (string.IsNullOrEmpty(node.Name))
 			{
 				Log.Error($"node name can not be empty!! {treePath}");
 			}
-			if (!mUseNodeDict.ContainsKey(node.name))
+			if (!mUseNodeDict.ContainsKey(node.Name))
 			{
-				Log.Warning($"{node.name} not exist!!!");
+				Log.Warning($"{node.Name} not exist!!!");
 			}
 			else
 			{
-				mUseNodeDict[node.name] = true;
+				mUseNodeDict[node.Name] = true;
 			}
 			for (int i = 0; i < node.children.Count; i++)
 			{
@@ -51,7 +51,7 @@ namespace MyEditor
 
 		public static bool HasNode(NodeProto node, string name)
 		{
-			if (node.name == name)
+			if (node.Name == name)
 			{
 				return true;
 			}
@@ -67,7 +67,7 @@ namespace MyEditor
 
 		public static bool HasNodeField(NodeProto node, Type searchType, string prefabPath)
 		{
-			FieldInfo[] fieldInfos = ExportNodeTypeConfig.GetFieldInfos(node.name);
+			FieldInfo[] fieldInfos = ExportNodeTypeConfig.GetFieldInfos(node.Name);
 			foreach (FieldInfo fieldInfo in fieldInfos)
 			{
 				if (fieldInfo.FieldType == searchType)

+ 12 - 14
Unity/Assets/Editor/BehaviorTreeEditor/BehaviorDesignerWindow.cs

@@ -17,9 +17,7 @@ namespace MyEditor
 
 	public class BehaviorDesignerWindow: EditorWindow
 	{
-		private PropertyDesigner mPropDesigner;
-		private RightDesigner mRightDesigner;
-		private SubWinType mSubWinType;
+		private PropertyDesigner propDesigner;
 		private BehaviorTreeNodeClassPopup popUpMenu;
 
 		public GraphDesigner GraphDesigner { get; private set; }
@@ -61,7 +59,7 @@ namespace MyEditor
 			EndWindows(); //标记结束
 		}
 
-		void DoWindow(int unusedWindowID)
+		private void DoWindow(int unusedWindowID)
 		{
 			popUpMenu.DrawSearchList();
 			GUI.DragWindow(); //画出子窗口
@@ -70,19 +68,18 @@ namespace MyEditor
 		public void Awake()
 		{
 			this.GraphDesigner = CreateInstance<GraphDesigner>();
-			mPropDesigner = CreateInstance<PropertyDesigner>();
-			// mRightDesigner = new RightDesigner();
-			popUpMenu = new BehaviorTreeNodeClassPopup();
-			popUpMenu.GraphDesigner = this.GraphDesigner;
-			//mGraphDesigner.onSelectTree();
+			this.propDesigner = CreateInstance<PropertyDesigner>();
+			popUpMenu = new BehaviorTreeNodeClassPopup
+			{
+				GraphDesigner = this.GraphDesigner
+			};
 		}
 
 		public void OnGUI()
 		{
 			HandleEvents();
-			mPropDesigner?.Draw();
+			this.propDesigner?.Draw();
 			this.GraphDesigner?.Draw(this.position);
-			//  mRightDesigner?.Draw();
 			if (IsShowSubWin)
 			{
 				DrawSubWindow();
@@ -105,7 +102,8 @@ namespace MyEditor
 						BehaviorManager.Instance.SaveAll();
 					}
 					break;
-				case EventType.MouseDown: break;
+				case EventType.MouseDown:
+					break;
 			}
 		}
 
@@ -116,7 +114,7 @@ namespace MyEditor
 
 		public void onUpdatePropList(params object[] list)
 		{
-			mPropDesigner.SetToolBar(0);
+			this.propDesigner.SetToolBar(0);
 		}
 
 		public void onShowMessage(params object[] list)
@@ -133,7 +131,7 @@ namespace MyEditor
 				return;
 			}
 			this.GraphDesigner.onSelectNode(list);
-			mPropDesigner.onSelectNode(list);
+			this.propDesigner.onSelectNode(list);
 			//      mRightDesigner.onSelectNode(list);
 		}
 

+ 48 - 48
Unity/Assets/Editor/BehaviorTreeEditor/BehaviorManager.cs

@@ -111,7 +111,7 @@ namespace MyEditor
 
 		public void printTree(BehaviorNodeData nodeData)
 		{
-			Log.Info($"printTree  :  {nodeData.nodeId} {nodeData}");
+			Log.Info($"printTree  :  {nodeData.Id} {nodeData}");
 			foreach (BehaviorNodeData data in nodeData.children)
 			{
 				printTree(data);
@@ -126,15 +126,15 @@ namespace MyEditor
 
 		public bool CheckNodeInput(NodeProto nodeProto)
 		{
-			List<NodeFieldDesc> list = ExportNodeTypeConfig.GetNodeFieldInOutPutDescList(nodeProto.name, typeof(NodeInputAttribute));
+			List<NodeFieldDesc> list = ExportNodeTypeConfig.GetNodeFieldInOutPutDescList(nodeProto.Name, typeof(NodeInputAttribute));
 			foreach (NodeFieldDesc desc in list)
 			{
 				List<string> canInputList = GetCanInPutEnvKeyList(this.NodeProtoToBehaviorNodeData(nodeProto), desc);
-				string value = nodeProto.args_dict.GetTreeDictValue(desc.name)?.ToString();
+				string value = nodeProto.Args.Get(desc.name)?.ToString();
 				List<string> resultList = canInputList.FindAll(str => { return str == value; });
 				if (resultList.Count == 0)
 				{
-					Log.Error($"{nodeProto.name}节点(id:{nodeProto.nodeId})的{value}输入值非法!");
+					Log.Error($"{nodeProto.Name}节点(id:{nodeProto.Id})的{value}输入值非法!");
 					return false;
 				}
 			}
@@ -180,9 +180,9 @@ namespace MyEditor
 		
 		public void RemoveUnusedArgs(NodeProto nodeProto)
 		{
-			ClientNodeTypeProto proto = ExportNodeTypeConfig.GetNodeTypeProtoFromDll(nodeProto.name);
+			ClientNodeTypeProto proto = ExportNodeTypeConfig.GetNodeTypeProtoFromDll(nodeProto.Name);
 			List<string> unUsedList = new List<string>();
-			foreach (KeyValuePair<string, object> item in nodeProto.args_dict.Dict())
+			foreach (KeyValuePair<string, object> item in nodeProto.Args.Dict())
 			{
 				if (!proto.new_args_desc.Exists(a => (a.name == item.Key)))
 				{
@@ -191,7 +191,7 @@ namespace MyEditor
 			}
 			foreach (string item in unUsedList)
 			{
-				nodeProto.args_dict.Remove(item);
+				nodeProto.Args.Remove(item);
 			}
 			for (int i = 0; i < nodeProto.children.Count; i++)
 			{
@@ -201,7 +201,7 @@ namespace MyEditor
 
 		private bool CheckHasTreeDesc()
 		{
-			if (string.IsNullOrEmpty(CurTree.Root.describe))
+			if (string.IsNullOrEmpty(CurTree.Root.Desc))
 			{
 				Log.Error("行为树描述不可以不填!!!!!!");
 				return false;
@@ -245,7 +245,7 @@ namespace MyEditor
 			}
 			catch (Exception e)
 			{
-				Log.Error($"tree name : {tree.BehaviorNodeData.name} {e}");
+				Log.Error($"tree name : {tree.BehaviorNodeData.Name} {e}");
 			}
 
 			config.RootNodeConfig.gameObject.transform.parent = config.gameObject.transform;
@@ -255,12 +255,12 @@ namespace MyEditor
 		public BehaviorNodeData NodeConfigToNodeData(BehaviorNodeConfig nodeProto)
 		{
 			BehaviorNodeData nodeData = new BehaviorNodeData();
-			nodeData.nodeId = nodeProto.id;
-			nodeData.name = nodeProto.name;
-			nodeData.describe = nodeProto.describe;
-			nodeData.args_dict = nodeProto.GetArgsDict();
+			nodeData.Id = nodeProto.id;
+			nodeData.Name = nodeProto.name;
+			nodeData.Desc = nodeProto.describe;
+			nodeData.Args = nodeProto.GetArgsDict();
 			nodeData.children = new List<BehaviorNodeData>();
-			//             foreach (var item in nodeData.args_dict)
+			//             foreach (var item in nodeData.Args)
 			//             {
 			//                 Log.Info($"key :{item.Key} value :{item.Value}");
 			//             }
@@ -277,19 +277,19 @@ namespace MyEditor
 		{
 			GameObject go = new GameObject();
 			BehaviorNodeConfig nodeConfig = go.AddComponent<BehaviorNodeConfig>();
-			nodeConfig.id = nodeData.nodeId;
-			nodeConfig.name = nodeData.name;
-			go.name = nodeData.name;
-			nodeConfig.describe = nodeData.describe;
+			nodeConfig.id = nodeData.Id;
+			nodeConfig.name = nodeData.Name;
+			go.name = nodeData.Name;
+			nodeConfig.describe = nodeData.Desc;
 			List<string> unUseList = new List<string>();
-			foreach (KeyValuePair<string, object> args in nodeData.args_dict.Dict())
+			foreach (KeyValuePair<string, object> args in nodeData.Args.Dict())
 			{
-				if (!ExportNodeTypeConfig.NodeHasField(nodeData.name, args.Key))
+				if (!ExportNodeTypeConfig.NodeHasField(nodeData.Name, args.Key))
 				{
 					unUseList.Add(args.Key);
 					continue;
 				}
-				Type originType = ExportNodeTypeConfig.GetFieldType(nodeData.name, args.Key);
+				Type originType = ExportNodeTypeConfig.GetFieldType(nodeData.Name, args.Key);
 				try
 				{
 					string fieldName = args.Key;
@@ -299,7 +299,7 @@ namespace MyEditor
 					FieldInfo fieldNameInfo = type.GetField("fieldName");
 					fieldNameInfo.SetValue(comp, fieldName);
 					FieldInfo fieldValueinfo = type.GetField("fieldValue");
-					if (BehaviorTreeArgsDict.IsEnumType(originType))
+					if (TypeHelper.IsEnumType(originType))
 					{
 						fieldValue = fieldValue.ToString();
 					}
@@ -307,12 +307,12 @@ namespace MyEditor
 				}
 				catch (Exception e)
 				{
-					throw new Exception($"transform failed,nodeName:{nodeData.name}  fieldName:{args.Key} fieldType:{originType}", e);
+					throw new Exception($"transform failed,nodeName:{nodeData.Name}  fieldName:{args.Key} fieldType:{originType}", e);
 				}
 			}
 			foreach (string key in unUseList)
 			{
-				nodeData.args_dict.Remove(key);
+				nodeData.Args.Remove(key);
 			}
 			foreach (BehaviorNodeData child in nodeData.children)
 			{
@@ -326,10 +326,10 @@ namespace MyEditor
 		{
 			BehaviorNodeData nodeData = new BehaviorNodeData
 			{
-				nodeId = nodeProto.nodeId,
-				name = nodeProto.name,
-				describe = nodeProto.describe,
-				args_dict = nodeProto.args_dict,
+				Id = nodeProto.Id,
+				Name = nodeProto.Name,
+				Desc = nodeProto.Desc,
+				Args = nodeProto.Args,
 				children = new List<BehaviorNodeData>()
 			};
 			foreach (NodeProto child in nodeProto.children)
@@ -343,10 +343,10 @@ namespace MyEditor
 		{
 			NodeProto nodeProto = new NodeProto
 			{
-				nodeId = nodeData.nodeId,
-				name = nodeData.name,
-				describe = nodeData.describe,
-				args_dict = nodeData.args_dict,
+				Id = nodeData.Id,
+				Name = nodeData.Name,
+				Desc = nodeData.Desc,
+				Args = nodeData.Args,
 				children = new List<NodeProto>()
 			};
 			foreach (BehaviorNodeData child in nodeData.children)
@@ -374,18 +374,18 @@ namespace MyEditor
 				return null;
 			}
 			BehaviorNodeData node = new BehaviorNodeData(nodeName);
-			node.nodeId = AutoNodeId();
-			node.name = nodeName;
+			node.Id = AutoNodeId();
+			node.Name = nodeName;
 			return node;
 		}
 
 		public BehaviorNodeData CopyNode(BehaviorNodeData node)
 		{
 			BehaviorNodeData copyNode = new BehaviorNodeData();
-			copyNode.name = node.name;
-			copyNode.describe = node.describe;
+			copyNode.Name = node.Name;
+			copyNode.Desc = node.Desc;
 			copyNode.Pos = node.Pos;
-			copyNode.args_dict = node.args_dict.Clone();
+			copyNode.Args = node.Args.Clone();
 			List<BehaviorNodeData> list = new List<BehaviorNodeData>();
 			foreach (BehaviorNodeData item in node.children)
 			{
@@ -464,7 +464,7 @@ namespace MyEditor
 
 		private static List<NodeFieldDesc> _GetNodeOutPutEnvKeyList(NodeProto nodeProto, NodeProto inputNode, NodeFieldDesc desc = null)
 		{
-			if (nodeProto.nodeId >= inputNode.nodeId)
+			if (nodeProto.Id >= inputNode.Id)
 			{
 				return new List<NodeFieldDesc>();
 			}
@@ -472,15 +472,15 @@ namespace MyEditor
 
 			if (desc == null)
 			{
-				list = ExportNodeTypeConfig.GetNodeFieldInOutPutDescList(nodeProto.name, typeof(NodeOutputAttribute));
+				list = ExportNodeTypeConfig.GetNodeFieldInOutPutDescList(nodeProto.Name, typeof(NodeOutputAttribute));
 			}
 			else
 			{
-				list = ExportNodeTypeConfig.GetNodeFieldInOutPutFilterDescList(nodeProto.name, typeof(NodeOutputAttribute), desc.envKeyType);
+				list = ExportNodeTypeConfig.GetNodeFieldInOutPutFilterDescList(nodeProto.Name, typeof(NodeOutputAttribute), desc.envKeyType);
 			}
 			for (int i = 0; i < list.Count; i++)
 			{
-				object value = nodeProto.args_dict.GetTreeDictValue(list[i].name);
+				object value = nodeProto.Args.Get(list[i].name);
 				list[i].value = value;
 			}
 
@@ -494,11 +494,11 @@ namespace MyEditor
 		public List<string> GetSelectNodeInputValueList(NodeProto nodeProto)
 		{
 			List<string> resultList = new List<string>();
-			List<NodeFieldDesc> list = ExportNodeTypeConfig.GetNodeFieldInOutPutDescList(nodeProto.name, typeof(NodeInputAttribute));
+			List<NodeFieldDesc> list = ExportNodeTypeConfig.GetNodeFieldInOutPutDescList(nodeProto.Name, typeof(NodeInputAttribute));
 
 			foreach (NodeFieldDesc desc in list)
 			{
-				string value = nodeProto.args_dict.GetTreeDictValue(desc.name)?.ToString();
+				string value = nodeProto.Args.Get(desc.name)?.ToString();
 				resultList.Add(value);
 			}
 			return resultList;
@@ -515,14 +515,14 @@ namespace MyEditor
 		public bool IsHighLight(BehaviorNodeData node)
 		{
 			NodeProto nodeProto = this.BehaviorNodeDataToNodeProto(node);
-			List<NodeFieldDesc> list = ExportNodeTypeConfig.GetNodeFieldInOutPutDescList(nodeProto.name, typeof(NodeOutputAttribute));
+			List<NodeFieldDesc> list = ExportNodeTypeConfig.GetNodeFieldInOutPutDescList(nodeProto.Name, typeof(NodeOutputAttribute));
 			foreach (NodeFieldDesc desc in list)
 			{
-				if (!nodeProto.args_dict.ContainsKey(desc.name))
+				if (!nodeProto.Args.ContainsKey(desc.name))
 				{
 					continue;
 				}
-				string value = nodeProto.args_dict.GetTreeDictValue(desc.name)?.ToString();
+				string value = nodeProto.Args.Get(desc.name)?.ToString();
 				List<string> resultList = inputValueList.FindAll(str => { return str == value; });
 				if (resultList.Count > 0)
 				{
@@ -570,7 +570,7 @@ namespace MyEditor
 		public BehaviorNodeData GetNodeData(BehaviorNodeData nodeData, int nodeId)
 		{
 			BehaviorNodeData result = null;
-			if (nodeData.nodeId == nodeId)
+			if (nodeData.Id == nodeId)
 			{
 				return nodeData;
 			}
@@ -587,7 +587,7 @@ namespace MyEditor
 
 		public BehaviorNodeData GetNode(BehaviorNodeData nodeData, int nodeId)
 		{
-			if (nodeData.nodeId == nodeId)
+			if (nodeData.Id == nodeId)
 			{
 				return nodeData;
 			}

+ 12 - 12
Unity/Assets/Editor/BehaviorTreeEditor/BehaviorNodeConfigExtension.cs

@@ -12,13 +12,13 @@ namespace Model
 		{
 			GameObject go = new GameObject();
 			BehaviorNodeConfig nodeConfig = go.AddComponent<BehaviorNodeConfig>();
-			nodeConfig.id = nodeData.nodeId;
-			nodeConfig.name = nodeData.name;
-			go.name = nodeData.name;
-			nodeConfig.describe = nodeData.describe;
-			foreach (KeyValuePair<string, object> args in nodeData.args_dict.Dict())
+			nodeConfig.id = nodeData.Id;
+			nodeConfig.name = nodeData.Name;
+			go.name = nodeData.Name;
+			nodeConfig.describe = nodeData.Desc;
+			foreach (KeyValuePair<string, object> args in nodeData.Args.Dict())
 			{
-				Type originType = ExportNodeTypeConfig.GetFieldType(nodeData.name, args.Key);
+				Type originType = ExportNodeTypeConfig.GetFieldType(nodeData.Name, args.Key);
 				try
 				{
 					string fieldName = args.Key;
@@ -28,7 +28,7 @@ namespace Model
 					FieldInfo fieldNameInfo = type.GetField("fieldName");
 					fieldNameInfo.SetValue(comp, fieldName);
 					FieldInfo fieldValueinfo = type.GetField("fieldValue");
-					if (BehaviorTreeArgsDict.IsEnumType(originType))
+					if (TypeHelper.IsEnumType(originType))
 					{
 						fieldValue = fieldValue.ToString();
 					}
@@ -36,7 +36,7 @@ namespace Model
 				}
 				catch (Exception e)
 				{
-					throw new GameException($"transform failed,nodeName:{nodeData.name}  fieldName:{args.Key} fieldType:{originType} {e}");
+					throw new GameException($"transform failed,nodeName:{nodeData.Name}  fieldName:{args.Key} fieldType:{originType} {e}");
 				}
 			}
 			foreach (NodeProto child in nodeData.children)
@@ -50,10 +50,10 @@ namespace Model
 		public static NodeProto ConfigToNode(BehaviorNodeConfig nodeProto)
 		{
 			NodeProto nodeData = new NodeProto();
-			nodeData.nodeId = nodeProto.id;
-			nodeData.name = nodeProto.name;
-			nodeData.describe = nodeProto.describe;
-			nodeData.args_dict = nodeProto.GetArgsDict();
+			nodeData.Id = nodeProto.id;
+			nodeData.Name = nodeProto.name;
+			nodeData.Desc = nodeProto.describe;
+			nodeData.Args = nodeProto.GetArgsDict();
 			nodeData.children = new List<NodeProto>();
 			foreach (Transform child in nodeProto.gameObject.transform)
 			{

+ 8 - 8
Unity/Assets/Editor/BehaviorTreeEditor/BehaviorNodeData.cs

@@ -15,20 +15,20 @@ namespace MyEditor
 
 	public class BehaviorNodeData
 	{
-		public int nodeId;
+		public int Id;
 
-		public string name;
+		public string Name;
 
-		public string describe = "";
+		public string Desc = "";
 
 		public List<BehaviorNodeData> children = new List<BehaviorNodeData>();
 
-		public BehaviorTreeArgsDict args_dict = new BehaviorTreeArgsDict();
+		public BehaviorTreeArgsDict Args = new BehaviorTreeArgsDict();
 
 		/// <summary>
 		///  
 		/// </summary>
-		public string error = "";
+		public string Error = "";
 
 		public NodeDesigner NodeDesigner { get; set; }
 
@@ -52,7 +52,7 @@ namespace MyEditor
 
 		public BehaviorNodeData(string proto_name)
 		{
-			name = proto_name;
+			this.Name = proto_name;
 			this.Proto = BehaviorManager.Instance.GetNodeTypeProto(proto_name);
 			if (this.Proto == null)
 			{
@@ -63,7 +63,7 @@ namespace MyEditor
 
 			foreach (NodeFieldDesc args_desc in this.Proto.new_args_desc)
 			{
-				args_dict.SetKeyValueComp(args_desc.name, args_desc.value);
+				this.Args.SetKeyValueComp(args_desc.name, args_desc.value);
 			}
 
 			foreach (BehaviorNodeData child in children)
@@ -108,7 +108,7 @@ namespace MyEditor
 
 		public void ResetId()
 		{
-			this.nodeId = BehaviorManager.Instance.AutoNodeId();
+			this.Id = BehaviorManager.Instance.AutoNodeId();
 			foreach (BehaviorNodeData child in children)
 			{
 				child.ResetId();

+ 3 - 4
Unity/Assets/Editor/BehaviorTreeEditor/BehaviorTreeNodeClassPopup.cs

@@ -10,14 +10,13 @@ namespace MyEditor
 	{
 		private string mSearchNode = "";
 		private Vector2 mTreeScrollPos = Vector2.zero;
-		private int mNodeCount;
-		private readonly float mWidth = 400f;
+		private const float mWidth = 400f;
 
 		public GraphDesigner GraphDesigner;
 		private SubWinType mSubWinType;
 		public Rect windowRect; //子窗口的大小和位置
-		string[] mEnumNodeTypeArr;
-		Rect toolbarRect = new Rect(0f, 0f, 0, 0);
+		private string[] mEnumNodeTypeArr;
+		private Rect toolbarRect = new Rect(0f, 0f, 0, 0);
 		private int mEnumNodeTypeSelection;
 
 		public string DrawSearchList()

+ 6 - 6
Unity/Assets/Editor/BehaviorTreeEditor/BehaviorTreeOperateUtility.cs

@@ -23,7 +23,7 @@ namespace MyEditor
 
 		public void SetDescribe(string desc)
 		{
-			Proto.describe = desc;
+			Proto.Desc = desc;
 		}
 
 		public void Apply()
@@ -31,7 +31,7 @@ namespace MyEditor
 			FieldInfo[] mems = Node.GetType().GetFields();
 			foreach (FieldInfo mem in mems)
 			{
-				Proto.args_dict.SetKeyValueComp(mem.Name, mem.GetValue(Node));
+				Proto.Args.SetKeyValueComp(mem.Name, mem.GetValue(Node));
 			}
 		}
 
@@ -42,7 +42,7 @@ namespace MyEditor
 
 		public void UpdateData()
 		{
-			foreach (KeyValuePair<string, object> argsItem in Proto.args_dict.Dict())
+			foreach (KeyValuePair<string, object> argsItem in Proto.Args.Dict())
 			{
 				FieldInfo fieldInfo = typeof(T).GetField(argsItem.Key, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
 				fieldInfo.SetValue(Node, argsItem.Value);
@@ -59,7 +59,7 @@ namespace MyEditor
 		/// <returns></returns>
 		public static NodeProto NodeProtoParamClone(NodeProto p)
 		{
-			NodeProto newP = new NodeProto(p.args_dict.Clone());
+			NodeProto newP = new NodeProto(p.Args.Clone());
 			return newP;
 		}
 
@@ -123,7 +123,7 @@ namespace MyEditor
 		public static BehaviourTreeNodeProxy<T> CreateNode<T>() where T : Node
 		{
 			NodeProto p = new NodeProto();
-			p.name = typeof(T).Name;
+			p.Name = typeof(T).Name;
 			BehaviourTreeNodeProxy<T> proxy = new BehaviourTreeNodeProxy<T>(p);
 			return proxy;
 		}
@@ -139,7 +139,7 @@ namespace MyEditor
 		{
 			foreach (NodeProto proto in list)
 			{
-				if (proto.describe == name)
+				if (proto.Desc == name)
 				{
 					p = proto;
 					return true;

+ 3 - 3
Unity/Assets/Editor/BehaviorTreeEditor/CustomArrayField.cs

@@ -206,7 +206,7 @@ namespace MyEditor
 					for (int i = 0; i < oldValue.Length; i++)
 					{
 						newValue[i] = EditorGUILayout.ObjectField(i.ToString(), oldValue[i], desc.type.GetElementType(), false);
-						if (BehaviorTreeArgsDict.IsGameObjectArrayType(desc.type) &&
+						if (TypeHelper.IsGameObjectArrayType(desc.type) &&
 						    !BehaviorTreeArgsDict.SatisfyCondition((GameObject) newValue[i], desc.constraintTypes))
 						{
 							newValue[i] = null;
@@ -215,7 +215,7 @@ namespace MyEditor
 					for (int i = oldValue.Length; i < size; i++)
 					{
 						newValue[i] = EditorGUILayout.ObjectField(i.ToString(), newValue[i], desc.type.GetElementType(), false);
-						if (BehaviorTreeArgsDict.IsGameObjectArrayType(desc.type) &&
+						if (TypeHelper.IsGameObjectArrayType(desc.type) &&
 						    !BehaviorTreeArgsDict.SatisfyCondition((GameObject) newValue[i], desc.constraintTypes))
 						{
 							newValue[i] = null;
@@ -227,7 +227,7 @@ namespace MyEditor
 					for (int i = 0; i < size; i++)
 					{
 						newValue[i] = EditorGUILayout.ObjectField(i.ToString(), oldValue[i], desc.type.GetElementType(), false);
-						if (BehaviorTreeArgsDict.IsGameObjectArrayType(desc.type) &&
+						if (TypeHelper.IsGameObjectArrayType(desc.type) &&
 						    !BehaviorTreeArgsDict.SatisfyCondition((GameObject) newValue[i], desc.constraintTypes))
 						{
 							newValue[i] = null;

+ 18 - 18
Unity/Assets/Editor/BehaviorTreeEditor/ExportNodeTypeConfig.cs

@@ -157,77 +157,77 @@ namespace MyEditor
 		{
 			if (att.DefaultValue != null)
 			{
-				if ((BehaviorTreeArgsDict.IsEnumType(type) && BTEnvKey.None != att.DefaultValue.ToString()) || !BehaviorTreeArgsDict.IsEnumType(type))
+				if ((TypeHelper.IsEnumType(type) && BTEnvKey.None != att.DefaultValue.ToString()) || !TypeHelper.IsEnumType(type))
 				{
 					return att.DefaultValue;
 				}
 			}
 			object value = null;
-			if (BehaviorTreeArgsDict.IsDoubleType(type))
+			if (TypeHelper.IsDoubleType(type))
 			{
 				value = default(double);
 			}
-			else if (BehaviorTreeArgsDict.IsStringType(type))
+			else if (TypeHelper.IsStringType(type))
 			{
 				value = default(string);
 			}
-			else if (BehaviorTreeArgsDict.IsFloatType(type))
+			else if (TypeHelper.IsFloatType(type))
 			{
 				value = default(float);
 			}
-			else if (BehaviorTreeArgsDict.IsBoolType(type))
+			else if (TypeHelper.IsBoolType(type))
 			{
 				value = default(bool);
 			}
-			else if (BehaviorTreeArgsDict.IsIntType(type))
+			else if (TypeHelper.IsIntType(type))
 			{
 				value = default(int);
 			}
-			else if (BehaviorTreeArgsDict.IsLongType(type))
+			else if (TypeHelper.IsLongType(type))
 			{
 				value = default(long);
 			}
-			else if (BehaviorTreeArgsDict.IsIntArrType(type))
+			else if (TypeHelper.IsIntArrType(type))
 			{
 				value = default(int[]);
 			}
-			else if (BehaviorTreeArgsDict.IsLongArrType(type))
+			else if (TypeHelper.IsLongArrType(type))
 			{
 				value = default(long[]);
 			}
-			else if (BehaviorTreeArgsDict.IsDoubleArrType(type))
+			else if (TypeHelper.IsDoubleArrType(type))
 			{
 				value = default(double[]);
 			}
-			else if (BehaviorTreeArgsDict.IsFloatArrType(type))
+			else if (TypeHelper.IsFloatArrType(type))
 			{
 				value = default(float[]);
 			}
-			else if (BehaviorTreeArgsDict.IsStringArrType(type))
+			else if (TypeHelper.IsStringArrType(type))
 			{
 				value = default(string[]);
 			}
-			else if (BehaviorTreeArgsDict.IsObjectType(type))
+			else if (TypeHelper.IsObjectType(type))
 			{
 				value = default(Object);
 			}
-			else if (BehaviorTreeArgsDict.IsEnumType(type))
+			else if (TypeHelper.IsEnumType(type))
 			{
 				Array array = Enum.GetValues(type);
 				value = array.GetValue(0).ToString();
 			}
-			else if (BehaviorTreeArgsDict.IsUnitConfigArrayType(type))
+			else if (TypeHelper.IsUnitConfigArrayType(type))
 			{
 			}
-			else if (BehaviorTreeArgsDict.IsSpriteArrayType(type))
+			else if (TypeHelper.IsSpriteArrayType(type))
 			{
 				value = default(Sprite[]);
 			}
-			else if (BehaviorTreeArgsDict.IsObjectArrayType(type))
+			else if (TypeHelper.IsObjectArrayType(type))
 			{
 				value = default(Object[]);
 			}
-			else if (BehaviorTreeArgsDict.IsConvertble(type))
+			else if (TypeHelper.IsConvertble(type))
 			{
 				value = 1f;
 			}

+ 4 - 4
Unity/Assets/Editor/BehaviorTreeEditor/GraphDesigner.cs

@@ -328,7 +328,7 @@ namespace MyEditor
 			if (mSelectedNode != null)
 			{
 				if (mSelectedNode.NodeData.Proto.classify == NodeClassifyType.Root.ToString() ||
-				    BehaviorManager.Instance.CurTree.Root.nodeId == mSelectedNode.NodeData.nodeId)
+				    BehaviorManager.Instance.CurTree.Root.Id == mSelectedNode.NodeData.Id)
 				{
 					List<ClientNodeTypeProto> list = BehaviorManager.Instance.Classify2NodeProtoList[NodeClassifyType.Root.ToString()];
 					foreach (ClientNodeTypeProto nodeType in list)
@@ -479,7 +479,7 @@ namespace MyEditor
 			mCopyNode = mSelectedNode;
 			if (mSelectedNode != null)
 			{
-				BehaviorTreeTipsHelper.ShowMessage("复制节点" + mSelectedNode.NodeData.nodeId);
+				BehaviorTreeTipsHelper.ShowMessage("复制节点" + mSelectedNode.NodeData.Id);
 			}
 		}
 
@@ -489,7 +489,7 @@ namespace MyEditor
 			mCutNode = mSelectedNode;
 			if (mSelectedNode != null)
 			{
-				BehaviorTreeTipsHelper.ShowMessage("剪切节点" + mSelectedNode.NodeData.nodeId);
+				BehaviorTreeTipsHelper.ShowMessage("剪切节点" + mSelectedNode.NodeData.Id);
 			}
 		}
 
@@ -557,7 +557,7 @@ namespace MyEditor
 
 			if (oldNode == RootNode)
 			{
-				newNode.NodeData.nodeId = RootNode.NodeData.nodeId;
+				newNode.NodeData.Id = RootNode.NodeData.Id;
 				RootNode = newNode;
 				BehaviorTreeData oldTree = BehaviorManager.Instance.CurTree;
 				BehaviorTreeData newTree = new BehaviorTreeData(oldTree.Id);

+ 4 - 4
Unity/Assets/Editor/BehaviorTreeEditor/NodeDesigner.cs

@@ -91,7 +91,7 @@ namespace MyEditor
 
 		public void Init()
 		{
-			NodeData.Proto = BehaviorManager.Instance.GetNodeTypeProto(NodeData.name);
+			NodeData.Proto = BehaviorManager.Instance.GetNodeTypeProto(NodeData.Name);
 			string[] arr = NodeData.Proto.style.Split('/');
 			string style = arr.Length > 0? arr[0] : "";
 			if (style == "")
@@ -108,7 +108,7 @@ namespace MyEditor
 						style = "orange";
 						break;
 				}
-				switch (NodeData.name)
+				switch (NodeData.Name)
 				{
 					case "Sequence":
 						style = "blue";
@@ -131,7 +131,7 @@ namespace MyEditor
 			}
 			if (mBoxTex == null)
 			{
-				Log.Info("mBoxTex null " + NodeData.nodeId);
+				Log.Info("mBoxTex null " + NodeData.Id);
 			}
 			Width = mBoxTex.width / 2;
 			Height = mBoxTex.height / 2;
@@ -198,7 +198,7 @@ namespace MyEditor
 			style.fontSize = 12;
 			style.wordWrap = true;
 			string deprecatedDesc = NodeData.Proto.isDeprecated? $"({NodeData.Proto.deprecatedDesc})" : "";
-			GUI.Label(new Rect(Pos.x - Width / 2 + 6f, Pos.y, Width - 12f, Height / 2.1f), NodeData.describe + deprecatedDesc, style);
+			GUI.Label(new Rect(Pos.x - Width / 2 + 6f, Pos.y, Width - 12f, Height / 2.1f), NodeData.Desc + deprecatedDesc, style);
 
 			tex = null;
 			switch (NodeData.NodeDeubgState)

+ 7 - 7
Unity/Assets/Editor/BehaviorTreeEditor/NodeExtension.cs

@@ -14,7 +14,7 @@ namespace Model
 
 		public BTEditorTree(BehaviorTreeConfig config)
 		{
-			Type rootType = Game.EntityEventManager.GetAssembly("Model").GetType($"Model.{config.RootNodeProto.name}");
+			Type rootType = Game.EntityEventManager.GetAssembly("Model").GetType($"Model.{config.RootNodeProto.Name}");
 			Node root = (Node) Activator.CreateInstance(rootType, config.RootNodeProto);
 			root.Id = BehaviorManager.NodeIdStartIndex;
 			Queue<NodeProto> protoStack = new Queue<NodeProto>();
@@ -26,14 +26,14 @@ namespace Model
 				NodeProto p = protoStack.Dequeue();
 				Node node = nodeStack.Dequeue();
 
-				foreach (KeyValuePair<string, object> argsItem in p.args_dict.Dict())
+				foreach (KeyValuePair<string, object> argsItem in p.Args.Dict())
 				{
 					FieldInfo fieldInfo = node.GetType().GetField(argsItem.Key, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
 					fieldInfo.SetValue(node, argsItem.Value);
 				}
 				foreach (NodeProto child in p.Children)
 				{
-					Type t = Game.EntityEventManager.GetAssembly("Model").GetType($"Model.{child.name}");
+					Type t = Game.EntityEventManager.GetAssembly("Model").GetType($"Model.{child.Name}");
 					Node childNode = (Node) Activator.CreateInstance(t, child);
 					AddChild(childNode, node);
 					protoStack.Enqueue(child);
@@ -271,13 +271,13 @@ namespace Model
 		private static NodeProto GetNodeProtoFromNode(Node node)
 		{
 			NodeProto np = new NodeProto();
-			np.nodeId = (int) node.Id;
+			np.Id = (int) node.Id;
 			FieldInfo[] mens = node.GetType().GetFields();
-			np.describe = node.Description;
-			np.name = node.GetType().Name;
+			np.Desc = node.Description;
+			np.Name = node.GetType().Name;
 			foreach (FieldInfo men in mens)
 			{
-				np.args_dict.SetKeyValueComp(men.Name, men.GetValue(node));
+				np.Args.SetKeyValueComp(men.Name, men.GetValue(node));
 			}
 			return np;
 		}

+ 44 - 120
Unity/Assets/Editor/BehaviorTreeEditor/PropertyDesigner.cs

@@ -328,12 +328,12 @@ namespace MyEditor
 			}
 			ClientNodeTypeProto proto = mCurBehaviorNode.Proto;
 			GUILayout.Space(10f);
-			GUILayout.Label("节点ID:" + mCurBehaviorNode.nodeId);
-			GUILayout.Label("节点名:" + mCurBehaviorNode.name);
+			GUILayout.Label("节点ID:" + mCurBehaviorNode.Id);
+			GUILayout.Label("节点名:" + mCurBehaviorNode.Name);
 			GUILayout.Label("说明:");
 			GUILayout.Label(proto.describe);
 			GUILayout.Label("描述:");
-			mCurBehaviorNode.describe = EditorGUILayout.TextArea(mCurBehaviorNode.describe, GUILayout.Height(50f));
+			mCurBehaviorNode.Desc = EditorGUILayout.TextArea(mCurBehaviorNode.Desc, GUILayout.Height(50f));
 
 			DrawAllValue(proto);
 		}
@@ -384,9 +384,16 @@ namespace MyEditor
 				NodeFieldDesc desc = fieldList[i];
 				Type fieldType = ExportNodeTypeConfig.GetFieldType(nodeName, desc.name);
 				ClientNodeTypeProto clientNode = ExportNodeTypeConfig.GetNodeTypeProtoFromDll(nodeName);
-				object newValue = null;
 
-				if (BehaviorTreeArgsDict.IsStringType(fieldType))
+				// 如果不存在这个参数,给一个默认的
+				if (!mCurBehaviorNode.Args.ContainsKey(desc.name))
+				{
+					object obj = desc.value ?? BTTypeManager.GetDefaultValue(fieldType);
+					mCurBehaviorNode.Args.Add(desc.name, obj);
+				}
+
+				object newValue = null;
+				if (TypeHelper.IsStringType(fieldType))
 				{
 					if (nodeParamType == NodeParamType.Input)
 					{
@@ -401,66 +408,55 @@ namespace MyEditor
 						newValue = TextFieldValue(desc);
 					}
 				}
-				else if (BehaviorTreeArgsDict.IsFloatType(fieldType))
+				else if (TypeHelper.IsFloatType(fieldType))
 				{
 					newValue = FloatFieldValue(desc);
 				}
-				else if (BehaviorTreeArgsDict.IsDoubleType(fieldType))
+				else if (TypeHelper.IsDoubleType(fieldType))
 				{
 					newValue = DoubletFieldValue(desc);
 				}
-				else if (BehaviorTreeArgsDict.IsIntType(fieldType))
+				else if (TypeHelper.IsIntType(fieldType))
 				{
 					newValue = IntFieldValue(desc);
 				}
-				else if (BehaviorTreeArgsDict.IsLongType(fieldType))
+				else if (TypeHelper.IsLongType(fieldType))
 				{
 					newValue = LongFieldValue(desc);
 				}
-				else if (BehaviorTreeArgsDict.IsBoolType(fieldType))
+				else if (TypeHelper.IsBoolType(fieldType))
 				{
 					newValue = BoolFieldValue(desc);
 				}
-				else if (BehaviorTreeArgsDict.IsObjectType(fieldType))
+				else if (TypeHelper.IsObjectType(fieldType))
 				{
 					newValue = ObjectFieldValue(desc);
 				}
-				else if (BehaviorTreeArgsDict.IsIntArrType(fieldType))
+				else if (TypeHelper.IsIntArrType(fieldType))
 				{
 					newValue = IntArrFieldValue(desc);
 				}
-				else if (BehaviorTreeArgsDict.IsLongArrType(fieldType))
+				else if (TypeHelper.IsLongArrType(fieldType))
 				{
 					newValue = LongArrFieldValue(desc);
 				}
-				else if (BehaviorTreeArgsDict.IsStringArrType(fieldType))
+				else if (TypeHelper.IsStringArrType(fieldType))
 				{
 					newValue = StrArrFieldValue(desc);
 				}
-				else if (BehaviorTreeArgsDict.IsFloatArrType(fieldType))
+				else if (TypeHelper.IsFloatArrType(fieldType))
 				{
 					newValue = FloatArrFieldValue(desc);
 				}
-				else if (BehaviorTreeArgsDict.IsDoubleArrType(fieldType))
+				else if (TypeHelper.IsDoubleArrType(fieldType))
 				{
 					newValue = DoubleArrFieldValue(desc);
 				}
-				else if (BehaviorTreeArgsDict.IsEnumType(fieldType))
+				else if (TypeHelper.IsEnumType(fieldType))
 				{
-					if (nodeParamType == NodeParamType.Input)
-					{
-						newValue = InputEnumFieldValue(desc);
-					}
-					else if (nodeParamType == NodeParamType.Output)
-					{
-						newValue = OutPutEnumFieldValue(desc);
-					}
-					else
-					{
-						newValue = EnumFieldValue(desc);
-					}
+					newValue = EnumFieldValue(desc);
 				}
-				else if (BehaviorTreeArgsDict.IsObjectArrayType(fieldType))
+				else if (TypeHelper.IsObjectArrayType(fieldType))
 				{
 					newValue = ObjectArrFieldValue(desc);
 				}
@@ -469,20 +465,20 @@ namespace MyEditor
 					Log.Error($"行为树节点暂时未支持此类型:{fieldType}!");
 					return;
 				}
-				mCurBehaviorNode.args_dict.SetKeyValueComp(desc.name, newValue);
+				mCurBehaviorNode.Args.SetKeyValueComp(desc.name, newValue);
 			}
 		}
 
 		private object ObjectFieldValue(NodeFieldDesc desc)
 		{
-			Object oldValue = (Object) mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name);
+			Object oldValue = (Object) mCurBehaviorNode.Args.Get(desc.name);
 			EditorGUILayout.LabelField(GetPropDesc(desc));
 			Object newValue = EditorGUILayout.ObjectField("", oldValue, desc.type, false);
 			if (newValue == null)
 			{
 				return null;
 			}
-			if (BehaviorTreeArgsDict.IsGameObjectType(desc.type) && !BehaviorTreeArgsDict.SatisfyCondition((GameObject) newValue, desc.constraintTypes))
+			if (TypeHelper.IsGameObjectType(desc.type) && !BehaviorTreeArgsDict.SatisfyCondition((GameObject) newValue, desc.constraintTypes))
 			{
 				return null;
 			}
@@ -499,13 +495,7 @@ namespace MyEditor
 
 		private object TextFieldValue(NodeFieldDesc desc)
 		{
-			object obj = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name);
-			if (obj == null)
-			{
-				obj = desc.value ?? "";
-				mCurBehaviorNode.args_dict.Add(desc.name, obj);
-			}
-			string oldValue = (string)obj;
+			string oldValue = (string)mCurBehaviorNode.Args.Get(desc.name);
 			EditorGUILayout.LabelField(GetPropDesc(desc));
 			object newValue = EditorGUILayout.TextField("", oldValue);
 			return newValue;
@@ -513,13 +503,7 @@ namespace MyEditor
 
 		private object BoolFieldValue(NodeFieldDesc desc)
 		{
-			object obj = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name);
-			if (obj == null)
-			{
-				obj = desc.value ?? false;
-				mCurBehaviorNode.args_dict.Add(desc.name, obj);
-			}
-			bool oldValue = (bool)obj;
+			bool oldValue = (bool)mCurBehaviorNode.Args.Get(desc.name);
 			EditorGUILayout.LabelField(GetPropDesc(desc));
 			object newValue = EditorGUILayout.Toggle("", oldValue);
 			return newValue;
@@ -527,13 +511,7 @@ namespace MyEditor
 
 		private object IntFieldValue(NodeFieldDesc desc)
 		{
-			object obj = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name);
-			if (obj == null)
-			{
-				obj = desc.value ?? default(int);
-				mCurBehaviorNode.args_dict.Add(desc.name, obj);
-			}
-			int oldValue = (int)obj;
+			int oldValue = (int)mCurBehaviorNode.Args.Get(desc.name);
 			EditorGUILayout.LabelField(GetPropDesc(desc));
 			object newValue = EditorGUILayout.IntField("", oldValue);
 			return newValue;
@@ -541,13 +519,7 @@ namespace MyEditor
 
 		private object LongFieldValue(NodeFieldDesc desc)
 		{
-			object obj = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name);
-			if (obj == null)
-			{
-				obj = desc.value ?? default(long);
-				mCurBehaviorNode.args_dict.Add(desc.name, obj);
-			}
-			long oldValue = (long)obj;
+			long oldValue = (long)mCurBehaviorNode.Args.Get(desc.name);
 			EditorGUILayout.LabelField(GetPropDesc(desc));
 			object newValue = EditorGUILayout.LongField("", oldValue);
 			return newValue;
@@ -555,13 +527,7 @@ namespace MyEditor
 
 		private object FloatFieldValue(NodeFieldDesc desc)
 		{
-			object obj = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name);
-			if (obj == null)
-			{
-				obj = desc.value ?? default(float);
-				mCurBehaviorNode.args_dict.Add(desc.name, obj);
-			}
-			float oldValue = (float) obj;
+			float oldValue = (float)mCurBehaviorNode.Args.Get(desc.name);
 			EditorGUILayout.LabelField(GetPropDesc(desc));
 			object newValue = EditorGUILayout.FloatField("", oldValue);
 			return newValue;
@@ -569,13 +535,7 @@ namespace MyEditor
 
 		private object DoubletFieldValue(NodeFieldDesc desc)
 		{
-			object obj = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name);
-			if (obj == null)
-			{
-				obj = desc.value ?? default(double);
-				mCurBehaviorNode.args_dict.Add(desc.name, obj);
-			}
-			double oldValue = (double)obj;
+			double oldValue = (double)mCurBehaviorNode.Args.Get(desc.name);
 			EditorGUILayout.LabelField(GetPropDesc(desc));
 			object newValue = EditorGUILayout.DoubleField("", oldValue);
 			return newValue;
@@ -585,13 +545,7 @@ namespace MyEditor
 
 		private object StrArrFieldValue(NodeFieldDesc desc)
 		{
-			object obj = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name);
-			if (obj == null)
-			{
-				obj = desc.value ?? new string[]{};
-				mCurBehaviorNode.args_dict.Add(desc.name, obj);
-			}
-			string[] oldValue = (string[])obj;
+			string[] oldValue = (string[])mCurBehaviorNode.Args.Get(desc.name);
 			string[] newValue = CustomArrayField.StringArrFieldValue(ref foldStrArr, GetPropDesc(desc), oldValue);
 			return newValue;
 		}
@@ -600,13 +554,7 @@ namespace MyEditor
 
 		private object IntArrFieldValue(NodeFieldDesc desc)
 		{
-			object obj = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name);
-			if (obj == null)
-			{
-				obj = desc.value ?? new int[] { };
-				mCurBehaviorNode.args_dict.Add(desc.name, obj);
-			}
-			int[] oldValue = (int[])obj;
+			int[] oldValue = (int[])mCurBehaviorNode.Args.Get(desc.name);
 			int[] newValue = CustomArrayField.IntArrFieldValue(ref foldIntArr, GetPropDesc(desc), oldValue);
 			return newValue;
 		}
@@ -615,13 +563,7 @@ namespace MyEditor
 
 		private object LongArrFieldValue(NodeFieldDesc desc)
 		{
-			object obj = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name);
-			if (obj == null)
-			{
-				obj = desc.value ?? new long[] { };
-				mCurBehaviorNode.args_dict.Add(desc.name, obj);
-			}
-			long[] oldValue = (long[])obj;
+			long[] oldValue = (long[])mCurBehaviorNode.Args.Get(desc.name);
 			long[] newValue = CustomArrayField.LongArrFieldValue(ref foldLongArr, GetPropDesc(desc), oldValue);
 			return newValue;
 		}
@@ -630,13 +572,7 @@ namespace MyEditor
 
 		private object FloatArrFieldValue(NodeFieldDesc desc)
 		{
-			object obj = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name);
-			if (obj == null)
-			{
-				obj = desc.value ?? new float[] { };
-				mCurBehaviorNode.args_dict.Add(desc.name, obj);
-			}
-			float[] oldValue = (float[])obj;
+			float[] oldValue = (float[])mCurBehaviorNode.Args.Get(desc.name);
 			float[] newValue = CustomArrayField.FloatArrFieldValue(ref foldFloatArr, GetPropDesc(desc), oldValue);
 			return newValue;
 		}
@@ -645,13 +581,7 @@ namespace MyEditor
 
 		private object DoubleArrFieldValue(NodeFieldDesc desc)
 		{
-			object obj = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name);
-			if (obj == null)
-			{
-				obj = desc.value ?? new double[] { };
-				mCurBehaviorNode.args_dict.Add(desc.name, obj);
-			}
-			double[] oldValue = (double[])obj;
+			double[] oldValue = (double[])mCurBehaviorNode.Args.Get(desc.name);
 			double[] newValue = CustomArrayField.DoubleArrFieldValue(ref foldDoubleArr, GetPropDesc(desc), oldValue);
 			return newValue;
 		}
@@ -660,20 +590,14 @@ namespace MyEditor
 
 		private object ObjectArrFieldValue(NodeFieldDesc desc)
 		{
-			object obj = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name);
-			if (obj == null)
-			{
-				obj = desc.value ?? new Object[] { };
-				mCurBehaviorNode.args_dict.Add(desc.name, obj);
-			}
-			Object[] oldValue = (Object[])obj;
+			Object[] oldValue = (Object[])mCurBehaviorNode.Args.Get(desc.name);
 			Object[] newValue = CustomArrayField.ObjectArrFieldValue(ref foldObjectArr, GetPropDesc(desc), oldValue, desc);
 			return newValue;
 		}
 
 		private object OutPutEnumFieldValue(NodeFieldDesc desc)
 		{
-			string oldValue = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name)?.ToString();
+			string oldValue = mCurBehaviorNode.Args.Get(desc.name)?.ToString();
 			if (string.IsNullOrEmpty(oldValue))
 			{
 				oldValue = BTEnvKey.None;
@@ -706,7 +630,7 @@ namespace MyEditor
 
 		private object InputEnumFieldValue(NodeFieldDesc desc)
 		{
-			string oldValue = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name)?.ToString();
+			string oldValue = mCurBehaviorNode.Args.Get(desc.name)?.ToString();
 			string[] enumValueArr = BehaviorManager.Instance.GetCanInPutEnvKeyArray(mCurBehaviorNode, desc);
 			if (enumValueArr.Length == 0)
 			{
@@ -738,7 +662,7 @@ namespace MyEditor
 
 		private object EnumFieldValue(NodeFieldDesc desc)
 		{
-			string oldValue = mCurBehaviorNode.args_dict.GetTreeDictValue(desc.name)?.ToString();
+			string oldValue = mCurBehaviorNode.Args.Get(desc.name)?.ToString();
 			if (string.IsNullOrEmpty(oldValue))
 			{
 				oldValue = GetDefaultEnumValue(desc.type);

+ 0 - 306
Unity/Assets/Editor/BehaviorTreeEditor/RightDesigner.cs

@@ -1,306 +0,0 @@
-using System;
-using System.Collections.Generic;
-using Model;
-using UnityEditor;
-using UnityEngine;
-
-namespace MyEditor
-{
-	public class RightDesigner: Editor
-	{
-		private readonly string[] mBehaviorToolbarStrings = { "节点", "工具" };
-		private int mBehaviorToolbarSelection;
-		private float mWidth = 380f;
-
-		private BehaviorNodeData mCurBehaviorNode;
-		private string mSearchNode = "";
-		private FoldoutNode mCurNode;
-
-		private int mEnumNodeTypeSelection;
-
-		private string[] mEnumNodeTypeArr;
-		// private FoldoutFolder mNodeFoldout;
-
-		private Vector2 mTreeScrollPos = Vector2.zero;
-		private int mNodeCount;
-		private FoldoutFolder mNodeFoldout;
-		private FoldoutFolder mCurNodeFolder;
-
-		public RightDesigner()
-		{
-			UpdateList();
-		}
-
-		Rect toolbarRect = new Rect(0f, 0f, 0, 0);
-
-		public void Draw()
-		{
-			// HandleEvents();
-			toolbarRect = new Rect(Screen.width - mWidth, 0f, mWidth, 18f);
-			Rect boxRect = new Rect(Screen.width - mWidth, toolbarRect.height, this.mWidth, (Screen.height - toolbarRect.height) - 21f);
-			GUILayout.BeginArea(toolbarRect, EditorStyles.toolbar);
-			this.mBehaviorToolbarSelection = GUILayout.Toolbar(this.mBehaviorToolbarSelection, this.mBehaviorToolbarStrings, EditorStyles.toolbarButton);
-			GUILayout.EndArea();
-			GUILayout.BeginArea(boxRect);
-			Filter();
-			if (mBehaviorToolbarSelection == 0)
-			{
-				DrawNodes();
-			}
-			else if (mBehaviorToolbarSelection == 1)
-			{
-				DrawTools();
-			}
-			//             else if (mBehaviorToolbarSelection == 2)
-			//             {
-			//                 DrawTools();
-			//             }
-			//             else if (mBehaviorToolbarSelection == 3)
-			//             {
-			//                 DrawDebugView();
-			//             }
-			GUILayout.EndArea();
-		}
-
-		private void DrawNodes()
-		{
-			float offset = 190f;
-			if (mCurNode == null)
-			{
-				offset = 55f;
-			}
-			DrawSearchList(offset);
-			DrawNodeFunctions(offset);
-		}
-
-		private readonly GameObject[] searchGoArr = new GameObject[0];
-		private Vector2 scrollPosition = Vector2.zero;
-
-		private void DrawTools()
-		{
-		}
-
-		private void ShowResult()
-		{
-			Rect boxRect1 = new Rect(0f, 100, this.mWidth, Screen.height);
-			GUILayout.BeginArea(boxRect1);
-
-			scrollPosition = GUI.BeginScrollView(new Rect(0, 0, this.mWidth, 220), scrollPosition, new Rect(0, 0, this.mWidth - 20, searchGoArr.Length * 20));
-			for (int i = 0; i < this.searchGoArr.Length; i++)
-			{
-				searchGoArr[i] = BehaviourTreeField((i + 1).ToString(), searchGoArr[i]);
-			}
-
-			GUI.EndScrollView();
-			GUILayout.EndArea();
-		}
-
-		public GameObject BehaviourTreeField(string desc, GameObject value)
-		{
-			EditorGUILayout.BeginHorizontal();
-			value = (GameObject) EditorGUILayout.ObjectField(desc, value, typeof(GameObject), false);
-			if (value.GetComponent<BehaviorTreeConfig>() != null && GUILayout.Button("打开行为树"))
-			{
-				BehaviorManager.Instance.OpenBehaviorEditor(value);
-				SetToolBar(2);
-			}
-			EditorGUILayout.EndHorizontal();
-			return value;
-		}
-
-		public void SetToolBar(int select)
-		{
-			this.mBehaviorToolbarSelection = select;
-		}
-
-		private string DrawSearchList(float offset)
-		{
-			GUILayout.BeginHorizontal();
-			GUI.SetNextControlName("Search");
-			this.mSearchNode = GUILayout.TextField(this.mSearchNode, GUI.skin.FindStyle("ToolbarSeachTextField"));
-			GUILayout.EndHorizontal();
-
-			toolbarRect = new Rect(0f, 15f, mWidth, 25f);
-			GUILayout.BeginArea(toolbarRect, EditorStyles.toolbar);
-			GUILayout.BeginHorizontal();
-
-			GUILayout.Label("Filter");
-			Array strArr = Enum.GetValues(typeof(NodeClassifyType));
-			List<string> strList = new List<string>();
-			strList.Add("All");
-			foreach (object str in strArr)
-			{
-				strList.Add(str.ToString());
-			}
-			mEnumNodeTypeArr = strList.ToArray();
-			mEnumNodeTypeSelection = EditorGUILayout.Popup(mEnumNodeTypeSelection, mEnumNodeTypeArr);
-			if (GUILayout.Button("Clear"))
-			{
-				ClearNodes();
-			}
-			GUILayout.EndHorizontal();
-			GUILayout.EndArea();
-
-			GUILayout.BeginArea(new Rect(0f, 15f + 20, this.mWidth, Screen.height - offset));
-			this.mTreeScrollPos = GUI.BeginScrollView(new Rect(0f, 0f, this.mWidth, Screen.height - offset), this.mTreeScrollPos,
-			                                          new Rect(0f, 0f, this.mWidth - 20f, mNodeCount * 19), false, false);
-			mNodeFoldout.Draw();
-			GUI.EndScrollView();
-			GUILayout.EndArea();
-			if (mCurNode != null)
-			{
-				string[] arr = mCurNode.Text.Split(' ');
-				string name = arr[0];
-				return name;
-			}
-			return "";
-		}
-
-		private void ClearNodes()
-		{
-			BehaviorManager.Instance.selectNodeName = "";
-			mEnumNodeTypeSelection = 0;
-			mSearchNode = "";
-			foreach (FoldoutFolder folder in mNodeFoldout.Folders)
-			{
-				foreach (FoldoutNode node in folder.Nodes)
-				{
-					node.Hide = false;
-				}
-			}
-		}
-
-		private void DrawNodeFunctions(float offset)
-		{
-			Rect boxRect = new Rect(0f, Screen.height - offset + 15f, this.mWidth, 200f);
-			GUILayout.BeginArea(boxRect);
-			BehaviorManager.Instance.selectNodeName = "";
-			if (mCurNode != null)
-			{
-				string[] arr = mCurNode.Text.Split(' ');
-				string name = arr[0];
-				BehaviorManager.Instance.selectNodeName = name;
-				BehaviorManager.Instance.selectNodeType = mCurNode.folderName;
-				if (mCurNode.folderName != NodeClassifyType.Root.ToString())
-				{
-					if (GUILayout.Button("新建"))
-					{
-						Game.Scene.GetComponent<EventComponent>().Run(EventIdType.BehaviorTreePropertyDesignerNewCreateClick, name, Vector2.zero);
-					}
-				}
-				if (mCurNode.folderName != NodeClassifyType.Root.ToString() ||
-				    (mCurNode.folderName == NodeClassifyType.Root.ToString() && mCurBehaviorNode.IsRoot()))
-				{
-					if (GUILayout.Button("替换"))
-					{
-						Game.Scene.GetComponent<EventComponent>().Run(EventIdType.BehaviorTreeReplaceClick, name, Vector2.zero);
-					}
-				}
-
-				if (GUILayout.Button("保存"))
-				{
-					BehaviorManager.Instance.SaveAll();
-				}
-				ClientNodeTypeProto node = BehaviorManager.Instance.GetNodeTypeProto(name);
-				GUILayout.Label("节点名:" + node.name);
-				GUILayout.Label("描述:" + node.describe);
-			}
-
-			GUILayout.EndArea();
-		}
-
-		private void UpdateList()
-		{
-			mNodeFoldout = new FoldoutFolder("所有节点", SelectNodeFolderCallback);
-			mNodeFoldout.Fold = true;
-
-			foreach (KeyValuePair<string, List<ClientNodeTypeProto>> kv in BehaviorManager.Instance.Classify2NodeProtoList)
-			{
-				string classify = kv.Key;
-				List<ClientNodeTypeProto> nodeTypeList = kv.Value;
-				FoldoutFolder folder = mNodeFoldout.AddFolder(classify, SelectNodeFolderCallback);
-				folder.Fold = true;
-
-				mNodeCount++;
-				foreach (ClientNodeTypeProto nodeType in nodeTypeList)
-				{
-					folder.AddNode(classify, nodeType.name + " (" + nodeType.describe + ")", SelectNodeCallback);
-					mNodeCount++;
-				}
-			}
-		}
-
-		private void Filter()
-		{
-			foreach (FoldoutFolder folder in mNodeFoldout.Folders)
-			{
-				string selectType;
-				if (mEnumNodeTypeSelection == 0)
-				{
-					selectType = "All";
-				}
-				else
-				{
-					selectType = Enum.GetName(typeof(NodeClassifyType), mEnumNodeTypeSelection - 1);
-				}
-
-				if (selectType == folder.Text || selectType == "All")
-				{
-					folder.Hide = false;
-					foreach (FoldoutNode node in folder.Nodes)
-					{
-						if (node.Text.ToUpper().IndexOf(mSearchNode.ToUpper()) == -1)
-						{
-							node.Hide = true;
-						}
-						else
-						{
-							node.Hide = false;
-						}
-					}
-				}
-				else
-				{
-					foreach (FoldoutNode node in folder.Nodes)
-					{
-						node.Hide = true;
-					}
-					folder.Hide = true;
-				}
-			}
-		}
-
-		public void SelectNodeFolderCallback(FoldoutFolder folder)
-		{
-			folder.Select = true;
-			if (mCurNodeFolder != null && mCurNodeFolder != folder)
-			{
-				mCurNodeFolder.Select = false;
-				mCurNodeFolder = null;
-			}
-			mCurNodeFolder = folder;
-		}
-
-		public void SelectNodeCallback(FoldoutNode node)
-		{
-			node.Select = true;
-			if (mCurNode != null && mCurNode != node)
-			{
-				mCurNode.Select = false;
-				mCurNode = null;
-			}
-			mCurNode = node;
-		}
-
-		public void onDraggingBorder(float deltaX)
-		{
-			mWidth -= deltaX;
-		}
-
-		public void onSelectNode(params object[] list)
-		{
-			mCurBehaviorNode = (BehaviorNodeData) list[0];
-			GUI.FocusControl("");
-		}
-	}
-}

+ 147 - 119
Unity/Assets/Res/BT/BT_大厅UI创建时执行行为树.prefab

@@ -44,105 +44,107 @@ GameObject:
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
   m_IsActive: 1
---- !u!1 &1193271619585814
+--- !u!1 &1239706728091168
 GameObject:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
   serializedVersion: 5
   m_Component:
-  - component: {fileID: 4616619386828382}
-  - component: {fileID: 114508003071584108}
-  - component: {fileID: 114522066902515920}
-  - component: {fileID: 114185579265163046}
+  - component: {fileID: 4822797800425144}
+  - component: {fileID: 114160357691981270}
+  - component: {fileID: 114453801497597072}
+  - component: {fileID: 114599547672271622}
   m_Layer: 0
-  m_Name: UIScale
+  m_Name: CreateUIEffect
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
   m_IsActive: 1
---- !u!1 &1295418660867886
+--- !u!1 &1305432031508964
 GameObject:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
   serializedVersion: 5
   m_Component:
-  - component: {fileID: 4056688166984052}
-  - component: {fileID: 114922715807505748}
+  - component: {fileID: 4363825776856736}
+  - component: {fileID: 114918487499667086}
+  - component: {fileID: 114637251929799288}
+  - component: {fileID: 114525465961189504}
   m_Layer: 0
-  m_Name: Selector
+  m_Name: CreateUIEffect
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
   m_IsActive: 1
---- !u!1 &1346792475454164
+--- !u!1 &1373607487415812
 GameObject:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
   serializedVersion: 5
   m_Component:
-  - component: {fileID: 4572860375544610}
-  - component: {fileID: 114053638919583870}
-  - component: {fileID: 114771998989144004}
-  - component: {fileID: 114351509525792566}
+  - component: {fileID: 4555921541367154}
+  - component: {fileID: 114230622368643720}
   m_Layer: 0
-  m_Name: CreateUIEffect
+  m_Name: Sequence
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
   m_IsActive: 1
---- !u!1 &1616457218697920
+--- !u!1 &1390488095828772
 GameObject:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
   serializedVersion: 5
   m_Component:
-  - component: {fileID: 4417717115913526}
-  - component: {fileID: 114286383706012722}
+  - component: {fileID: 4353360657128694}
+  - component: {fileID: 114162771567128912}
+  - component: {fileID: 114748308954483146}
+  - component: {fileID: 114141248068422340}
+  - component: {fileID: 114866763615549836}
   m_Layer: 0
-  m_Name: Sequence
+  m_Name: UIScale
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
   m_IsActive: 1
---- !u!1 &1796546804283450
+--- !u!1 &1530404037312872
 GameObject:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
   serializedVersion: 5
   m_Component:
-  - component: {fileID: 4489497142252778}
-  - component: {fileID: 114288251435820106}
-  - component: {fileID: 114909548170981006}
-  - component: {fileID: 114910544375086878}
+  - component: {fileID: 4992056743961942}
+  - component: {fileID: 114899551113708496}
+  - component: {fileID: 114285618015605964}
+  - component: {fileID: 114951301332198390}
+  - component: {fileID: 114762921281759710}
   m_Layer: 0
-  m_Name: CreateUIEffect
+  m_Name: UIScale
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
   m_IsActive: 1
---- !u!1 &1973637592813186
+--- !u!1 &1946731937677542
 GameObject:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
   serializedVersion: 5
   m_Component:
-  - component: {fileID: 4482808043330860}
-  - component: {fileID: 114120525991366058}
-  - component: {fileID: 114664666143245534}
-  - component: {fileID: 114598011534965404}
+  - component: {fileID: 4579368644171478}
+  - component: {fileID: 114502358648830016}
   m_Layer: 0
-  m_Name: UIScale
+  m_Name: Sequence
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
@@ -158,7 +160,7 @@ Transform:
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_Children:
-  - {fileID: 4417717115913526}
+  - {fileID: 4555921541367154}
   m_Father: {fileID: 4000013585351022}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -176,88 +178,88 @@ Transform:
   m_Father: {fileID: 0}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!4 &4056688166984052
+--- !u!4 &4353360657128694
 Transform:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1295418660867886}
+  m_GameObject: {fileID: 1390488095828772}
   m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
-  m_Children:
-  - {fileID: 4616619386828382}
-  - {fileID: 4572860375544610}
-  m_Father: {fileID: 4417717115913526}
+  m_Children: []
+  m_Father: {fileID: 4579368644171478}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!4 &4417717115913526
+--- !u!4 &4363825776856736
 Transform:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1616457218697920}
+  m_GameObject: {fileID: 1305432031508964}
   m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
-  m_Children:
-  - {fileID: 4056688166984052}
-  - {fileID: 4489497142252778}
-  - {fileID: 4482808043330860}
-  m_Father: {fileID: 4000012504621142}
-  m_RootOrder: 0
+  m_Children: []
+  m_Father: {fileID: 4579368644171478}
+  m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!4 &4482808043330860
+--- !u!4 &4555921541367154
 Transform:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1973637592813186}
+  m_GameObject: {fileID: 1373607487415812}
   m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
-  m_Children: []
-  m_Father: {fileID: 4417717115913526}
-  m_RootOrder: 2
+  m_Children:
+  - {fileID: 4579368644171478}
+  - {fileID: 4822797800425144}
+  - {fileID: 4992056743961942}
+  m_Father: {fileID: 4000012504621142}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!4 &4489497142252778
+--- !u!4 &4579368644171478
 Transform:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1796546804283450}
+  m_GameObject: {fileID: 1946731937677542}
   m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
-  m_Children: []
-  m_Father: {fileID: 4417717115913526}
-  m_RootOrder: 1
+  m_Children:
+  - {fileID: 4353360657128694}
+  - {fileID: 4363825776856736}
+  m_Father: {fileID: 4555921541367154}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!4 &4572860375544610
+--- !u!4 &4822797800425144
 Transform:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1346792475454164}
+  m_GameObject: {fileID: 1239706728091168}
   m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_Children: []
-  m_Father: {fileID: 4056688166984052}
+  m_Father: {fileID: 4555921541367154}
   m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!4 &4616619386828382
+--- !u!4 &4992056743961942
 Transform:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1193271619585814}
+  m_GameObject: {fileID: 1530404037312872}
   m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_Children: []
-  m_Father: {fileID: 4056688166984052}
-  m_RootOrder: 0
+  m_Father: {fileID: 4555921541367154}
+  m_RootOrder: 2
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!114 &114000010724577698
 MonoBehaviour:
@@ -297,51 +299,51 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   id: 100001
   describe: "\u5927\u5385UI\u521B\u5EFA\u65F6\u6267\u884C\u884C\u4E3A\u6811"
---- !u!114 &114053638919583870
+--- !u!114 &114141248068422340
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1346792475454164}
+  m_GameObject: {fileID: 1390488095828772}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 2d74453161f00b24287b1f1fb56b0778, type: 3}
+  m_Script: {fileID: 11500000, guid: 543f3ab39de095e4e80a0c5bbff4242e, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  id: 100005
-  describe: 
---- !u!114 &114120525991366058
+  fieldName: scale
+  fieldValue: 0
+--- !u!114 &114160357691981270
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1973637592813186}
+  m_GameObject: {fileID: 1239706728091168}
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: 2d74453161f00b24287b1f1fb56b0778, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  id: 100007
+  id: 100006
   describe: 
---- !u!114 &114185579265163046
+--- !u!114 &114162771567128912
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1193271619585814}
+  m_GameObject: {fileID: 1390488095828772}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 543f3ab39de095e4e80a0c5bbff4242e, type: 3}
+  m_Script: {fileID: 11500000, guid: 2d74453161f00b24287b1f1fb56b0778, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  fieldName: scale
-  fieldValue: 0
---- !u!114 &114286383706012722
+  id: 100004
+  describe: 
+--- !u!114 &114230622368643720
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1616457218697920}
+  m_GameObject: {fileID: 1373607487415812}
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: 2d74453161f00b24287b1f1fb56b0778, type: 3}
@@ -349,77 +351,77 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   id: 100002
   describe: 
---- !u!114 &114288251435820106
+--- !u!114 &114285618015605964
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1796546804283450}
+  m_GameObject: {fileID: 1530404037312872}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 2d74453161f00b24287b1f1fb56b0778, type: 3}
+  m_Script: {fileID: 11500000, guid: 872ab75cd8949824c994b1fb31d221f1, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  id: 100006
-  describe: 
---- !u!114 &114351509525792566
+  fieldName: uiKey
+  fieldValue: UI
+--- !u!114 &114453801497597072
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1346792475454164}
+  m_GameObject: {fileID: 1239706728091168}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 7be3fccf10005084b99360e730465802, type: 3}
+  m_Script: {fileID: 11500000, guid: 872ab75cd8949824c994b1fb31d221f1, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  fieldName: effect
-  fieldValue: {fileID: 0}
---- !u!114 &114508003071584108
+  fieldName: uiKey
+  fieldValue: UI
+--- !u!114 &114502358648830016
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1193271619585814}
+  m_GameObject: {fileID: 1946731937677542}
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: 2d74453161f00b24287b1f1fb56b0778, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  id: 100004
+  id: 100003
   describe: 
---- !u!114 &114522066902515920
+--- !u!114 &114525465961189504
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1193271619585814}
+  m_GameObject: {fileID: 1305432031508964}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 872ab75cd8949824c994b1fb31d221f1, type: 3}
+  m_Script: {fileID: 11500000, guid: 7be3fccf10005084b99360e730465802, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  fieldName: uiKey
-  fieldValue: UI
---- !u!114 &114598011534965404
+  fieldName: effect
+  fieldValue: {fileID: 1000013439777610, guid: ec75b784e8d7596478790f42fd4d9937, type: 2}
+--- !u!114 &114599547672271622
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1973637592813186}
+  m_GameObject: {fileID: 1239706728091168}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 543f3ab39de095e4e80a0c5bbff4242e, type: 3}
+  m_Script: {fileID: 11500000, guid: 7be3fccf10005084b99360e730465802, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  fieldName: scale
-  fieldValue: 1
---- !u!114 &114664666143245534
+  fieldName: effect
+  fieldValue: {fileID: 1000013439777610, guid: ec75b784e8d7596478790f42fd4d9937, type: 2}
+--- !u!114 &114637251929799288
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1973637592813186}
+  m_GameObject: {fileID: 1305432031508964}
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: 872ab75cd8949824c994b1fb31d221f1, type: 3}
@@ -427,12 +429,12 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   fieldName: uiKey
   fieldValue: UI
---- !u!114 &114771998989144004
+--- !u!114 &114748308954483146
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1346792475454164}
+  m_GameObject: {fileID: 1390488095828772}
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: 872ab75cd8949824c994b1fb31d221f1, type: 3}
@@ -440,42 +442,68 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   fieldName: uiKey
   fieldValue: UI
---- !u!114 &114909548170981006
+--- !u!114 &114762921281759710
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1796546804283450}
+  m_GameObject: {fileID: 1530404037312872}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 872ab75cd8949824c994b1fb31d221f1, type: 3}
+  m_Script: {fileID: 11500000, guid: 1e17fc1879d205c4d94506a80095f4a0, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  fieldName: uiKey
-  fieldValue: UI
---- !u!114 &114910544375086878
+  fieldName: aaaa
+  fieldValue: BBBB
+--- !u!114 &114866763615549836
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1796546804283450}
+  m_GameObject: {fileID: 1390488095828772}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 7be3fccf10005084b99360e730465802, type: 3}
+  m_Script: {fileID: 11500000, guid: 1e17fc1879d205c4d94506a80095f4a0, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  fieldName: effect
-  fieldValue: {fileID: 1000013439777610, guid: ec75b784e8d7596478790f42fd4d9937, type: 2}
---- !u!114 &114922715807505748
+  fieldName: aaaa
+  fieldValue: BBBB
+--- !u!114 &114899551113708496
 MonoBehaviour:
   m_ObjectHideFlags: 1
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1295418660867886}
+  m_GameObject: {fileID: 1530404037312872}
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: 2d74453161f00b24287b1f1fb56b0778, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  id: 100003
+  id: 100007
+  describe: 
+--- !u!114 &114918487499667086
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1305432031508964}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2d74453161f00b24287b1f1fb56b0778, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  id: 100005
   describe: 
+--- !u!114 &114951301332198390
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1530404037312872}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 543f3ab39de095e4e80a0c5bbff4242e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  fieldName: scale
+  fieldValue: 1

+ 4 - 4
Unity/Assets/Scripts/BehaviorTree/BehaviorNodeConfig.cs

@@ -38,10 +38,10 @@ namespace Model
 		{
 			NodeProto nodeProto = new NodeProto
 			{
-				nodeId = behaviorNodeConfig.id,
-				name = behaviorNodeConfig.name,
-				describe = behaviorNodeConfig.describe,
-				args_dict = behaviorNodeConfig.GetArgsDict(),
+				Id = behaviorNodeConfig.id,
+				Name = behaviorNodeConfig.name,
+				Desc = behaviorNodeConfig.describe,
+				Args = behaviorNodeConfig.GetArgsDict(),
 				children = new List<NodeProto>()
 			};
 			foreach (Transform child in behaviorNodeConfig.gameObject.transform)

+ 10 - 186
Unity/Assets/Scripts/BehaviorTree/BehaviorTreeArgsDict.cs

@@ -21,6 +21,16 @@ namespace Model
 			this.dict.Remove(key);
 		}
 
+		public object Get(string fieldName)
+		{
+			if (!this.dict.ContainsKey(fieldName))
+			{
+				//Log.Error($"fieldName:{fieldName} 不存在!!!!");
+				return null;
+			}
+			return this.dict[fieldName];
+		}
+
 		public bool ContainsKey(string key)
 		{
 			return this.dict.ContainsKey(key);
@@ -69,192 +79,6 @@ namespace Model
 
 		}
 
-		public object GetTreeDictValue(string fieldName)
-		{
-			if (!this.dict.ContainsKey(fieldName))
-			{
-				//Log.Error($"fieldName:{fieldName} 不存在!!!!");
-				return null;
-			}
-			return this.dict[fieldName];
-		}
-
-		/// <summary>
-		/// judge
-		/// </summary>
-		/// <param nodeName="type"></param>
-		/// <returns></returns>
-		public static bool IsStringType(Type type)
-		{
-			return typeof (string) == type;
-		}
-
-		public static bool IsBoolType(Type type)
-		{
-			return typeof (bool) == type;
-		}
-
-		public static bool IsIntType(Type type)
-		{
-			return typeof (int) == type;
-		}
-
-		public static bool IsLongType(Type type)
-		{
-			return typeof (long) == type;
-		}
-
-		public static bool IsFloatType(Type type)
-		{
-			return typeof (float) == type;
-		}
-
-		public static bool IsDoubleType(Type type)
-		{
-			return typeof (double) == type;
-		}
-
-		public static bool IsIntArrType(Type type)
-		{
-			return typeof (int[]) == type;
-		}
-
-		public static bool IsLongArrType(Type type)
-		{
-			return typeof (long[]) == type;
-		}
-
-		public static bool IsFloatArrType(Type type)
-		{
-			return typeof (float[]) == type;
-		}
-
-		public static bool IsDoubleArrType(Type type)
-		{
-			return typeof (double[]) == type;
-		}
-
-		public static bool IsStringArrType(Type type)
-		{
-			return typeof (string[]) == type;
-		}
-
-		public static bool IsObjectType(Type fieldType)
-		{
-			Type objecType = typeof (UnityEngine.Object);
-			if (fieldType == objecType || fieldType.IsSubclassOf(objecType))
-			{
-				return true;
-			}
-			return false;
-		}
-
-		public static bool IsObjectArrayType(Type fieldType)
-		{
-			if (fieldType == typeof (UnityEngine.Object[]) || fieldType == typeof (GameObject[]) || fieldType == typeof (Material[]) ||
-			    fieldType == typeof (Texture[]) || fieldType == typeof (Texture2D[]) || fieldType == typeof (Texture3D[]) || fieldType == typeof (Shader[]) ||
-			    fieldType == typeof (AudioClip[]) || fieldType == typeof (Sprite[]))
-			{
-				return true;
-			}
-			return false;
-		}
-
-		public static bool IsConvertble(Type type)
-		{
-			return type == typeof (IConvertible);
-		}
-
-		public static bool IsAudioClipType(Type fieldType)
-		{
-			return fieldType == typeof (AudioClip);
-		}
-
-		public static bool IsMaterialType(Type fieldType)
-		{
-			return fieldType == typeof (Material);
-		}
-
-		public static bool IsGameObjectType(Type fieldType)
-		{
-			return fieldType == typeof (GameObject);
-		}
-
-		public static bool IsShaderType(Type fieldType)
-		{
-			return fieldType == typeof (Shader);
-		}
-
-		public static bool IsTextureType(Type fieldType)
-		{
-			return fieldType == typeof (Texture);
-		}
-
-		public static bool IsTexture2DType(Type fieldType)
-		{
-			return fieldType == typeof (Texture2D);
-		}
-
-		public static bool IsTexture3DType(Type fieldType)
-		{
-			return fieldType == typeof (Texture3D);
-		}
-
-		public static bool IsGameObjectArrayType(Type fieldType)
-		{
-			return fieldType == typeof (GameObject[]);
-		}
-
-		public static bool IsMaterialArrayType(Type fieldType)
-		{
-			return fieldType == typeof (Material[]);
-		}
-
-		public static bool IsTextureArrayType(Type fieldType)
-		{
-			return fieldType == typeof (Texture[]);
-		}
-
-		public static bool IsTexture2DArrayType(Type fieldType)
-		{
-			return fieldType == typeof (Texture2D[]);
-		}
-
-		public static bool IsTexture3DArrayType(Type fieldType)
-		{
-			return fieldType == typeof (Texture3D[]);
-		}
-
-		public static bool IsShaderArrayType(Type fieldType)
-		{
-			return fieldType == typeof (Shader[]);
-		}
-
-		public static bool IsAudioClipArrayType(Type fieldType)
-		{
-			return fieldType == typeof (AudioClip[]);
-		}
-
-		public static bool IsUnitConfigArrayType(Type fieldType)
-		{
-			return false;
-		}
-
-		public static bool IsSpriteArrayType(Type fieldType)
-		{
-			return fieldType == typeof (Sprite[]);
-		}
-
-		public static bool IsEnumType(Type fieldType)
-		{
-			Type enumType = typeof (Enum);
-			if (fieldType == enumType || fieldType.IsSubclassOf(enumType))
-			{
-				return true;
-			}
-			return false;
-		}
-
 		public static bool SatisfyCondition(GameObject go, Type[] constraintTypes)
 		{
 			if (go == null || constraintTypes == null || constraintTypes.Length <= 0)

+ 37 - 4
Unity/Assets/Scripts/BehaviorTree/BehaviorTreeType/BTTypeManager.cs

@@ -38,10 +38,43 @@ namespace Model
 			{ typeof (Sprite[]), typeof (BTArraySpriteComponent) }
 		};
 
-		public static Type GetBTType(string name)
+		public static Dictionary<Type, object> BTTypeDefaultValue { get; } = new Dictionary<Type, object>
 		{
-			Type type = Type.GetType($"Base.{name}");
-			return null;
+			{ typeof (int), 0 },
+			{ typeof (long), 0L },
+			{ typeof (string), "" },
+			{ typeof (Enum), "" },
+			{ typeof (bool), false },
+			{ typeof (float), 0f },
+			{ typeof (double), default(double) },
+			{ typeof (int[]), new int[] {}},
+			{ typeof (long[]), new long[] {} },
+			{ typeof (string[]), new string[] {} },
+			{ typeof (float[]), new float[] {} },
+			{ typeof (double[]), new double[] {} },
+			{ typeof (GameObject), null },
+			{ typeof (AudioClip), null },
+			{ typeof (Material), null },
+			{ typeof (Shader), null },
+			{ typeof (Texture), null },
+			{ typeof (Texture2D), null },
+			{ typeof (Texture3D), null },
+			{ typeof (Sprite), null },
+			{ typeof (GameObject[]), new GameObject[] {}},
+			{ typeof (AudioClip[]), new AudioClip[] {} },
+			{ typeof (Material[]), new Material[] {} },
+			{ typeof (Shader[]), new Shader[] {} },
+			{ typeof (Texture[]), new Texture[] {} },
+			{ typeof (Texture2D[]), new Texture2D[] {} },
+			{ typeof (Texture3D[]), new Texture3D[] {} },
+			{ typeof (Sprite[]), new Sprite[] {} }
+		};
+
+		public static object GetDefaultValue(Type originType)
+		{
+			object value = null;
+			BTTypeDefaultValue.TryGetValue(originType, out value);
+			return value;
 		}
 
 		public static Type GetBTType(Type originType)
@@ -49,7 +82,7 @@ namespace Model
 			Type type = null;
 			try
 			{
-				if (BehaviorTreeArgsDict.IsEnumType(originType))
+				if (TypeHelper.IsEnumType(originType))
 				{
 					type = BTTypeDict[typeof (Enum)];
 				}

+ 4 - 4
Unity/Assets/Scripts/BehaviorTree/Node.cs

@@ -12,8 +12,8 @@ namespace Model
 
 		protected Node(NodeProto nodeProto)
 		{
-			this.id = nodeProto.nodeId;
-			this.description = nodeProto.describe;
+			this.id = nodeProto.Id;
+			this.description = nodeProto.Desc;
 			this.NodeProto = nodeProto;
 		}
 
@@ -61,7 +61,7 @@ namespace Model
 		{
 			get
 			{
-				return this.NodeProto.name;
+				return this.NodeProto.Name;
 			}
 		}
 
@@ -81,7 +81,7 @@ namespace Model
 				env.Add(BTEnvKey.NodePath, new List<long>());
 			}
 
-			env.Get<List<long>>(BTEnvKey.NodePath).Add(this.NodeProto.nodeId);
+			env.Get<List<long>>(BTEnvKey.NodePath).Add(this.NodeProto.Id);
 			return this.Run(behaviorTree, env);
 		}
 

+ 6 - 6
Unity/Assets/Scripts/BehaviorTree/NodeProto.cs

@@ -4,13 +4,13 @@ namespace Model
 {
 	public class NodeProto
 	{
-		public int nodeId;
+		public int Id;
 
-		public string name;
+		public string Name;
 
-		public string describe = "";
+		public string Desc = "";
 		
-		public BehaviorTreeArgsDict args_dict;
+		public BehaviorTreeArgsDict Args;
 		
 		public List<NodeProto> children = new List<NodeProto>();
 
@@ -28,12 +28,12 @@ namespace Model
 
 		public NodeProto()
 		{
-			this.args_dict = new BehaviorTreeArgsDict();
+			this.Args = new BehaviorTreeArgsDict();
 		}
 
 		public NodeProto(BehaviorTreeArgsDict dict)
 		{
-			this.args_dict = dict;
+			this.Args = dict;
 		}
 	}
 }

+ 179 - 0
Unity/Assets/Scripts/BehaviorTree/TypeHelper.cs

@@ -0,0 +1,179 @@
+using System;
+using UnityEngine;
+
+namespace Model
+{
+	public static class TypeHelper
+	{
+		public static bool IsStringType(Type type)
+		{
+			return typeof(string) == type;
+		}
+
+		public static bool IsBoolType(Type type)
+		{
+			return typeof(bool) == type;
+		}
+
+		public static bool IsIntType(Type type)
+		{
+			return typeof(int) == type;
+		}
+
+		public static bool IsLongType(Type type)
+		{
+			return typeof(long) == type;
+		}
+
+		public static bool IsFloatType(Type type)
+		{
+			return typeof(float) == type;
+		}
+
+		public static bool IsDoubleType(Type type)
+		{
+			return typeof(double) == type;
+		}
+
+		public static bool IsIntArrType(Type type)
+		{
+			return typeof(int[]) == type;
+		}
+
+		public static bool IsLongArrType(Type type)
+		{
+			return typeof(long[]) == type;
+		}
+
+		public static bool IsFloatArrType(Type type)
+		{
+			return typeof(float[]) == type;
+		}
+
+		public static bool IsDoubleArrType(Type type)
+		{
+			return typeof(double[]) == type;
+		}
+
+		public static bool IsStringArrType(Type type)
+		{
+			return typeof(string[]) == type;
+		}
+
+		public static bool IsObjectType(Type fieldType)
+		{
+			Type objecType = typeof(UnityEngine.Object);
+			if (fieldType == objecType || fieldType.IsSubclassOf(objecType))
+			{
+				return true;
+			}
+			return false;
+		}
+
+		public static bool IsObjectArrayType(Type fieldType)
+		{
+			if (fieldType == typeof(UnityEngine.Object[]) || fieldType == typeof(GameObject[]) || fieldType == typeof(Material[]) ||
+			    fieldType == typeof(Texture[]) || fieldType == typeof(Texture2D[]) || fieldType == typeof(Texture3D[]) || fieldType == typeof(Shader[]) ||
+			    fieldType == typeof(AudioClip[]) || fieldType == typeof(Sprite[]))
+			{
+				return true;
+			}
+			return false;
+		}
+
+		public static bool IsConvertble(Type type)
+		{
+			return type == typeof(IConvertible);
+		}
+
+		public static bool IsAudioClipType(Type fieldType)
+		{
+			return fieldType == typeof(AudioClip);
+		}
+
+		public static bool IsMaterialType(Type fieldType)
+		{
+			return fieldType == typeof(Material);
+		}
+
+		public static bool IsGameObjectType(Type fieldType)
+		{
+			return fieldType == typeof(GameObject);
+		}
+
+		public static bool IsShaderType(Type fieldType)
+		{
+			return fieldType == typeof(Shader);
+		}
+
+		public static bool IsTextureType(Type fieldType)
+		{
+			return fieldType == typeof(Texture);
+		}
+
+		public static bool IsTexture2DType(Type fieldType)
+		{
+			return fieldType == typeof(Texture2D);
+		}
+
+		public static bool IsTexture3DType(Type fieldType)
+		{
+			return fieldType == typeof(Texture3D);
+		}
+
+		public static bool IsGameObjectArrayType(Type fieldType)
+		{
+			return fieldType == typeof(GameObject[]);
+		}
+
+		public static bool IsMaterialArrayType(Type fieldType)
+		{
+			return fieldType == typeof(Material[]);
+		}
+
+		public static bool IsTextureArrayType(Type fieldType)
+		{
+			return fieldType == typeof(Texture[]);
+		}
+
+		public static bool IsTexture2DArrayType(Type fieldType)
+		{
+			return fieldType == typeof(Texture2D[]);
+		}
+
+		public static bool IsTexture3DArrayType(Type fieldType)
+		{
+			return fieldType == typeof(Texture3D[]);
+		}
+
+		public static bool IsShaderArrayType(Type fieldType)
+		{
+			return fieldType == typeof(Shader[]);
+		}
+
+		public static bool IsAudioClipArrayType(Type fieldType)
+		{
+			return fieldType == typeof(AudioClip[]);
+		}
+
+		public static bool IsUnitConfigArrayType(Type fieldType)
+		{
+			return false;
+		}
+
+		public static bool IsSpriteArrayType(Type fieldType)
+		{
+			return fieldType == typeof(Sprite[]);
+		}
+
+		public static bool IsEnumType(Type fieldType)
+		{
+			Type enumType = typeof(Enum);
+			if (fieldType == enumType || fieldType.IsSubclassOf(enumType))
+			{
+				return true;
+			}
+			return false;
+		}
+	}
+}

+ 3 - 3
Unity/Assets/Editor/BehaviorTreeEditor/RightDesigner.cs.meta → Unity/Assets/Scripts/BehaviorTree/TypeHelper.cs.meta

@@ -1,7 +1,7 @@
 fileFormatVersion: 2
-guid: 3dbe8c9273e8a8c4e98c8b6a00e6dd1e
-timeCreated: 1473060842
-licenseType: Pro
+guid: 6520f469624f70642a0582959ad8fc8e
+timeCreated: 1497950215
+licenseType: Free
 MonoImporter:
   serializedVersion: 2
   defaultReferences: []

+ 12 - 1
Unity/Assets/Scripts/BehaviorTreeNode/UIScale.cs

@@ -1,7 +1,15 @@
-using UnityEngine;
+using Base;
+using UnityEngine;
 
 namespace Model
 {
+	public enum AAAA
+	{
+		BBBB,
+		CCCC,
+		DDDD
+	}
+
 	[Node(NodeClassifyType.Action, "将UI缩放")]
 	public class UIScale : Node
 	{
@@ -11,6 +19,9 @@ namespace Model
 		[NodeField("缩放倍数")]
 		private float scale;
 
+		[NodeField("111")]
+		private AAAA aaaa;
+
 		public UIScale(NodeProto nodeProto): base(nodeProto)
 		{
 		}

+ 13 - 7
Unity/Assets/Scripts/Component/BehaviorTreeComponent.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Reflection;
+using Base;
 using UnityEngine;
 
 namespace Model
@@ -55,31 +56,36 @@ namespace Model
 
 		private static void InitFieldValue(ref Node node, NodeProto nodeProto)
 		{
-			Type type = Game.EntityEventManager.GetAssembly("Model").GetType("Model." + nodeProto.name);
+			Type type = Game.EntityEventManager.GetAssembly("Model").GetType("Model." + nodeProto.Name);
 
-			foreach (var args_item in nodeProto.args_dict.Dict())
+			foreach (var args_item in nodeProto.Args.Dict())
 			{
 				FieldInfo fieldInfo = type.GetField(args_item.Key, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
 				if (fieldInfo == null)
 				{
 					continue;
 				}
-				NewSetValue(ref node, fieldInfo, args_item.Value, nodeProto.name);
+				NewSetValue(ref node, fieldInfo, args_item.Value);
 			}
 		}
 
-		private static void NewSetValue(ref Node node, FieldInfo field, object value, string nodeName)
+		private static void NewSetValue(ref Node node, FieldInfo field, object value)
 		{
+			// unity enum无法序列化,保存的string形式
+			if (field.FieldType.IsEnum)
+			{
+				value = Enum.Parse(field.FieldType, (string) value);
+			}
 			field.SetValue(node, value);
 		}
 
 		private Node CreateOneNode(NodeProto proto)
 		{
-			if (!this.dictionary.ContainsKey(proto.name))
+			if (!this.dictionary.ContainsKey(proto.Name))
 			{
-				throw new KeyNotFoundException($"NodeType没有定义该节点: {proto.name}");
+				throw new KeyNotFoundException($"NodeType没有定义该节点: {proto.Name}");
 			}
-			return this.dictionary[proto.name](proto);
+			return this.dictionary[proto.Name](proto);
 		}
 
 		private Node CreateTreeNode(NodeProto proto)

+ 7 - 5
Unity/Unity.Editor.csproj

@@ -12,12 +12,15 @@
     <ProjectTypeGuids>{E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <TargetFrameworkIdentifier>.NETFramework</TargetFrameworkIdentifier>
     <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
-    <TargetFrameworkProfile></TargetFrameworkProfile>
-    <CompilerResponseFile></CompilerResponseFile>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <CompilerResponseFile>
+    </CompilerResponseFile>
     <UnityProjectType>Editor:5</UnityProjectType>
     <UnityBuildTarget>StandaloneWindows64:19</UnityBuildTarget>
     <UnityVersion>2017.1.0b8</UnityVersion>
-    <RootNamespace></RootNamespace>
+    <RootNamespace>
+    </RootNamespace>
     <LangVersion>6</LangVersion>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -164,7 +167,6 @@
     <Compile Include="Assets\Editor\BehaviorTreeEditor\NodeDesigner.cs" />
     <Compile Include="Assets\Editor\BehaviorTreeEditor\NodeExtension.cs" />
     <Compile Include="Assets\Editor\BehaviorTreeEditor\PropertyDesigner.cs" />
-    <Compile Include="Assets\Editor\BehaviorTreeEditor\RightDesigner.cs" />
     <Compile Include="Assets\Editor\EditorInit.cs" />
     <Compile Include="Assets\Editor\ExportNavmesh.cs" />
     <Compile Include="Assets\Editor\ILRuntimeEditor\ILRuntimeEditor.cs" />
@@ -266,4 +268,4 @@
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Target Name="GenerateTargetFrameworkMonikerAttribute" />
-</Project>
+</Project>

+ 3 - 1
Unity/Unity.sln.DotSettings.user

@@ -1,2 +1,4 @@
 <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
-	<s:String x:Key="/Default/CodeStyle/CodeCleanup/RecentlyUsedProfile/@EntryValue">Unity</s:String></wpf:ResourceDictionary>
+	<s:String x:Key="/Default/CodeStyle/CodeCleanup/RecentlyUsedProfile/@EntryValue">Unity</s:String>
+	<s:Boolean x:Key="/Default/Environment/OpenDocument/OpenDocumentAfterModification/@EntryValue">False</s:Boolean>
+	<s:String x:Key="/Default/Housekeeping/Layout/DialogWindows/RefactoringWizardWindow/Location/@EntryValue">247,-4</s:String></wpf:ResourceDictionary>