-
Notifications
You must be signed in to change notification settings - Fork 0
Collection Dropdown Attribute
The [CollectionDropdown] attribute allows you to display a dropdown selection in the Unity Inspector for a non-collection field, with options populated from a collection (such as an array or list) or a method that returns a collection. This attribute helps select from predefined options in the Inspector, making field assignment more organized and user-friendly.
The [CollectionDropdown] attribute supports the following capabilities:
-
Supported Field Types: Can be applied to fields of types such as
string,int, and other primitive types, as well as custom serializable classes. -
Supported Collections: The dropdown options can be populated from any collection that implements
IEnumerable, such as arrays, lists, or even results from methods returningIEnumerable. - Method Support: You can use parameterless methods or methods with parameters to dynamically generate the collection for the dropdown options.
-
Dynamic Parameter Passing: For methods with parameters,
[CollectionDropdown]allows you to specify values for each parameter, providing flexibility in generating collections based on input values.
Note: These examples use Unity’s
[SerializeField]onprivatefields to promote encapsulation. This approach can help protect internal data from unintended access by other scripts and maintain clean, organized code. For more details, see Unity’s documentation on SerializeField.
Applying [CollectionDropdown] is straightforward. You specify the name of a collection field or method as a string in the attribute. Here’s a breakdown of the different ways to use it.
[CollectionDropdown("collectionOrMethodName")]
[SerializeField]
private FieldType fieldName;// Using a method with parameters
[CollectionDropdown("memberName", param1, param2, ...)]In this example, selectedColor is a string field that allows you to select from a predefined array of color names.
[CollectionDropdown("colors")]
[SerializeField]
private string selectedColor;
private string[] colors = { "Red", "Blue", "Green", "Yellow", "Purple", "Orange" };Result: In the Inspector, selectedColor will display a dropdown with the values from colors, allowing easy selection from the predefined list.

Here, spawnPoint is a Vector3 field that allows selection from dynamically generated spawn points by calling a parameterless method GetSpawnPoints.
[CollectionDropdown("GetSpawnPoints")]
[SerializeField]
private Vector3 spawnPoint;
private List<Vector3> GetSpawnPoints()
{
// Generate or retrieve a list of spawn points
return new List<Vector3> { new Vector3(0, 4, 2), new Vector3(5, 2, 27), new Vector3(8, 2, 5) };
}Result: The dropdown for spawnPoint in the Inspector will display the items returned by GetSpawnPoints.

In cases where you want to generate options based on specific parameters, [CollectionDropdown] can also work with methods that accept arguments. Here, selectedLevel allows selecting a level from a generated range of integers.
[CollectionDropdown("GetLevelRange", 1, 10)]
[SerializeField]
private int selectedLevel;
private int[] GetLevelRange(int start, int end)
{
// Generate a range of levels
return Enumerable.Range(start, end - start + 1).ToArray();
}Result: In the Inspector, selectedLevel will show a dropdown with integers from 1 to 10, as specified in the [CollectionDropdown] attribute.
