示例#1
0
 public void DeleteConnectionPort(ConnectionPort dynamicPort)
 {
     dynamicPort?.ClearConnections();
     dynamicConnectionPorts.Remove(dynamicPort);
     DestroyImmediate(dynamicPort);
     ConnectionPortManager.UpdateRepresentativePortLists(this);
 }
示例#2
0
        public ConnectionPort CreateConnectionPort(ConnectionPortAttribute specificationAttribute)
        {
            ConnectionPort port = specificationAttribute.CreateNew(this);

            if (port == null)
            {
                return(null);
            }
            dynamicConnectionPorts.Add(port);
            ConnectionPortManager.UpdateRepresentativePortLists(this);
            return(port);
        }
示例#3
0
 //Edit to framework: (added to support inserting connection ports at an index)
 public ConnectionPort CreateConnectionPort(ConnectionPortAttribute specificationAttribute, int index)
 {
     if (index >= 0 && index <= dynamicConnectionPorts.Count)
     {
         ConnectionPort port = specificationAttribute.CreateNew(this);
         if (port == null)
         {
             return(null);
         }
         dynamicConnectionPorts.Insert(index, port);
         ConnectionPortManager.UpdateRepresentativePortLists(this);
         return(port);
     }
     return(null);
 }
示例#4
0
        /// <summary>
        /// Validates this canvas, checking for any broken nodes or references and cleans them.
        /// </summary>
        public void Validate()
        {
            NodeEditor.checkInit(false);

            // Check Groups
            CheckNodeCanvasList(ref groups, "groups");

            // Check Nodes and their connection ports
            CheckNodeCanvasList(ref nodes, "nodes");
            foreach (Node node in nodes)
            {
                ConnectionPortManager.UpdateConnectionPorts(node);
                foreach (ConnectionPort port in node.connectionPorts)
                {
                    port.Validate(node);
                }
                ConnectionPortManager.UpdatePortLists(node);
                ConnectionPortManager.UpdateRepresentativePortLists(node);
            }

            // Check EditorStates
            if (editorStates == null)
            {
                editorStates = new NodeEditorState[0];
            }
            editorStates = editorStates.Where((NodeEditorState state) => state != null).ToArray();
            foreach (NodeEditorState state in editorStates)
            {
                if (!nodes.Contains(state.selectedNode))
                {
                    state.selectedNode = null;
                }
            }

            // Validate CanvasType-specific stuff
            ValidateSelf();
        }
示例#5
0
        /// <summary>
        /// Creates a copy of the specified node at pos on the specified canvas, optionally auto-connecting the specified output to a matching input
        /// silent disables any events
        /// </summary>
        public static Node CreateCopy(Node toCopy, Vector2 pos, NodeCanvas hostCanvas, ConnectionPort connectingPort = null, bool silent = false)
        {
            if (toCopy == null || hostCanvas == null)
            {
                throw new ArgumentException();
            }
            if (!NodeCanvasManager.CheckCanvasCompability(toCopy.GetID, hostCanvas.GetType()))
            {
                throw new UnityException("Cannot create Node with ID '" + toCopy.GetID + "' as it is not compatible with the current canvas type (" + hostCanvas.GetType().ToString() + ")!");
            }
            if (!hostCanvas.CanAddNode(toCopy.GetID))
            {
                throw new UnityException("Cannot create Node with ID '" + toCopy.GetID + "' on the current canvas of type (" + hostCanvas.GetType().ToString() + ")!");
            }
            Node node = ScriptableObject.Instantiate(toCopy);

            //Clone static connection ports
            foreach (ConnectionPortDeclaration portDecl in ConnectionPortManager.GetPortDeclarationEnumerator(node, true))
            {
                ConnectionPort port = (ConnectionPort)portDecl.portField.GetValue(node);
                port = portDecl.portInfo.CreateNew(node);
                portDecl.portField.SetValue(node, port);
            }
            //Clone dynamic connection ports
            for (int i = 0; i < node.dynamicConnectionPorts.Count; ++i)
            {
                node.dynamicConnectionPorts[i]      = ScriptableObject.Instantiate(node.dynamicConnectionPorts[i]);
                node.dynamicConnectionPorts[i].body = node;
                node.dynamicConnectionPorts[i].ClearConnections();
            }
            ConnectionPortManager.UpdateRepresentativePortLists(node);
            //Clone child SOs
            System.Func <ScriptableObject, ScriptableObject> copySOs = (ScriptableObject so) => ScriptableObject.Instantiate(so);;
            node.CopyScriptableObjects(copySOs);
            if (node == null)
            {
                return(null);
            }

            // Init node state
            node.name     = node.Title;
            node.autoSize = node.DefaultSize;
            node.position = pos;
            ConnectionPortManager.UpdateConnectionPorts(node);

            if (connectingPort != null)
            { // Handle auto-connection and link the output to the first compatible input
                for (int i = 0; i < node.connectionPorts.Count; i++)
                {
                    if (node.connectionPorts[i].TryApplyConnection(connectingPort, silent))
                    {
                        break;
                    }
                }
            }

            // Add node to host canvas
            hostCanvas.nodes.Add(node);
            if (!silent)
            { // Callbacks
                hostCanvas.OnNodeChange(connectingPort != null ? connectingPort.body : node);
                NodeEditorCallbacks.IssueOnAddNode(node);
                hostCanvas.Validate();
                NodeEditor.RepaintClients();
            }

            return(node);
        }