You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,自然无法访问自定义参数。

具体解决方案

  1. 创建自定义Resource子类
    新建一个继承自Resource的脚本(比如命名为PlayerData),在脚本内定义需要的属性并添加@export标记(确保序列化时被识别):

    extends Resource
    @export var parameter_name: int = 0
    @export var health: int = 100
    

    所有需要存储的自定义参数都要在这个子类中声明。

  2. 实例化自定义Resource
    保存数据时,必须使用自定义子类的实例,而不是通用Resource:

    var my_resource = PlayerData.new()
    my_resource.parameter_name = 100
    ResourceSaver.save(my_resource, save_path)
    
  3. 加载时强制类型转换
    加载后需要将通用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
    
  4. 关于.res文件的可读性
    默认保存的.res是二进制序列化格式,外部打开会显示乱码,属于正常现象。如果需要可读的文本格式,保存时添加标记:

    ResourceSaver.save(my_resource, save_path, ResourceSaver.FLAG_SAVE_AS_TEXT)
    

存档方式选择

自定义Resource方式适合简单的单一数据对象存储;如果是复杂存档场景(比如多对象状态、场景节点状态),官方文档提到的JSON/二进制文件存储、PackedScene场景保存等方式会更灵活可控。

内容的提问来源于stack exchange,提问作者DotFX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:40:12