Ejemplo n.º 1
0
        // 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);
        }
Ejemplo n.º 2
0
        // 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);
        }