关于 godot-4-migration
面向将项目从 Godot 3.x 迁移到 Godot 4 的开发者,说明 GDScript 语法及 API 变化,并强调验证转换结果后再替换现有构建。
主要功能
- 01GDScript 2.0 语法变化
- 02Tween 迁移至 create_tween()
- 03更新 export 注解
- 04信号与协程迁移
- 05转换验证建议
适用场景
- 01迁移 Godot 3 项目
- 02排查升级后的错误
- 03替换已弃用的 Tween 节点
- 04更新导出变量
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill godot-4-migration安装后在 Claude Code 中输入/godot-4-migration确认已加载。
详细介绍
Godot 4 迁移指南
概述
这是一份面向从 Godot 3.x 迁移到 Godot 4 的开发者的重要指南。本指南重点介绍 GDScript 2.0 中的主要语法变更、新的 Tween 系统以及 export 注解的更新。
何时使用此技能
- 将 Godot 3 项目移植到 Godot 4 时使用。
- 升级后遇到语法错误时使用。
- 替换已弃用的节点时使用(例如,用
create_tween替代Tween节点)。 - 将
export变量更新为@export注解时使用。
迁移流程
在已备份的分支或副本中进行操作。选择确切的 Godot 4 版本,在修改文件前验证转换结果,并检查转换器的不足、重命名的节点、着色器、物理、插件和导出目标。替换正在使用的 Godot 3 构建版本前,先测试场景和存档。以下示例是适用于 Node 脚本的代码片段;Enemy 必须是已声明的项目类型。
官方指南:升级到 Godot 4。
主要变更
1. 注解(@)
Godot 4 使用 @ 表示会修改行为的关键字。
export var x->@export var xonready var y->@onready var ytool->@tool(位于文件顶部)
2. Setter 和 Getter
现在可以在属性中内联定义 setter/getter。
Godot 3:
var health setget set_health, get_health
func set_health(value):
health = value
Godot 4:
signal health_changed(health: int)
var health: int = 100:
set(value):
health = value
emit_signal("health_changed", health)
get:
return health
3. Tween 系统
Godot 3 的 Tween 节点已在 Godot 4 中移除。请在代码中使用 create_tween()。
Godot 3:
$Tween.interpolate_property(...)
$Tween.start()
Godot 4:
var tween = create_tween()
tween.tween_property($Sprite, "position", Vector2(100, 100), 1.0)
tween.parallel().tween_property($Sprite, "modulate:a", 0.0, 1.0)
4. 信号连接
不建议使用基于字符串的连接方式。请使用可调用对象。
Godot 3:
connect("pressed", self, "_on_pressed")
Godot 4:
pressed.connect(_on_pressed)
示例
示例 1:类型化数组
GDScript 2.0 支持类型化数组,用于类型检查;应实际测量性能,而不要假定它能提升速度。
# Godot 3
var enemies = []
# Godot 4
var enemies: Array[Node] = []
func _ready():
for child in get_children():
if child is Enemy:
enemies.append(child)
示例 2:等待信号(协程)
yield 已被 await 取代。
Godot 3:
yield(get_tree().create_timer(1.0), "timeout")
Godot 4:
await get_tree().create_timer(1.0).timeout
最佳实践
- ✅ 建议: 使用
@export_range、@export_file等注解,以改善检查器 UI。 - ✅ 建议: 使用静态类型(
var x: int),让约定和类型检查更清晰;并在目标引擎和工作负载下测量性能。 - ✅ 建议: 使用
super()调用父类方法,而不是.function_name()。 - ❌ 避免: 如果可以使用信号对象(
name.emit()),就不要使用信号名称字符串(emit_signal("name"))。
故障排除
问题: “Identifier 'Tween' is not a valid type.”
解决方案: Godot 4 使用由 create_tween() 返回的 Tween 对象,而不是场景节点或 SceneTreeTween 类型。在 Node 上下文中使用 var tween: Tween = create_tween()。
限制
- 仅当任务明确符合上述范围时,才使用此技能。
- 不要将输出视为针对特定环境进行验证、测试或专家评审的替代品。
- 如果缺少必要的输入、权限、安全边界或成功标准,请暂停并请求澄清。