Godot动态的属性列表 示例

Posted 张学徒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Godot动态的属性列表 示例相关的知识,希望对你有一定的参考价值。

Godot 3.3.2

动态的属性列表

先看效果(注意右边的属性面板):
在这里插入图片描述

代码如下:

tool
extends Node2D


var script_count = 0 setget set_script_count

## 面板属性列表
var __script_list = []
## 自定义属性修改的数据
var __script_data = {}


func set_script_count(value):
	# script_count 值跟上次相差多少
	var diff = value - script_count
	
	# 超过上次的值,则增加属性
	if diff > 0:
		var property = ""
		for i in diff:
			# 属性名为 script + 动态的属性的个数
			property = "script_" + str(__script_list.size())
			
			__script_list.push_back({
				name = property,	# 属性名
				type = TYPE_OBJECT,	# 属性是个对象
				hint = PROPERTY_HINT_RESOURCE_TYPE,	# 资源
				hint_string = "GDScript",	# 类型为 GDScript
			})
	
	# 比上次的小,则减少属性
	elif diff < 0:
		var idx = -1
		for i in abs(diff):
			idx = __script_list.size() - 1
			__script_list.remove(idx);
	
	script_count = value
	
	# 更新属性表
	property_list_changed_notify()


func _get_property_list():
	# 属性列表
	var p_list = []
	# 属性类别
	p_list.append({
		name = "Script List",
		type = TYPE_NIL,
		usage = PROPERTY_USAGE_CATEGORY,
	})
	# 属性:脚本数量
	p_list.append({
		name = "script_count",
		type = TYPE_INT,
		hint = PROPERTY_HINT_RANGE,
		hint_string = "0, 10, 1, or_greater"
	})
	# 属性:脚本列表
	p_list.append({
		name="_list",
		type = TYPE_NIL,
		usage = PROPERTY_USAGE_GROUP,
	})
	p_list.append_array(__script_list)
	
	return p_list


func _set(property, value):
	# 记录属性数据
	__script_data[property] = value


func _get(property):
	# 返回属性数据
	if __script_data.has(property):
		return __script_data[property]

如果我们想获取这个节点的这个属性,比如这个节点的名字为 Node,则可以进行如下操作

func _ready():
	var n = $Node
	var s = n.get(script_0) as GDScript  # 获取节点的这个属性
	if s:
		s.reload()	  # 加载这个脚本,如果不加载的话,这个脚本只是一个 Resource 类型的文件,没有功能
		print(s.new())	# 创建一个新的这个脚本对象实例

以上是关于Godot动态的属性列表 示例的主要内容,如果未能解决你的问题,请参考以下文章

Godot组合键的实现

text 在Godot Engine的应用程序购买中:示例

Godot C# 在后台运行

Godot保存当前场景中所有的子节点的属性

Godot保存当前场景中所有的子节点的属性

Godot保存当前场景中所有的子节点的属性