Loading...
Loading...
Godot 4 GDScript code quality: static typing, signal architecture, coroutines, design patterns, performance optimization, and GDScript-specific idioms. Use when writing or reviewing .gd files in Godot 4 projects for: (1) Enforcing static typing standards, (2) Designing signal and node communication patterns, (3) Implementing state machines/command/observer patterns in GDScript, (4) Optimizing GDScript performance, (5) Reviewing GDScript code for anti-patterns.
npx skill4agent add fetasty/godot-skills godot-gdscript# YES — typed
var health: float = 100.0
var inventory: Array[Item] = []
func take_damage(amount: float, source: Node3D) -> void:
func get_items() -> Array[Item]:
# NO — untyped
var health = 100.0
func take_damage(amount, source):@onready@onready var health_bar: ProgressBar = %HealthBar
@onready var sprite: Sprite2D = $Visuals/Sprite2Dunsafe_*class_namesnake_caseplayer_character.gdclass_name PlayerCharacter@export_group@export_subgroupsignal health_changed(new_health: float, old_health: float)
signal died(source: Node)
# Modern emit syntax (Godot 4)
health_changed.emit(_current_health, _previous_health)
died.emit(killer)
# Typed connections
health_changed.connect(_on_health_changed)
# One-shot
health_changed.connect(_on_damaged_once, CONNECT_ONE_SHOT)_process()_exit_tree()EventBus# Await a signal
await get_tree().create_timer(0.5).timeout
# Await a tween
var tween := create_tween()
tween.tween_property(sprite, "modulate:a", 0.0, 0.3)
await tween.finished
# Await parallel operations
var timer := get_tree().create_timer(1.0)
var tween := create_tween().tween_property(self, "position", target, 1.0)
await timer.timeout # or await tween.finishedyield()awaitenum State { IDLE, RUNNING, JUMPING, FALLING, ATTACKING }
var _current_state: State = State.IDLE
func _physics_process(delta: float) -> void:
match _current_state:
State.IDLE:
_process_idle(delta)
State.RUNNING:
_process_running(delta)class_name WeaponData extends Resource
@export var damage: float = 10.0
@export var attack_speed: float = 1.0
@export var weapon_type: WeaponTyperesource.duplicate()duplicate_deep()@onready var health_component: HealthComponent = %HealthComponent
@onready var hitbox_component: HitboxComponent = %HitboxComponent
func _ready() -> void:
health_component.died.connect(_on_died)
hitbox_component.hit_received.connect(_on_hit_received)Nodereferences/current-best-practices.mdgodotfunc log(prefix: String, values: Variant...) -> void:@abstract class_name BaseEnemy@abstract func get_pattern()_process_physics_processset_process(false)
set_physics_process(false)_physics_process_process@onreadyget_node()_processStringName&"animation_name"Array.find()DictionaryArray[Type]$NodePath_process@onreadyStringNameyield()awaitgdscript--glob "*.gd"glob: "*.gd"--type gdscript