Godot 4.0.2加载自定义Resource后无法访问参数的问题
问题描述
按照教程使用Resource替代Node存储数据并附带功能,保存为.res文件无异常,但加载后资源被识别为通用Resource,访问自定义参数时触发错误:Invalid get index 'parameter_name' (on base: 'Resource'),类似视频中访问playerData.health的场景。导出变量未生效,外部打开.res文件显示编码异常或哈希内容。存读代码如下:
ResourceSaver.save(my_resource, save_path) if ResourceLoader.exists(save_path): my_newly_loaded_resource = ResourceLoader.load(save_path).duplicate(true) var new_variable = my_newly_loaded_resource.parameter_name
原因与解决方法
核心原因
直接使用通用Resource类实例存储自定义属性时,Godot序列化保存时不会保留自定义属性的类型信息,加载后只能识别为通用Resource,自然无法访问自定义参数。
具体解决方案
创建自定义Resource子类
新建一个继承自Resource的脚本(比如命名为PlayerData),在脚本内定义需要的属性并添加@export标记(确保序列化时被识别):extends Resource @export var parameter_name: int = 0 @export var health: int = 100所有需要存储的自定义参数都要在这个子类中声明。
实例化自定义Resource
保存数据时,必须使用自定义子类的实例,而不是通用Resource:var my_resource = PlayerData.new() my_resource.parameter_name = 100 ResourceSaver.save(my_resource, save_path)加载时强制类型转换
加载后需要将通用Resource转换为自定义子类类型,否则无法访问属性:if ResourceLoader.exists(save_path): # 方法1:使用as关键字转换类型 var loaded_resource = ResourceLoader.load(save_path).duplicate(true) as PlayerData # 方法2:加载时指定目标类型 var loaded_resource = ResourceLoader.load(save_path, "PlayerData").duplicate(true) # 此时可以正常访问自定义参数 var new_variable = loaded_resource.parameter_name关于.res文件的可读性
默认保存的.res是二进制序列化格式,外部打开会显示乱码,属于正常现象。如果需要可读的文本格式,保存时添加标记:ResourceSaver.save(my_resource, save_path, ResourceSaver.FLAG_SAVE_AS_TEXT)
存档方式选择
自定义Resource方式适合简单的单一数据对象存储;如果是复杂存档场景(比如多对象状态、场景节点状态),官方文档提到的JSON/二进制文件存储、PackedScene场景保存等方式会更灵活可控。
内容的提问来源于stack exchange,提问作者DotFX
相关产品推荐
相关产品推荐

