public void InitWith(BehaviourTreeRunner runner) { if (EditorApplication.isPlaying) { BindBehaviourTreeEvent(false); } ContextMenu.Hide(); Runner = runner; BehaviourAsset = Runner == null ? (Selection.activeObject as BehaviourTreeAsset) : Runner.SourceAsset; TreeCanvas.ClearElements(); CommentCanvas.ClearElements(); TreeGraph.Clear(); mRootGUI = new BehaviourRootGUI(this); mRootGUI.UpdateLocalData(); TreeCanvas.AddElement(mRootGUI); TreeGraph.AddNode(mRootGUI); if (BehaviourAsset != null) { ImportTreeData(); } ResetIdCounter(); RebuildExecutionOrder(); UpdateStateInfo(); if (EditorApplication.isPlaying) { BindBehaviourTreeEvent(true); } }
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); } }
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); }
public void SelectComment(BehaviourCommentGUI target, bool multiselect) { for (int i = 0; i < CommentCanvas.ElementCount; i++) { BehaviourCommentGUI com = CommentCanvas.GetElement <BehaviourCommentGUI>(i); if (com == null) { continue; } if (com == target) { com.IsSelected = true; } else if (!multiselect) { com.IsSelected = false; } } }
bool OnGraphKeyUp(KeyCode key) { if (IsPlaying) { return(false); } if (key == KeyCode.Delete) { List <BehaviourNodeGUI> nodes = new List <BehaviourNodeGUI>(); EditNodes((x) => { if (x.IsSelected) { nodes.Add(x); } }); for (int i = 0; i < nodes.Count; i++) { TreeCanvas.RemoveElement(nodes[i]); TreeGraph.RemoveNode(nodes[i]); } return(true); } if (key == KeyCode.C) { float w = Mathf.Abs(SelectionRect.GlobalRect.width); float dx = SelectionRect.GlobalRect.width < 0 ? -w : 0; float h = Mathf.Abs(SelectionRect.GlobalRect.height); float dy = SelectionRect.GlobalRect.height < 0 ? -h : 0; if (w > 40 && h > 30) { Rect rect = new Rect(SelectionRect.GlobalRect.xMin + dx, SelectionRect.GlobalRect.yMin + dy, w, h); BehaviourCommentGUI comment = new BehaviourCommentGUI(this); comment.LocalRect = CommentCanvas.CalculateLocalRect(rect); CommentCanvas.AddElement(comment); SelectNodes((x) => false); } } return(false); }