Specialized guide for migrating Godot 3.x projects to Godot 4 (GDScript 2.0), covering syntax changes, Tweens, and exports.
52
58%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./plugins/AI-Agents-Safe-Coding-Skills-claude/skills/godot-4-migration/SKILL.mdThe canonical home for this skill is godot-4-migration in administrakt0r/AI-Agents-Safe-Coding-Skills
A critical guide for developers transitioning from Godot 3.x to Godot 4. This skill focuses on the major syntax changes in GDScript 2.0, the new Tween system, and export annotation updates.
Tween node vs create_tween).export variables to @export annotations.@)Godot 4 uses @ for keywords that modify behavior.
export var x -> @export var xonready var y -> @onready var ytool -> @tool (at top of file)Properties now define setters/getters inline.
Godot 3:
var health setget set_health, get_health
func set_health(value):
health = valueGodot 4:
var health: int:
set(value):
health = value
emit_signal("health_changed", health)
get:
return healthThe Tween node is deprecated. Use create_tween() in code.
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)String-based connections are discouraged. Use callables.
Godot 3:
connect("pressed", self, "_on_pressed")Godot 4:
pressed.connect(_on_pressed)GDScript 2.0 supports typed arrays for better performance and type safety.
# Godot 3
var enemies = []
# Godot 4
var enemies: Array[Node] = []
func _ready():
for child in get_children():
if child is Enemy:
enemies.append(child)yield is replaced by 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, etc., for better inspector UI.var x: int) for performance gains in GDScript 2.0.super() to call parent methods instead of .function_name().emit_signal("name")) if you can use the signal object (name.emit()).Problem: "Identifier 'Tween' is not a valid type."
Solution: Tween is now SceneTreeTween or just an object returned by create_tween(). You rarely type it explicitly, just use var tween = create_tween().
fbdfd63
Canonical home
since Aug 19, 2026
Also appears in
since Aug 19, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.