private static BehaviorNodeConfig CreateNodeConfig(this BehaviorTreeConfig treeConfig, string name) { NodeMeta proto = BTEditor.Instance.GetComponent <BTNodeInfoComponent>().GetNodeMeta(name); GameObject go = new GameObject() { name = name }; go.transform.parent = treeConfig.gameObject.transform; BehaviorNodeConfig node = go.AddComponent <BehaviorNodeConfig>(); node.name = name; node.describe = proto.describe; foreach (NodeFieldDesc args in proto.new_args_desc) { Type type = BTTypeManager.GetBTType(args.type); UnityEngine.Component comp = go.AddComponent(type); FieldInfo info = type.GetField("fieldName"); info.SetValue(comp, args.name); FieldInfo info1 = type.GetField("fieldValue"); info1.SetValue(comp, args.value); } return(node); }
public static BehaviorNodeConfig AddChild(this BehaviorTreeConfig treeConfig, BehaviorNodeConfig parent, string name) { BehaviorNodeConfig child = treeConfig.CreateNodeConfig(name); AddChild(treeConfig, parent, child); return(child); }
public static void Serialize(this Node root, BehaviorTreeConfig config) { config.Clear(); BehaviorNodeConfig rootNp = config.AddRootNode(root.GetType().Name); Queue <Node> queue = new Queue <Node>(); Queue <BehaviorNodeConfig> npQue = new Queue <BehaviorNodeConfig>(); rootNp.describe = root.Description; queue.Enqueue(root); npQue.Enqueue(rootNp); while (queue.Count > 0) { Node cur = queue.Dequeue(); BehaviorNodeConfig np = npQue.Dequeue(); foreach (Node child in cur.GetChildren) { BehaviorNodeConfig childNp = GetNodeConfigFromNode(child); queue.Enqueue(child); npQue.Enqueue(childNp); config.AddChild(np, childNp); } } // PrintNode(root); // PrintConfigNode(config.RootNodeConfig); }
public static BehaviourTreeNodeProxy <T> AddNodeToLast <T>(BehaviorTreeConfig tree) where T : Node { BehaviorNodeConfig parent = tree.RootNodeConfig; string name = typeof(T).Name; BehaviorNodeConfig p = tree.AddChild(parent, name); BehaviourTreeNodeProxy <T> proxy = new BehaviourTreeNodeProxy <T>(p.ToNodeProto()); return(proxy); }
public static BehaviorNodeConfig AddRootNode(this BehaviorTreeConfig treeConfig, string rootName) { BehaviorNodeConfig go = treeConfig.CreateNodeConfig(rootName); treeConfig.RootNodeConfig = go.GetComponent <BehaviorNodeConfig>(); treeConfig.RootNodeConfig.id = BTEditor.NodeIdStartIndex; go.gameObject.name = rootName; return(go); }
public BehaviorNodeConfig BehaviorNodeDataToNodeConfig(BehaviorNodeData nodeData) { GameObject go = new GameObject(); BehaviorNodeConfig nodeConfig = go.AddComponent <BehaviorNodeConfig>(); 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()) { if (!NodeMetaHelper.NodeHasField(nodeData.Name, args.Key)) { unUseList.Add(args.Key); continue; } Type originType = NodeMetaHelper.GetFieldType(nodeData.Name, args.Key); try { string fieldName = args.Key; object fieldValue = args.Value; Type type = BTTypeManager.GetBTType(originType); Component comp = go.AddComponent(type); FieldInfo fieldNameInfo = type.GetField("fieldName"); fieldNameInfo.SetValue(comp, fieldName); FieldInfo fieldValueinfo = type.GetField("fieldValue"); if (TypeHelper.IsEnumType(originType)) { fieldValue = fieldValue.ToString(); } fieldValueinfo.SetValue(comp, fieldValue); } catch (Exception e) { throw new Exception($"transform failed,nodeName:{nodeData.Name} fieldName:{args.Key} fieldType:{originType}", e); } } foreach (string key in unUseList) { nodeData.Args.Remove(key); } foreach (BehaviorNodeData child in nodeData.children) { BehaviorNodeConfig childConfig = this.BehaviorNodeDataToNodeConfig(child); childConfig.gameObject.transform.parent = nodeConfig.gameObject.transform; } return(nodeConfig); }
public BehaviorNodeConfig NodeDataToNodeConfig(BehaviorNodeData nodeData) { GameObject go = new GameObject(); BehaviorNodeConfig nodeConfig = go.AddComponent <BehaviorNodeConfig>(); nodeConfig.id = nodeData.nodeId; ((Object)nodeConfig).name = nodeData.name; go.name = nodeData.name; nodeConfig.describe = nodeData.describe; List <string> unUseList = new List <string>(); foreach (var args in nodeData.args_dict) { if (!ExportNodeTypeConfig.NodeHasField(nodeData.name, args.Key)) { unUseList.Add(args.Key); continue; } Type originType = ExportNodeTypeConfig.GetFieldType(nodeData.name, args.Key); try { string fieldName = args.Key; object fieldValue = args.Value.GetValueByType(originType); Type type = BTTypeManager.GetBTType(originType); Component comp = go.AddComponent(type); FieldInfo fieldNameInfo = type.GetField("fieldName"); fieldNameInfo.SetValue(comp, fieldName); FieldInfo fieldValueinfo = type.GetField("fieldValue"); if (BehaviorTreeArgsDict.IsEnumType(originType)) { fieldValue = fieldValue.ToString(); } fieldValueinfo.SetValue(comp, fieldValue); } catch (Exception 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); } foreach (var child in nodeData.children) { BehaviorNodeConfig childConfig = NodeDataToNodeConfig(child); childConfig.gameObject.transform.parent = nodeConfig.gameObject.transform; } return(nodeConfig); }
public static NodeProto ConfigToNode(BehaviorNodeConfig nodeProto) { NodeProto nodeData = new NodeProto(); 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) { BehaviorNodeConfig nodeConfig = child.gameObject.GetComponent <BehaviorNodeConfig>(); NodeProto childData = ConfigToNode(nodeConfig); nodeData.children.Add(childData); } return(nodeData); }
public BehaviorNodeData NodeConfigToNodeData(BehaviorNodeConfig nodeProto) { BehaviorNodeData nodeData = new BehaviorNodeData() { Id = nodeProto.id, Name = nodeProto.name, Desc = nodeProto.describe, Args = nodeProto.GetArgsDict(), children = new List <BehaviorNodeData>() }; foreach (Transform child in nodeProto.gameObject.transform) { BehaviorNodeConfig nodeConfig = child.gameObject.GetComponent <BehaviorNodeConfig>(); BehaviorNodeData childData = NodeConfigToNodeData(nodeConfig); nodeData.children.Add(childData); } return(nodeData); }
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.children = new List <BehaviorNodeData>(); // foreach (var item in nodeData.args_dict) // { // Log.Info($"key :{item.Key} value :{item.Value}"); // } foreach (Transform child in nodeProto.gameObject.transform) { BehaviorNodeConfig nodeConfig = child.gameObject.GetComponent <BehaviorNodeConfig>(); BehaviorNodeData childData = NodeConfigToNodeData(nodeConfig); nodeData.children.Add(childData); } return(nodeData); }
public static GameObject CreateNewTree(string path, string rootNodeName, string desc = "默认行为树") { GameObject prefab = null; try { GameObject go = new GameObject(); BehaviorTreeConfig newConfig = go.AddComponent <BehaviorTreeConfig>(); BehaviorNodeConfig root = newConfig.AddRootNode(rootNodeName); prefab = PrefabUtility.CreatePrefab($"{path}/BT_{desc}.prefab", go, ReplacePrefabOptions.ReplaceNameBased); EditorUtility.SetDirty(newConfig); EditorUtility.SetDirty(prefab); Object.DestroyImmediate(go); } catch (Exception ex) { Log.Error($"创建行为树失败|{ex}"); } return(prefab); }
public static BehaviorNodeConfig ProtoToConfig(NodeProto nodeData) { GameObject go = new GameObject(); BehaviorNodeConfig nodeConfig = go.AddComponent <BehaviorNodeConfig>(); 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 = NodeMetaHelper.GetFieldType(nodeData.Name, args.Key); try { string fieldName = args.Key; object fieldValue = args.Value; Type type = BTTypeManager.GetBTType(originType); UnityEngine.Component comp = go.AddComponent(type); FieldInfo fieldNameInfo = type.GetField("fieldName"); fieldNameInfo.SetValue(comp, fieldName); FieldInfo fieldValueinfo = type.GetField("fieldValue"); if (TypeHelper.IsEnumType(originType)) { fieldValue = fieldValue.ToString(); } fieldValueinfo.SetValue(comp, fieldValue); } catch (Exception e) { throw new Exception($"transform failed,nodeName:{nodeData.Name} fieldName:{args.Key} fieldType:{originType} {e}"); } } foreach (NodeProto child in nodeData.children) { BehaviorNodeConfig childConfig = ProtoToConfig(child); childConfig.gameObject.transform.parent = nodeConfig.gameObject.transform; } return(nodeConfig); }
private static void SortBehaviorTree(BehaviorNodeConfig nodeConfig) { }
public static BehaviorNodeConfig AddChild(this BehaviorTreeConfig treeConfig, BehaviorNodeConfig parent, BehaviorNodeConfig child) { child.transform.parent = parent.transform; child.transform.SetAsLastSibling(); child.GetComponent <BehaviorNodeConfig>().id = treeConfig.RootNodeId + treeConfig.AutoId; return(child.GetComponent <BehaviorNodeConfig>()); }