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

Godot 3.4.4

我使用 Godot 制作应用程序所用到的功能,对一些需要用到的属性进行保存。

稍微修改也可以根据节点进行对一些游戏节点的数据的保存功能,思路都是一样的。

SAVE_PROPERTY_LIST 常量用于判断节点是否包含其中的属性,如果存在,则保存节点的这个属性的数据。

注意下面 _ready 方法里的 if child is Control: 做了只对 Control 进行保存的限制,删除即可对全部节点进行保存。

## 保存整个场景中的节点的信息
class_name SaveSceneControlNodeData
extends Node


## 要保存的属性(如果节点存在这个属性名,则保存这个数据)
const SAVE_PROPERTY_LIST : Array = ['text', 'pressed', "split_offset"]


# 树中的节点的数据
var _tree_node_data : Dictionary = {}


var _directory : Directory = Directory.new()
var _file : File = File.new()


func _enter_tree():
	load_data()
	owner.connect("tree_exiting", self, "save_data")


func _ready():
	# 场景中的所有子节点在退出节点进行保存数据
	var list = []
	__all_children__(owner, list)
	for child in list:
		# 这里我限制了只对 Control 类型的节点的数据进行保存
		if child is Control:
			child.connect("tree_exiting", self, "__save_node_data__", [
				child, child.get_path(), _tree_node_data
			])


## 加载保存的数据
func load_data():
	var save_filename = get_save_filename()
	if _file.file_exists(save_filename):
		if _file.open(save_filename, File.READ) == OK:
			var content : String = _file.get_as_text()
			_file.close()
			
			var saved_data = parse_json(content)
			if saved_data:
				# 将属性设置到对应节点
				for path in saved_data:
					var node : Node = get_node(path)
					var p_data : Dictionary = saved_data[path]
					for property in p_data:
						node.set(property, p_data[property])
			
		else:
			print("打开 ", save_filename, " 文件失败")


## 保存数据
func save_data():
	var f = get_save_filename()
	print("准备保存文件:", f)
	if _file.open(f, File.WRITE) == OK:
		_file.store_string( to_json(_tree_node_data) )
		_file.close()
		print("保存 ", f, " 文件成功")
	else:
		print("保存失败")


## 获取保存的文件的路径
##(根据当前的场景路径,保存到这个场景的目录下,格式为:名称.json)
func get_save_filename():
	# 保存到的目录
	var save_to_path = owner.filename.get_base_dir()
	if not _directory.dir_exists(save_to_path):
		save_to_path = "res://"
	# 文件名
	var fname = owner.filename.get_file().get_basename()
	if fname == "":
		fname = 'scene_control_node_data'
	
	# 完整文件路径
	save_to_path = save_to_path.plus_file(fname) + '.json'
	return save_to_path


# 递归获取所有的节点
func __all_children__(parent: Node, list: Array):
	for child in parent.get_children():
		list.append(child)
	for child in parent.get_children():
		__all_children__(child, list)


# 记录这个节点的数据
func __save_node_data__(node: Node, node_path: NodePath, data: Dictionary):
	# 获取这个节点中包含的属性的数据
	var current_data = {}
	for property in SAVE_PROPERTY_LIST:
		if property in node:
			current_data[property] = node[property]
	
	if current_data.size() > 0:
		# 根据节点路径记录数据
		data[node_path] = current_data

添加节点到场景中,默认节点都是没有任何内容的,运行后修改节点的属性,然后关闭再打开,即可看到节点存在了内容,对制作应用程序来说很方便。
在这里插入图片描述

<think>嗯,用户想知道如何在Godot引擎中调整AnimatedSprite2D节点的颜色属性。首先,我需要回忆一下Godot中的节点结构。AnimatedSprite2D是用于播放动画的,但颜色调整可能不在这个节点本身,而是通过父节点或子节点属性来实现。 记得在Godot中,控制颜色通常使用CanvasItem的属性,比如modulate。所有继承自CanvasItem的节点都有这个属性,包括AnimatedSprite2D。所以直接设置modulate应该可以改变颜色。不过用户可能不知道这点,需要详细说明步骤。 另外,用户可能需要动态调整颜色,比如通过代码或者动画播放器。这时候可能需要使用AnimationPlayer节点,在动画轨道中修改modulate属性。同时,确保用户了解如何在检查器中找到modulate,并调整其值。 还要考虑用户是否想对不同的动画应用不同的颜色。这时候可能需要为每个动画状态设置不同的modulate值,可能涉及状态机的使用,比如结合AnimationTree。不过引用中提到的AnimationTree主要是用于状态机管理,而颜色调整可能更直接。 另外,检查是否有相关的引用内容。用户提供的引用[1]提到AnimationTree用于动画状态机,引用[2]提到Sprite2D使用Texture。虽然AnimatedSprite2D本身可能有不同的设置,但modulate属性应该是通用的。 可能需要分步骤说明:在检查器中调整、通过代码动态修改、使用动画系统控制。这样用户可以根据需求选择方法。同时提醒注意事项,比如颜色叠加的效果和透明度的影响。 最后,确保回答结构清晰,步骤正确,并验证方法的正确性。比如,在Godot 4.0中,modulate属性是否仍然有效,是否有其他替代方法。可能需要建议用户测试不同的混合模式或使用Shader进行高级效果。</think>在Godot引擎中调整AnimatedSprite2D节点的颜色属性,可以通过以下三种方法实现: ### 一、通过检查器直接调整 1. 选中场景中的AnimatedSprite2D节点 2. 在右侧检查器中找到"CanvasItem"分类下的`modulate`属性 3. 点击颜色框选择预设颜色,或手动调整RGBA通道值 4. 调整后的颜色会立即作用于所有动画帧[^1] ### 二、通过代码动态修改 ```gdscript # 设置纯红色(RGBA值范围0-1) $AnimatedSprite2D.modulate = Color(1, 0, 0, 1) # 半透明的蓝色 $AnimatedSprite2D.modulate = Color(0, 0, 1, 0.5) # 渐变效果示例 func _process(delta): var hue = sin(Time.get_ticks_msec() * 0.001) * 0.5 + 0.5 $AnimatedSprite2D.modulate = Color.from_hsv(hue, 1, 1) ``` ### 三、使用动画系统控制 1. 为节点添加AnimationPlayer子节点 2. 创建新动画轨道,选择AnimatedSprite2D的`modulate`属性 3. 插入关键帧制作颜色过渡动画 4. 通过AnimationTree实现状态机控制(进阶用法)[^1] **注意事项:** 1. 颜色会与原始纹理颜色进行相乘混合 2. 透明度通道会影响最终渲染效果 3. 对SpriteFrames中的所有动画帧同时生效 4. 需要特殊效果时可结合Shader使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值