Maze / Library /PackageCache /com.unity.visualscripting@1.8.0 /Documentation~ /vs-create-custom-node-attributes-reference.md
| # Custom C# node attributes reference | |
| You can add attributes to a node class and port variable definitions to customize the look of a Custom C# node. | |
| ## Node class attributes | |
| You can customize the titles that appear on a node, where it appears in the fuzzy finder, and its icon. Node class attributes must be placed above the node class definition in a node's C# script. | |
| Visual Scripting has 5 node class attributes: | |
| - [UnitTitle](#unittitle) | |
| - [UnitShortTitle](#unitshorttitle) | |
| - [UnitSubtitle](#unitsubtitle) | |
| - [UnitCategory](#unitcategory) | |
| - [TypeIcon](#typeicon) | |
| Usually, Visual Scripting automatically applies any changes you make to a node's class attributes after you save the C# file. | |
| ### UnitTitle | |
|  | |
| You can specify a `[UnitTitle]` to display a different title than the node's class name on the node when it appears in a Script Graph, and when you view details about the node in the Graph Inspector: | |
| ```C# | |
| using System; | |
| using Unity.VisualScripting; | |
| using UnityEngine; | |
| [UnitTitle("My New Title")] | |
| public class MyNodeAfter : Unit | |
| { | |
| ... | |
| } | |
| } | |
| ``` | |
| The `[UnitTitle]` attribute overrides the node's class name. | |
| ### UnitShortTitle | |
|  | |
| You can specify a `[UnitShortTitle]` to display a different title on the node when it appears in a Script Graph: | |
| ```C# | |
| using System; | |
| using Unity.VisualScripting; | |
| using UnityEngine; | |
| [UnitShortTitle("Short Title")] | |
| [UnitTitle("My New Title")] | |
| public class MyNodeAfter : Unit | |
| { | |
| ... | |
| } | |
| } | |
| ``` | |
| The `[UnitShortTitle]` only appears on the node in a Script Graph. The `[UnitTitle]` or node class name still displays in the Graph Inspector. | |
| ### UnitSubtitle | |
|  | |
| You can add a `[UnitSubtitle]` to add a line of text below the `[UnitTitle]`, `[UnitShortTitle]`, or node class name when a node appears in a Script Graph: | |
| ```C# | |
| using System; | |
| using Unity.VisualScripting; | |
| using UnityEngine; | |
| [UnitSubtitle("It's a subtitle!")] | |
| [UnitShortTitle("Short Title")] | |
| [UnitTitle("My New Title")] | |
| public class MyNodeAfter : Unit | |
| { | |
| ... | |
| } | |
| } | |
| ``` | |
| The `[UnitSubtitle]` doesn't appear in the Graph Inspector. | |
| ### UnitCategory | |
|  | |
| You can specify a `[UnitCategory]` to tell Visual Scripting where to place the node in the fuzzy finder: | |
| ```C# | |
| using System; | |
| using Unity.VisualScripting; | |
| using UnityEngine; | |
| [UnitCategory("FirstLevel/SecondLevel")] | |
| public class MyNodeAfter : Unit | |
| { | |
| ... | |
| } | |
| } | |
| ``` | |
| Replace `FirstLevel` with the name of the top-level category in the fuzzy finder where you want Visual Scripting to place the node. Replace `SecondLevel` with the name of a subcategory. Visual Scripting creates the categories if they don't already exist in the fuzzy finder. | |
| > [!NOTE] | |
| > You must [regenerate your Node Library](vs-configuration.md) for changes made to a node's `[UnitCategory]` to take effect. | |
| ### TypeIcon | |
|  | |
| You can use the `[TypeIcon]` attribute to change the icon that appears on a node when it appears in a Script Graph: | |
| ```C# | |
| using System; | |
| using Unity.VisualScripting; | |
| using UnityEngine; | |
| [TypeIcon(typeof(ToggleValue))] | |
| public class MyNodeAfter : Unit | |
| { | |
| ... | |
| } | |
| } | |
| ``` | |
| The icon for the node changes in the Graph Inspector, too. | |
| > [!NOTE] | |
| > You can't point to your own custom icons from this attribute. You must use an icon from the Visual Scripting icons library, which includes all Unity types. | |
| ## Port attributes | |
| Custom nodes have one mandatory port attribute and one optional port attribute: [DoNotSerialize](#donotserialize) and [PortLabelHidden](#portlabelhidden), respectively. Port attributes must be placed above your variable declarations for each port variable in the node. | |
| Visual Scripting automatically applies any changes you make to a node's port attributes after you save the script file. | |
| ### DoNotSerialize | |
| `[DoNotSerialize]` is a mandatory attribute for all ports on custom nodes. Add this attribute to avoid serialization of data that shouldn't be serialized: | |
| ```C# | |
| using System; | |
| using Unity.VisualScripting; | |
| using UnityEngine; | |
| [UnitShortTitle("Short Title")] | |
| [UnitTitle("My New Title")] | |
| [UnitCategory("My Nodes")] | |
| [UnitSubtitle("It's a subtitle!")] | |
| [TypeIcon(typeof(Color))] | |
| public class MyNodeAfter : Unit | |
| { | |
| [DoNotSerialize] | |
| public ControlInput inputTrigger; | |
| [DoNotSerialize] | |
| public ControlOutput outputTrigger; | |
| [DoNotSerialize] | |
| public ValueInput myValueA; | |
| [DoNotSerialize] | |
| public ValueInput myValueB; | |
| [DoNotSerialize] | |
| public ValueOutput result; | |
| private string resultValue; | |
| protected override void Definition() | |
| { | |
| ... | |
| } | |
| } | |
| ``` | |
| ### PortLabelHidden | |
|  | |
| You can add the `[PortLabelHidden]` attribute to hide the name label for any port on a node when it appears in a Script Graph: | |
| ```C# | |
| using System; | |
| using Unity.VisualScripting; | |
| using UnityEngine; | |
| [UnitShortTitle("Short Title")] | |
| [UnitTitle("My New Title")] | |
| [UnitCategory("My Nodes")] | |
| [UnitSubtitle("It's a subtitle!")] | |
| [TypeIcon(typeof(Color))] | |
| public class MyNodeAfter : Unit | |
| { | |
| [DoNotSerialize] | |
| [PortLabelHidden] | |
| public ControlInput inputTrigger; | |
| [DoNotSerialize] | |
| [PortLabelHidden] | |
| public ControlOutput outputTrigger; | |
| [DoNotSerialize] | |
| public ValueInput myValueA; | |
| [DoNotSerialize] | |
| public ValueInput myValueB; | |
| [DoNotSerialize] | |
| public ValueOutput result; | |
| private string resultValue; | |
| protected override void Definition() | |
| { | |
| ... | |
| } | |
| } | |
| ``` | |
| The port's label is still visible in the Graph Inspector. Use the same name in a port's variable definition and the port's key in the `Definition` method for the node's class, as shown: | |
| ```C# | |
| using System; | |
| using Unity.VisualScripting; | |
| using UnityEngine; | |
| public class MyNode : Unit | |
| { | |
| ... | |
| [DoNotSerialize, PortLabelHidden] | |
| public ValueInput myValueA; | |
| [DoNotSerialize, PortLabelHidden] | |
| public ValueInput myValueB; | |
| ... | |
| protected override void Definition() | |
| { | |
| ... | |
| myValueA = ValueInput<string>("myValueA", "Hello "); | |
| myValueB = ValueInput<string>("myValueB", String.Empty); | |
| ... | |
| } | |
| } | |
| ``` |