public Edge AddChild([NotNull] AgentBehaviorTreeNode child) { Port output = InstantiatePort(Orientation.Horizontal, Direction.Output, Port.Capacity.Single, typeof(SerializedBehaviorTreeWindow.BehaviorConnection)); output.portName = "Child"; outputContainer.Add(output); return(output.ConnectTo((Port)child.inputContainer[0])); }
private void SetChildren([NotNull] List <BehaviorInfo> behaviorInfos, int index) { AgentBehaviorTreeNode node = m_nodes[index]; int level = behaviorInfos[index].level; for (int i = index + 1, count = behaviorInfos.Count; i < count; ++i) { int childLevel = behaviorInfos[i].level; if (childLevel <= level) { return; } if (childLevel - level != 1) { continue; } AgentBehaviorTreeNode childNode = m_nodes[i]; Edge edge = node.AddChild(childNode); AddElement(edge); } }
public Edge AddChild([NotNull] AgentBehaviorTreeNode node) { return(((Port)outputContainer[0]).ConnectTo((Port)node.inputContainer[0])); }
/// <summary> /// Creates <see cref="AgentBehaviorTreeGraph"/>. /// </summary> /// <param name="behaviorInfos">Infos of all behaviors of <paramref name="treeRoot"/>.</param> /// <param name="treeRoot">Tree root.</param> public AgentBehaviorTreeGraph([NotNull] List <BehaviorInfo> behaviorInfos, [NotNull] TreeRoot treeRoot) { this.treeRoot = treeRoot; SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale); var background = new GridBackground(); Insert(0, background); background.StretchToParentSize(); this.AddManipulator(new ContentDragger()); this.AddManipulator(new SelectionDragger()); this.AddManipulator(new RectangleSelector()); var minimap = new MiniMap { anchored = true }; minimap.SetPosition(new Rect(10f, 10f, 200f, 200f)); Add(minimap); var rootNode = new RootNode(); AddElement(rootNode); int behaviorCount = behaviorInfos.Count; m_nodes = new AgentBehaviorTreeNode[behaviorCount]; for (int i = 0; i < behaviorCount; ++i) { AgentBehaviorTreeNode node = m_nodes[i] = new AgentBehaviorTreeNode(behaviorInfos[i].behavior); AddElement(node); } for (int i = 0; i < behaviorCount; ++i) { SetChildren(behaviorInfos, i); } AddElement(rootNode.AddChild(m_nodes[0])); int levelCount = 0; for (int i = 0; i < behaviorCount; ++i) { levelCount = Mathf.Max(levelCount, behaviorInfos[i].level); } ++levelCount; int[] levelCounts = new int[levelCount]; for (int i = 0, count = behaviorInfos.Count; i < count; ++i) { ++levelCounts[behaviorInfos[i].level]; } int biggestLevelCount = 0; for (int i = 0, count = levelCounts.Length; i < count; ++i) { biggestLevelCount = Mathf.Max(biggestLevelCount, levelCounts[i]); } float centralY = biggestLevelCount * DefaultPlaceY / 2f; centralY = Mathf.Max(centralY, MinimalCentralY); rootNode.SetPosition(new Rect( new Vector2(OffsetX, centralY - DefaultPlaceY / 2f + OffsetY), s_defaultSize)); int[] setLevelNodes = new int[levelCount]; for (int i = 0; i < behaviorCount; ++i) { int level = behaviorInfos[i].level; float positionX = DefaultPlaceX * (level + 1) + OffsetX; float levelCentralY = levelCounts[level] * DefaultPlaceY / 2f; float levelCentralYDiff = centralY - levelCentralY; float positionY = setLevelNodes[level] * DefaultPlaceY + levelCentralYDiff + OffsetY; m_nodes[i].SetPosition(new Rect(new Vector2(positionX, positionY), s_defaultSize)); ++setLevelNodes[level]; } for (int i = 0, count = m_nodes.Length; i < count; ++i) { AgentBehaviorTreeNode node = m_nodes[i]; node.RefreshExpandedState(); node.RefreshPorts(); } rootNode.RefreshExpandedState(); rootNode.RefreshPorts(); graphViewChanged += change => { change.elementsToRemove?.Clear(); change.edgesToCreate?.Clear(); return(change); }; EditorApplication.update += Update; }