// Generate decorator node private BTEditorNode GenerateDecoratorNode(string nodeTitle, string name, Vector2 position, bool isTopNode = false, AbstractNode instance = null) { BTEditorNode node = new BTEditorNode { title = nodeTitle, nodeName = name, GUID = System.Guid.NewGuid().ToString(), nodeType = NodeTypes.Decorator, topNode = isTopNode }; // Create new instance if not loading from already existing behaviour tree if (instance != null) { node.decoratorInstance = instance as Decorator; } else { node.decoratorInstance = ScriptableObject.CreateInstance(name) as Decorator; } // Stash and remove old title and minimize button elements Label oldTitleLabel = node.titleContainer.Q <Label>("title-label"); node.titleContainer.Remove(oldTitleLabel); VisualElement oldTitleButton = node.titleContainer.Q <VisualElement>("title-button-container"); node.titleContainer.Remove(oldTitleButton); // Create and add text field for title input TextField textField = new TextField { name = string.Empty, value = node.title }; textField.RegisterValueChangedCallback(evt => node.title = evt.newValue); node.titleContainer.Add(textField); node.titleContainer.Add(oldTitleButton); // Add back minimize button in title container after adding title input field // Input/Output port node.inputContainer.Add(GeneratePort(node, Direction.Input, Port.Capacity.Multi)); node.outputContainer.Add(GeneratePort(node, Direction.Output, Port.Capacity.Multi)); // Object field for behaviour instance ObjectField objectField = new ObjectField(); objectField.objectType = typeof(ScriptableObject); objectField.value = node.decoratorInstance; node.mainContainer.Add(objectField); // Node state element Label nodeStateLabel = new Label { name = "node-state-label", text = node.decoratorInstance.NodeState.ToString() }; node.titleContainer.Add(nodeStateLabel); node.RefreshExpandedState(); node.RefreshPorts(); node.SetPosition(new Rect(position, defaultNodeSize)); return(node); }
// Generates entry point node at editor startup private BTEditorNode GenerateEntryPointNode(string nodeName) { // Instantiate new node BTEditorNode node = new BTEditorNode { title = nodeName, nodeName = "Selector", compositeInstance = (Composite)ScriptableObject.CreateInstance("Selector"), GUID = System.Guid.NewGuid().ToString(), nodeType = NodeTypes.Composite, topNode = true, }; // Stash and remove old title and minimize button elements Label oldTitleLabel = node.titleContainer.Q <Label>("title-label"); node.titleContainer.Remove(oldTitleLabel); VisualElement oldTitleButton = node.titleContainer.Q <VisualElement>("title-button-container"); node.titleContainer.Remove(oldTitleButton); // Create and add text field for title input TextField textField = new TextField { name = nodeName, value = "Top Node" }; textField.RegisterValueChangedCallback(evt => node.title = evt.newValue); node.titleContainer.Add(textField); node.titleContainer.Add(oldTitleButton); // Add back minixmize button in title container after adding title input field // Node state element Label nodeStateLabel = new Label { name = "node-state-label", text = node.compositeInstance.NodeState.ToString() }; node.titleContainer.Add(nodeStateLabel); // Instantiate add port button Button button = new Button(() => { AddPort(node); }); button.text = "New Child Behaviour"; node.titleContainer.Add(button); // Instance field ObjectField objectField = new ObjectField(); objectField.objectType = typeof(ScriptableObject); objectField.value = node.compositeInstance; node.mainContainer.Add(objectField); AddPort(node); AddPort(node); node.capabilities &= ~Capabilities.Movable; node.capabilities &= ~Capabilities.Deletable; // Refresh node node.RefreshExpandedState(); node.RefreshPorts(); node.SetPosition(new Rect(new Vector2(100, 200), defaultNodeSize)); return(node); }