[Godot] Make a dynamic attribute list

Godot 3.2.3

Not much to say, just go to the code. Below is the code of a halo effect node of the game I am doing

class_name HaloList extends Node

"""面板属性"""
var halo_num: int = 1 setget set_halo_num			# 光环数量


"""私有变量"""
var property_data: Dictionary = {
    
    }					# 记录属性的数据
var property_list = []



##==============================
##		setget方法
##==============================
func set_halo_num(value) -> void:
	halo_num = max(0, value)
	property_list_changed_notify()		# 发出通知更新属性面板



##==============================
##		内置方法
##==============================
func _get_property_list() -> Array:
	var group_name: String
	property_list = [
		{
    
    name='HaloProperty', type=TYPE_NIL, usage=PROPERTY_USAGE_CATEGORY | PROPERTY_USAGE_SCRIPT_VARIABLE},
		{
    
    name='halo_num', type=TYPE_INT},
	]
	# 动态添加属性
	for i in range(halo_num):
		group_name = 'halo' + str(i) + '/'
		property_list.append({
    
    name=group_name + 'color', type=TYPE_COLOR})
		property_list.append({
    
    name=group_name + 'duration_min', type=TYPE_REAL, hint=PROPERTY_HINT_RANGE, hint_string='0.01,1,0.01,or_greater'})
		property_list.append({
    
    name=group_name + 'duration_max', type=TYPE_REAL, hint=PROPERTY_HINT_RANGE, hint_string='0.01,1,0.01,or_greater'})
		property_list.append({
    
    name=group_name + 'interval_min', type=TYPE_REAL, hint=PROPERTY_HINT_RANGE, hint_string='0.01,1,0.01,or_greater'})
		property_list.append({
    
    name=group_name + 'interval_max', type=TYPE_REAL, hint=PROPERTY_HINT_RANGE, hint_string='0.01,1,0.01,or_greater'})
		property_list.append({
    
    name=group_name + 'scale_min', type=TYPE_REAL})
		property_list.append({
    
    name=group_name + 'scale_max', type=TYPE_REAL})
		property_list.append({
    
    name=group_name + 'alpha_min', type=TYPE_REAL, hint=PROPERTY_HINT_RANGE, hint_string='0,1,0.01'})
		property_list.append({
    
    name=group_name + 'alpha_max', type=TYPE_REAL, hint=PROPERTY_HINT_RANGE, hint_string='0,1,0.01'})
	property_data = {
    
    }
	return property_list


#>>>> 记录数据(如果不做下面的步骤,每次开始游戏的时候,预先设置好的属性就会重新变成默认值)
func _set(property: String, value) -> bool:
	if property.begins_with('halo'):
		property_data[property] = value
	return true


func _get(property: String):
	if property.begins_with('halo'):
		if property_data.has(property):
			return property_data[property]
		else:
			return null
	return true

OK, done.

Guess you like

Origin blog.csdn.net/qq_37280924/article/details/108390773