GDScriptGodot 插件中,获取添加时的节点

Posted 张学徒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GDScriptGodot 插件中,获取添加时的节点相关的知识,希望对你有一定的参考价值。

Godot 3.3.3

如果不知道如何开发 Godot 插件,请先学习最基本的插件开发方法
官方文档:编辑器插件

我们新建一个插件:




最后点击 create 创建。

在我们创建的插件脚本里写入如下代码:

tool
extends EditorPlugin


func _enter_tree() -> void:
	# 连接场景树的 node_added 信号(节点被添加信号),连接到 _scene_node_added 方法
	get_tree().connect("node_added", self, "_scene_node_added")


func _exit_tree() -> void:
	# 插件关闭时断开信号连接
	if get_tree().is_connected("node_added", self, "_scene_node_added"):
		get_tree().disconnect("node_added", self, "_scene_node_added")


## (自定义方法) 编辑新添加的节点
func _edit_added_node(node: Node) -> void:
	pass


## 场景树节点的 node_added 信号连接调用的方法
var _yield_tree : bool = true
var _yield_node_list : Array = []
var _current_enabled : bool = true
func _scene_node_added(node: Node) -> void:
	# 如果新添加的节点中含有场景根节点
	# 则代表这次是切换了场景,则不进行添加
	if node == get_tree().edited_scene_root:
		_current_enabled = false
	
	_yield_node_list.push_back(node)
	
	# 这样做的原因是,选中节点时,属性检查器面板也会刷新添加节点
	# 这样会发出大量的信号调用这个方法
	# 所以要判断“哪个节点是新添加到场景中的节点”
	# 新添加的节点如果不等待一帧,则它的节点的 owner 属性是 null
	# 所以要 yield(get_tree(), "physics_frame") 等待一帧进行判断
	# 因为一帧调用一次这个节点就够了,防止多个节点都同时调用这个方法,
	# 所以就通过 _yield_tree 属性进行判断,
	# 这样就写成了如下代码的形式了
	if _yield_tree:
		_yield_tree = false
		yield(get_tree(), "physics_frame")
		_yield_tree = true
		
		if _current_enabled:
			for _node in _yield_node_list:
				# 判断节点的 owner (这个节点的场景根节点) 是否是当前场景的根节点
				if _node && _node.owner == get_tree().edited_scene_root:
					_edit_added_node(_node)
		
		_current_enabled = true
		_yield_node_list.clear()

这个时候,我们需要关闭插件

点击 Enable 属性关闭,然后再点一下打开

我们可以在场景中添加一个新的节点,可以看到输出面板中有这个节点的信息

以上是关于GDScriptGodot 插件中,获取添加时的节点的主要内容,如果未能解决你的问题,请参考以下文章

减少一棵树的节点数,获取具有多个子节点的节点

如何获取以派生字符开头的名称的节字符

SectionList 获取 renderSectionHeader 中的节索引

使用 Rails.ajax 和 jquery 可排序插件时的 ActionView::MissingTemplate

编写 Gradle 插件时的 Gradle Api Sources 和 Doc

如何从 java 中获取 Neo4j 图形数据库的节点数,我们可以从磁盘存储和重用 graphdb 吗?