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

Godot4运行时打包带脚本节点场景后加载脚本丢失问题求助

Godot4运行时打包场景后脚本丢失的解决办法

核心原因分析

  1. 运行时动态添加的脚本若不是通过文件路径引用的资源实例,而是临时生成的脚本对象,打包场景时无法被正确序列化,加载时自然找不到脚本。
  2. 提前将节点所有者设置为祖父节点,会干扰Godot场景打包时的资源依赖归属逻辑,导致脚本未被纳入场景的依赖列表。

具体解决方案

1. 确保脚本通过资源路径加载

运行时给节点赋值脚本时,必须用preload()或load()从文件加载脚本资源,禁止使用动态生成脚本的方式(这类脚本无法序列化保存)。示例代码:

# 正确方式:从文件加载脚本资源
var my_script = preload("res://Scripts/MyNodeScript.gd")
var new_node = Node2D.new()
new_node.script = my_script

2. 调整所有者设置的时机

不要在打包前设置节点所有者为祖父节点,建议先完成场景打包,加载实例后再统一设置:

# 打包场景时,暂时将节点所有者设为自身或父节点
new_node.owner = new_node.get_parent()

# 打包目标根节点
var packed_scene = PackedScene.new()
packed_scene.pack($Grandparent)
ResourceSaver.save(packed_scene, "res://saved_scene.scn")

# 加载场景后再统一设置所有者
var loaded_scene = load("res://saved_scene.scn").instantiate()
add_child(loaded_scene)
for node in loaded_scene.find_children("*", "Node2D", false):
    node.owner = loaded_scene # 设置为祖父节点

3. 强制包含脚本依赖

若调整所有者后仍有问题,可手动将脚本纳入场景依赖列表:

var packed_scene = PackedScene.new()
packed_scene.pack($Grandparent)

# 遍历节点,手动添加脚本依赖
for node in $Grandparent.find_children("*", "*", false):
    if node.script != null:
        packed_scene.get_resource().add_dependency(node.script)

ResourceSaver.save(packed_scene, "res://saved_scene.scn")

4. 验证场景保存内容

可以将场景保存为.tscn文本格式,打开后检查是否有脚本路径的正确引用(比如script = ExtResource(1),且对应资源列表中存在脚本的文件路径),以此确认脚本是否被正确序列化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 23:33:12