Wprowadzenie: od słów kluczowych do adnotacji

Godot 4 zastąpił kilka słów kluczowych GDScript adnotacjami z prefiksem @. Było to częścią większego wysiłku, aby uczynić składnię GDScript czystszą i bardziej spójną. Trzy najważniejsze zmiany to:

  • export@export
  • onready@onready
  • tool@tool

Adnotacje umieszcza się w wierszu przed deklaracją, którą modyfikują (lub w tym samym wierszu). Godot 4 wprowadził również wiele nowych wariantów adnotacji, takich jak @export_range, @export_group i @export_category, których nie było w Godot 3. Ten przewodnik omawia je wszystkie.

Podstawowe @export

Adnotacja @export udostępnia zmienną w inspektorze Godota, pozwalając konfigurować wartości bez edycji kodu. Godot automatycznie dobiera odpowiedni widżet edytora na podstawie typu zmiennej.

GDScript
@export var speed: float = 300.0
@export var player_name: String = "Player"
@export var health: int = 100
@export var color: Color = Color.WHITE
@export var texture: Texture2D
@export var scene: PackedScene

Wskazówka: Zawsze dodawaj adnotacje typu do eksportowanych zmiennych. Dzięki temu inspektor wyświetli właściwy widżet (np. próbnik koloru dla Color, slot zasobu dla Texture2D).

@export_range — Suwaki numeryczne

@export_range ogranicza wartość liczbową do minimum i maksimum, wyświetlając w inspektorze suwak. Można również określić rozmiar kroku oraz wskazówki takie jak "or_greater" lub "or_less".

GDScript
@export_range(0, 100) var health: int = 100
@export_range(0.0, 1.0, 0.01) var volume: float = 0.8
@export_range(0, 1000, 1, "or_greater") var damage: int = 10

Wskazówka "or_greater" pozwala wpisywać wartości powyżej maksimum, zachowując jednocześnie skupiony zakres suwaka. Analogicznie "or_less" dopuszcza wartości poniżej minimum.

@export_enum — Menu rozwijane

@export_enum tworzy listę rozwijaną w inspektorze. Przy użyciu z typem String zapisywana jest nazwa wybranej opcji. Przy użyciu z typem int można przypisać jawne wartości.

GDScript
# Stores the string name: "Warrior", "Mage", or "Rogue"
@export_enum("Warrior", "Mage", "Rogue") var character_class: String

# Stores the integer value: 0, 1, or 2
@export_enum("Easy:0", "Normal:1", "Hard:2") var difficulty: int = 1

@export_file i @export_dir — Ścieżki plików/katalogów

@export_file wyświetla w inspektorze okno dialogowe wyboru pliku. Można filtrować według rozszerzenia pliku. @export_dir wyświetla okno wyboru katalogu.

GDScript
@export_file("*.tscn") var next_level: String
@export_dir var save_directory: String

Łańcuch filtra używa wzorców glob. Wiele filtrów można rozdzielić przecinkami: "*.png,*.jpg".

@export_multiline i @export_placeholder

@export_multiline zapewnia duże pole tekstowe dla łańcuchów wielowierszowych (idealne do dialogów lub opisów). @export_placeholder wyświetla tekst podpowiedzi w polu, gdy jest ono puste.

GDScript
@export_multiline var description: String
@export_placeholder("Enter name...") var player_name: String

@export_group i @export_subgroup — Organizacja właściwości inspektora

@export_group tworzy zwijany nagłówek grupy w inspektorze. Wszystkie następujące po nim zmienne @export należą do tej grupy aż do kolejnej grupy lub kategorii. @export_subgroup zagnieżdża się w bieżącej grupie.

GDScript
@export_group("Movement")
@export var speed: float = 300.0
@export var jump_force: float = 400.0

@export_group("Combat")
@export var attack_damage: int = 10
@export var defense: int = 5

@export_subgroup("Ranged")
@export var projectile_speed: float = 500.0

Grupy i podgrupy służą wyłącznie organizacji — nie wpływają na dostęp do zmiennych w kodzie, a jedynie na to, jak właściwości pojawiają się w inspektorze.

@export_category — Pogrubione nagłówki kategorii

@export_category tworzy pogrubiony nagłówek kategorii najwyższego poziomu w inspektorze. W przeciwieństwie do grup, kategorii nie można zwinąć i działają jako silny wizualny separator między niepowiązanymi zestawami właściwości.

GDScript
@export_category("Player Stats")
@export var level: int = 1
@export var experience: int = 0

@export z referencjami do węzłów

Możesz wyeksportować NodePath, aby projektanci mogli wybrać węzeł z drzewa sceny. W Godot 4.2+ możesz bezpośrednio wyeksportować typowaną referencję do węzła — NodePath nie jest już potrzebny.

GDScript
# Classic NodePath export
@export var target_path: NodePath

# Godot 4.2+: typed node export (direct reference, no NodePath needed)
@export var sprite: Sprite2D
@export var collision: CollisionShape2D

Typowane eksporty węzłów są zalecanym podejściem we współczesnym Godot 4. Inspektor wyświetla próbnik węzłów przefiltrowany do wskazanego typu, a w edytorze skryptów otrzymujesz pełne autouzupełnianie.

@export_flags — Pola wyboru maski bitowej

@export_flags tworzy zestaw pól wyboru, w którym każda opcja odpowiada jednemu bitowi w liczbie całkowitej. Godot udostępnia również wbudowane eksporty flag dla warstw fizyki i renderowania.

GDScript
# Custom flags: Fire=1, Water=2, Earth=4, Wind=8
@export_flags("Fire", "Water", "Earth", "Wind") var elements: int

# Built-in physics layer flags
@export_flags_2d_physics var collision_layers: int
@export_flags_2d_render var render_layers: int
@export_flags_3d_physics var collision_layers_3d: int

@onready — Opóźniona inicjalizacja

@onready opóźnia inicjalizację zmiennej do momentu, gdy węzeł wejdzie do drzewa sceny (odpowiednik przypisania w _ready()). Jest to niezbędne przy odwoływaniu się do węzłów potomnych za pomocą $, ponieważ węzły potomne nie są dostępne w czasie parsowania.

GDScript
# Godot 3 (old syntax):
# onready var sprite = $Sprite2D

# Godot 4:
@onready var sprite: Sprite2D = $Sprite2D
@onready var anim: AnimationPlayer = $AnimationPlayer
@onready var label: Label = $UI/ScoreLabel

Najlepsza praktyka: Zawsze typuj swoje zmienne @onready. Umożliwia to autouzupełnianie i wychwytuje błędy typów w czasie parsowania zamiast w czasie działania.

@tool — Uruchamianie skryptów w edytorze

@tool sprawia, że skrypt wykonuje się wewnątrz edytora Godota (nie tylko w czasie działania). Jest to potężne narzędzie do tworzenia własnych podglądów, gizmów i właściwości aktualizowanych na żywo. Umieść je na samej górze skryptu, przed extends.

GDScript
@tool
extends Node2D

@export var radius: float = 100.0:
    set(value):
        radius = value
        queue_redraw()  # Redraw in editor when value changes

func _draw() -> void:
    draw_circle(Vector2.ZERO, radius, Color.WHITE)

Ostrzeżenie: Zachowaj ostrożność ze skryptami @tool. Kod w _process() i _physics_process() będzie działał w edytorze. Użyj Engine.is_editor_hint(), aby zabezpieczyć logikę przeznaczoną tylko do gry.

Pozostałe adnotacje

@icon

Ustawia własną ikonę dla typu węzła skryptu w doku Scena oraz w oknie dialogowym „Utwórz węzeł".

GDScript
@icon("res://icons/enemy.svg")
extends CharacterBody2D

@warning_ignore

Wycisza określone ostrzeżenia GDScript dla następnej instrukcji. Przydatne, gdy celowo przesłaniasz zmienną lub masz nieużywany parametr.

GDScript
@warning_ignore("unused_parameter")
func _on_body_entered(body: Node2D) -> void:
    queue_free()

@warning_ignore("shadowed_variable")
var size: int = 10

@static_unload

Oznacza skrypt tak, aby Godot mógł usunąć go z pamięci, gdy nie istnieją żadne instancje. Może to zmniejszyć zużycie pamięci przez skrypty używane tylko tymczasowo. Skrypt nie może mieć żadnych zmiennych statycznych ani danych, które muszą być zachowane.

GDScript
@static_unload
extends RefCounted

# This script can be safely unloaded when not in use

Najlepsze praktyki typowania statycznego

Chociaż nie są to adnotacje, statyczne wskazówki typów są ściśle z nimi związane i mocno zalecane w Godot 4. Poprawiają autouzupełnianie, umożliwiają sprawdzanie błędów w czasie kompilacji i mogą poprawić wydajność.

GDScript
# Variable type annotations
var speed: float = 300.0
var player: CharacterBody2D = null
var items: Array[String] = []
var scores: Dictionary = {}

# Function return types and parameter types
func get_damage() -> int:
    return attack - defense

func apply_force(direction: Vector2, strength: float) -> void:
    velocity += direction * strength

# Type inference with :=
var pos := Vector2(100, 200)  # Inferred as Vector2

Uwaga: Zachowaj ostrożność z := w pętlach for podczas iterowania po nietypowanych tablicach. Zamiast tego użyj jawnych adnotacji typu: for item: String in array.

Ściąga migracji: Godot 3 do 4

Szybki przewodnik po konwersji składni eksportu Godot 3 na adnotacje Godot 4:

Godot 3 Godot 4 Uwagi
export var x @export var x Podstawowy eksport
export(int, 0, 100) var hp @export_range(0, 100) var hp: int Zakres ze wskazówką typu
export(String, "A", "B") var x @export_enum("A", "B") var x: String Lista rozwijana enum
export(String, FILE) var path @export_file var path: String Próbnik plików
export(String, MULTILINE) var text @export_multiline var text: String Wielowierszowe pole tekstowe
export(int, FLAGS, ...) var f @export_flags(...) var f: int Flagi maski bitowej
onready var x = $Node @onready var x: Type = $Node Opóźniona inicjalizacja
tool @tool Wykonanie w edytorze
Niedostępne @export_group("...") Nowość w Godot 4
Niedostępne @export_category("...") Nowość w Godot 4
Niedostępne @export_subgroup("...") Nowość w Godot 4

Godot MCP Pro rozumie wszystkie adnotacje @export

Godot MCP Pro potrafi tworzyć skrypty z poprawnie typowanymi eksportami, odczytywać i modyfikować istniejące adnotacje eksportu oraz inspekcjonować eksportowane właściwości dowolnego węzła w Twojej scenie — wszystko za pomocą AI.

  • create_script
  • edit_script
  • read_script
  • get_node_properties
  • get_scene_exports
  • update_property
Zdobądź Godot MCP Pro — $15