Godot 节点与场景(4.x)
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/godot-nodes-scenes-sh-fdxixs。
技能介绍
你在解决什么问题
Godot 里游戏结构几乎都落在 节点树 和 .tscn 场景 上:子弹、敌人、UI 要运行时反复实例化;get_node()、$Path 突然返回 null,或报错 「Attempt to call on a previously freed instance」,往往和路径、生命周期、同一帧内 free() 有关。本技能面向 Godot 4.3+,聚焦「怎么拆场景、怎么实例化、怎么安全访问树」,而不是 GDScript 语法、信号解耦或物理碰撞(那些应交给对应专项技能)。
技能如何组织工作流
- 组合优于深继承:小场景(Player、Bullet、Enemy)各自单一职责,再拼成更大场景;根节点挂脚本并暴露
@export,存盘后即可作为 PackedScene 复用。 - 运行时实例化:
preload/load→scene.instantiate()→add_child(instance);位置与状态可在add_child前后设置,但子节点_ready()与@onready只在入树之后 才可靠。 - 安全访问节点:固定子节点用
@onready var x = $Path;深层引用用 唯一名%Name(右键 Access as Unique Name),避免改名/改父级后路径失效;可选节点用get_node_or_null(),释放后用queue_free()+is_instance_valid()。 - Autoload 全局服务:在 Project Settings > Globals 注册游戏状态、音频、切场景等;注意 列表顺序——Autoload 在主场景之前加载,不能假设主场景已存在。
- 切场景:Godot 4 使用
instantiate()(非 3.x 的instance());change_scene_to_file()延迟到帧末 执行,调用后同一帧内仍是旧树,新场景节点应在下一帧或新场景_ready()里再读。
适用边界与常见坑
$Path/get_node()为 null:路径错、节点尚未入树——核对场景结构,或改用@onready/ 唯一名 /get_node_or_null()。- 同一帧
free():易让其它脚本仍持有引用时崩溃;优先queue_free()。 - 与相关技能的分工:语言与
@onready生命周期 →godot-gdscript;实例与生成器解耦 →godot-signals-groups;跨实例共享数据 →godot-resources;存档 →save-systems。场景继承、owner、groups 与路径边界案例见技能内references/tree-and-instancing.md。
使用场景
- 在 Godot 4.3+ 项目里把子弹、敌人或弹窗 UI 做成独立 .tscn,运行时 preload 后 instantiate 并 add_child 到当前场景
- 主场景里用多个小场景(Player、HUD)组合成关卡,并通过 @export 暴露速度、血量等可复用配置
- 调试 get_node 或 $Path 返回 null,或节点改名后深层引用失效,需要改用 % 唯一名或 get_node_or_null
- 在 Project Settings 配置 Autoload 管理全局游戏状态、音频或切场景,并避免 Autoload 依赖尚未加载的主场景
适合人员
- 用 Godot 4 做 2D/3D 原型、需要在运行时大量生成敌人或投射物的独立开发者
- 场景里节点层级经常调整,却被 $ 路径和「已释放实例」报错卡住的游戏程序员
- 负责拆分 .tscn 预制体与关卡结构、希望小场景组合而非深继承的技术向策划或 TA
- 从 Godot 3 迁移到 4.x、需要把 instance() 与切场景时序(change_scene_to_file 延迟)改对的维护者