267 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			267 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								# 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);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ...
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 |