public MyBehaviorTree TryGetBehaviorTreeForBot(IMyBot bot) { BTData data = null; this.m_BTDataByName.TryGetValue(this.m_botBehaviorIds[bot], out data); return((data == null) ? null : data.BehaviorTree); }
BehaviourNodeGUI NewNode(BTData data) { BehaviourMeta meta = BehaviourModuleManager.GetOrNewInstance().FindBTMeta(data.m_Type, data.m_Name); if (meta == null || (meta.NodeType != EBTNodeType.task && meta.NodeType != EBTNodeType.controller)) { return(null); } BehaviourNodeGUI bnode = new BehaviourNodeGUI(this); bnode.Self = new BehaviourNodeGUI.Decorator(data.m_Id, meta); bnode.Self.ParseData(data.m_JsonData); if (data.m_Services != null) { for (int i = 0; i < data.m_Services.Length; i++) { BTData serv = BehaviourAsset.GetDataById(data.m_Services[i]); if (serv == null) { continue; } BehaviourMeta bm = BehaviourModuleManager.GetOrNewInstance().FindBTMeta(EBTNodeType.service, serv.m_Name); if (bm != null) { BehaviourNodeGUI.Decorator decor = new BehaviourNodeGUI.Decorator(serv.m_Id, bm); decor.ParseData(serv.m_JsonData); bnode.services.Add(decor); } } } if (data.m_Conditions != null) { for (int i = 0; i < data.m_Conditions.Length; i++) { BTData cond = BehaviourAsset.GetDataById(data.m_Conditions[i]); if (cond == null) { continue; } BehaviourMeta bm = BehaviourModuleManager.GetOrNewInstance().FindBTMeta(EBTNodeType.condition, cond.m_Name); if (bm != null) { BehaviourNodeGUI.Decorator decor = new BehaviourNodeGUI.Decorator(cond.m_Id, bm); decor.NotFlag = cond.m_NotFlag; decor.ParseData(cond.m_JsonData); bnode.conditions.Add(decor); } } } Rect r = new Rect(); r.size = bnode.CalculateLocalSize(); r.position = data.m_Pos - Vector2.right * r.size.x * 0.5f; bnode.LocalRect = r; return(bnode); }
void ImportTreeData() { for (int i = 0; i < BehaviourAsset.m_Datas.Length; i++) { BehaviourNodeGUI node = NewNode(BehaviourAsset.m_Datas[i]); if (node != null) { TreeGraph.AddNode(node); TreeCanvas.AddElement(node); } } int id = 0; FilterDelegate <PaintElement> filter = (x) => { BehaviourNodeGUI bx = x as BehaviourNodeGUI; return(bx != null && bx.Self.BTId == id); }; for (int i = 0; i < BehaviourAsset.m_Datas.Length; i++) { BTData data = BehaviourAsset.m_Datas[i]; id = data.m_Id; BehaviourNodeGUI gnode = TreeGraph.FindNode(filter) as BehaviourNodeGUI; if (gnode == null) { continue; } int len = data.m_Children == null ? 0 : data.m_Children.Length; for (int j = 0; j < len; j++) { id = data.m_Children[j]; BehaviourNodeGUI gchild = TreeGraph.FindNode(filter) as BehaviourNodeGUI; if (gchild != null) { TreeGraph.AddPath(0, gnode, gchild); } } } id = BehaviourAsset.m_RootNodeId; BehaviourNodeGUI root = TreeGraph.FindNode(filter) as BehaviourNodeGUI; if (root != null) { TreeGraph.AddPath(0, mRootGUI, root); } for (int i = 0; i < BehaviourAsset.m_Comments.Length; i++) { BehaviourCommentGUI comment = new BehaviourCommentGUI(this); comment.Comment = BehaviourAsset.m_Comments[i].m_Comment; comment.LocalRect = BehaviourAsset.m_Comments[i].m_Rect; CommentCanvas.AddElement(comment); } }
public MyBehaviorTree TryGetBehaviorTreeForBot(IMyBot bot) { BTData data = null; m_BTDataByName.TryGetValue(m_botBehaviorIds[bot], out data); if (data != null) { return(data.BehaviorTree); } Debug.Assert(false, "Behavior not found"); return(null); }
private bool BuildBehaviorTree(MyBehaviorDefinition behaviorDefinition) { if (this.m_BTDataByName.ContainsKey(behaviorDefinition.Id.SubtypeId)) { return(false); } MyBehaviorTree behaviorTree = new MyBehaviorTree(behaviorDefinition); behaviorTree.Construct(); BTData data = new BTData(behaviorTree); this.m_BTDataByName.Add(behaviorDefinition.Id.SubtypeId, data); return(true); }
public BTNodeBase Instantiate(BehaviourTreeRunner btree, BehaviourTreeAsset asset) { BTNodeBase node = null; if (m_Type == EBTNodeType.task) { node = new BTTask(m_Id, BehaviourLibrary.NewTask(m_Name, m_Id)); } else if (m_Type == EBTNodeType.controller) { node = BehaviourLibrary.NewController(m_Name, m_Id); } if (node != null) { node.InitData(btree, m_JsonData); node.InitDecoratorSize(m_Conditions == null ? 0 : m_Conditions.Length, m_Children == null ? 0 : m_Children.Length, m_Services == null ? 0 : m_Services.Length); for (int i = 0; i < node.ConditionLength; i++) { BTData data = asset.GetDataById(m_Conditions[i]); if (data == null) { continue; } node.SetNotFlag(i, data.m_NotFlag); BTConditionBase cond = BehaviourLibrary.NewCondition(data.m_Name, data.m_Id); if (cond != null) { cond.OnInitData(btree, data.m_JsonData); node.SetCondition(i, cond); } } for (int i = 0; i < node.ServiceLength; i++) { BTData data = asset.GetDataById(m_Services[i]); if (data == null) { continue; } BTServiceBase serv = BehaviourLibrary.NewService(data.m_Name, data.m_Id); if (serv != null) { serv.OnInitData(btree, data.m_JsonData); node.SetService(i, serv); } } } return(node); }
void ExportTreeData() { List <BTData> nodes = new List <BTData>(); List <PaintElement> children = new List <PaintElement>(); int rootId = 0; for (int i = 0; i < TreeCanvas.ElementCount; i++) { BehaviourNodeGUI bnode = TreeCanvas.GetElement <BehaviourNodeGUI>(i); if (bnode == null) { continue; } if (TreeGraph.GetParent(0, bnode) == mRootGUI) { rootId = bnode.Self.BTId; } BTData data = bnode.ExportNodeData(nodes); children.Clear(); TreeGraph.GetAllChildren(0, bnode, children); GlobalUtil.Sort(children, (x, y) => x.LocalRect.center.x <= y.LocalRect.center.x ? -1 : 1); data.m_Children = new int[children.Count]; for (int j = 0; j < children.Count; j++) { BehaviourNodeGUI child = children[j] as BehaviourNodeGUI; data.m_Children[j] = child == null ? 0 : child.Self.BTId; } } BehaviourAsset.m_RootNodeId = rootId; GlobalUtil.Sort(nodes, (x, y) => x.m_Id - y.m_Id); BehaviourAsset.m_Datas = nodes.ToArray(); BehaviourAsset.m_Sorted = true; BehaviourTreeAsset.Comment[] comments = new BehaviourTreeAsset.Comment[CommentCanvas.ElementCount]; for (int i = 0; i < comments.Length; i++) { comments[i] = new BehaviourTreeAsset.Comment(); BehaviourCommentGUI com = CommentCanvas.GetElement <BehaviourCommentGUI>(i); if (com != null) { comments[i].m_Rect = com.LocalRect; comments[i].m_Comment = com.Comment ?? ""; } } BehaviourAsset.m_Comments = comments; EditorUtility.SetDirty(BehaviourAsset); }
private bool BuildBehaviorTree(MyBehaviorDefinition behaviorDefinition) { Debug.Assert(!m_BTDataByName.ContainsKey(behaviorDefinition.Id.SubtypeId), "Tree with given behavior definition already exists."); if (m_BTDataByName.ContainsKey(behaviorDefinition.Id.SubtypeId)) { return(false); } MyBehaviorTree newInstance = new MyBehaviorTree(behaviorDefinition); newInstance.Construct(); BTData behaviorTreeData = new BTData(newInstance); m_BTDataByName.Add(behaviorDefinition.Id.SubtypeId, behaviorTreeData); return(true); }
BTNodeBase InstBTNode(BehaviourTreeRunner btree, BTData info) { BTNodeBase node = info.Instantiate(btree, this); if (node != null) { for (int i = 0; i < info.m_Children.Length; i++) { BTData child = GetDataById(info.m_Children[i]); if (child != null) { BTNodeBase cnode = InstBTNode(btree, child); node.SetChild(i, cnode); } } } return(node); }
/// <summary> /// 构造行为树 /// </summary> /// <param name="runner"></param> /// <returns></returns> public BTNodeBase CreateBehaviourTree(BehaviourTreeRunner runner) { BTData root = GetDataById(m_RootNodeId); if (root == null) { return(null); } try { BTNodeBase rootNode = InstBTNode(runner, root); return(rootNode); } catch (System.Exception e) { Debug.LogError(e, this); return(null); } }