Skip to content

Dynamic Port List

Thor Brigsted edited this page May 30, 2019 · 8 revisions

Warning: Dynamic port lists are experimental. Expect bugs in the editor.

What?

Dynamic port lists are not a class or a type in itself. It is an editor-only convenience functionality that helps you maintain a list of dynamic ports.

image

How?

You can create them in two ways, either by setting the parameter in the Input/Output attribute [Output(dynamicPortList = true)] or through a custom node editor using the method NodeEditorGUILayout.DynamicPortList

Using a list or array as backing field type, the list will assign an editable value for each port. Non-array fields will still work but won't have a backing value per port.

public class SimpleNode : Node {
    [Output(dynamicPortList = true)] public float[] myArray;
}

Getting the ports

Ports created by DynamicPortList are named in the pattern [fieldName][space][index] eg. "myArray 0" for the first port. You can access them through GetPort("myArray 0").

Customize dynamic port lists

You may want to customize the way the list is drawn. You can do this by modifying the list delegates after the list is created, by manually drawing the list in a custom NodeEditor with the method NodeEditorGUILayout.DynamicPortList which takes an Action onCreation parameter

public class MyNodeEditor : NodeEditor {
    public override void OnBodyGUI() {
        // Draw GUI
        NodeEditorGUILayout.DynamicPortList("myFloatList", typeof(float), serializedObject, NodePort.IO.Input, Node.ConnectionType.Override, OnCreateReorderableList);
    }

    void OnCreateReorderableList(ReorderableList list) {
        // Override drawHeaderCallback to display node's name instead
        list.drawHeaderCallback = (Rect rect) => {
            string title = serializedObject.targetObject;
            EditorGUI.Label(rect, title);
        };
    }
}

See also: [Input-Output]

Clone this wiki locally