-
-
Save belzecue/5a4ed71e30ea9b0edad103ff6abc0d29 to your computer and use it in GitHub Desktop.
_get_property_list example usage to populate an enum dropdown in the inspector based on dynamic array values
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@tool | |
class_name MaterialSelector | |
extends Node3D | |
############################## | |
## EXPORT VARIABLES | |
############################## | |
@export var mesh: MeshInstance3D | |
@export var materials: Array[Material] = []: | |
set(value): | |
materials = value | |
_validate_material(get("material_index")) | |
notify_property_list_changed() | |
############################## | |
## VARIABLES | |
############################## | |
var material: Material: | |
set(value): | |
material = value | |
if mesh: | |
mesh.set_surface_override_material(0, material) | |
############################## | |
## BUILT-IN METHODS | |
############################## | |
func _get_property_list(): | |
if materials.size() == 0: | |
return [] | |
var material_names: Array[String] = [] | |
for mat in materials: | |
if not mat: | |
continue | |
var mat_name = mat.resource_path.split("/")[-1].split(".")[0] | |
material_names.append(mat_name) | |
return [ | |
{ | |
"name": "material_index", | |
"type": TYPE_INT, | |
"hint": PROPERTY_HINT_ENUM, | |
"hint_string": ",".join(PackedStringArray(material_names)) | |
} | |
] | |
func _get(property): | |
if property == "material_index": | |
if not material: | |
return 0 | |
return materials.find(material) | |
func _set(property, value): | |
if property == "material_index" and value >= 0: | |
_validate_material(value) | |
return true | |
return false | |
############################## | |
## PRIVATE METHODS | |
############################## | |
func _validate_material(material_index: int): | |
if materials.size() == 0: | |
material = null | |
return | |
if material_index >= materials.size(): | |
material = materials[0] | |
return | |
material = materials[material_index] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment