Pengantar: Dari Keyword ke Anotasi

Godot 4 mengganti beberapa keyword GDScript dengan anotasi berawalan @. Ini adalah bagian dari upaya yang lebih besar untuk membuat sintaks GDScript lebih bersih dan konsisten. Tiga perubahan terpenting adalah:

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

Anotasi ditempatkan pada baris sebelum (atau pada baris yang sama dengan) deklarasi yang dimodifikasinya. Godot 4 juga memperkenalkan banyak varian anotasi baru seperti @export_range, @export_group, dan @export_category yang tidak ada di Godot 3. Panduan ini membahas semuanya.

@export Dasar

Anotasi @export menampilkan sebuah variabel di Godot Inspector, sehingga kamu dapat mengonfigurasi nilai tanpa mengedit kode. Godot secara otomatis memilih widget editor yang tepat berdasarkan tipe variabel.

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

Tips: Selalu tambahkan anotasi tipe pada variabel yang diekspor. Ini memastikan Inspector menampilkan widget yang benar (mis. pemilih warna untuk Color, slot resource untuk Texture2D).

@export_range — Slider Numerik

@export_range membatasi nilai numerik ke rentang minimum dan maksimum, serta menampilkan slider di Inspector. Kamu juga dapat menentukan ukuran langkah (step) dan petunjuk seperti "or_greater" atau "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

Petunjuk "or_greater" memungkinkan pengetikan nilai di atas maksimum sambil tetap menjaga fokus rentang slider. Demikian pula, "or_less" memungkinkan nilai di bawah minimum.

@export_enum — Menu Dropdown

@export_enum membuat dropdown di Inspector. Saat digunakan dengan String, nama opsi yang dipilih akan disimpan. Saat digunakan dengan int, kamu dapat menetapkan nilai eksplisit.

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 dan @export_dir — Path File/Direktori

@export_file menampilkan dialog file di Inspector. Kamu dapat memfilter berdasarkan ekstensi file. @export_dir menampilkan dialog pemilihan direktori.

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

String filter menggunakan pola glob. Beberapa filter dapat dipisahkan dengan koma: "*.png,*.jpg".

@export_multiline dan @export_placeholder

@export_multiline menyediakan area teks besar untuk string multi-baris (bagus untuk dialog atau deskripsi). @export_placeholder menampilkan teks petunjuk di dalam kolom saat kosong.

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

@export_group dan @export_subgroup — Mengatur Properti Inspector

@export_group membuat header grup yang dapat diciutkan di Inspector. Semua variabel @export yang mengikutinya termasuk dalam grup tersebut hingga grup atau kategori berikutnya. @export_subgroup bersarang di dalam grup saat ini.

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

Grup dan subgrup murni bersifat organisasional — keduanya tidak memengaruhi akses variabel dalam kode, hanya bagaimana properti muncul di Inspector.

@export_category — Header Kategori Tebal

@export_category membuat header kategori tebal tingkat teratas di Inspector. Berbeda dengan grup, kategori tidak dapat diciutkan dan berfungsi sebagai pemisah visual yang kuat antara kumpulan properti yang tidak berkaitan.

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

@export dengan Referensi Node

Kamu dapat mengekspor sebuah NodePath agar desainer dapat memilih node dari scene tree. Di Godot 4.2+, kamu dapat langsung mengekspor referensi node bertipe — tanpa perlu NodePath.

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

Ekspor node bertipe adalah pendekatan yang direkomendasikan di Godot 4 modern. Inspector menampilkan pemilih node yang difilter ke tipe yang ditentukan, dan kamu mendapatkan autocompletion penuh di editor skrip.

@export_flags — Kotak Centang Bitmask

@export_flags membuat serangkaian kotak centang di mana setiap opsi berkaitan dengan satu bit dalam bilangan bulat. Godot juga menyediakan ekspor flag bawaan untuk layer fisika dan render.

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 — Inisialisasi Tertunda

@onready menunda inisialisasi variabel hingga node memasuki scene tree (setara dengan penetapan di _ready()). Ini penting saat mereferensikan child node dengan $, karena child belum tersedia pada waktu parse.

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

Praktik Terbaik: Selalu ketik variabel @onready-mu. Ini mengaktifkan autocompletion dan menangkap kesalahan tipe pada waktu parse alih-alih pada waktu runtime.

@tool — Menjalankan Skrip di Editor

@tool membuat sebuah skrip dieksekusi di dalam editor Godot (bukan hanya saat runtime). Ini sangat berguna untuk membuat pratinjau kustom, gizmo, dan properti yang diperbarui secara langsung. Tempatkan di paling atas skrip, sebelum 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)

Peringatan: Hati-hati dengan skrip @tool. Kode di _process() dan _physics_process() akan berjalan di editor. Gunakan Engine.is_editor_hint() untuk melindungi logika khusus game.

Anotasi Lainnya

@icon

Menetapkan ikon kustom untuk tipe node skrip di Scene dock dan dialog Create Node.

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

@warning_ignore

Menekan peringatan GDScript tertentu untuk pernyataan berikutnya. Berguna saat kamu sengaja membayangi (shadow) sebuah variabel atau memiliki parameter yang tidak digunakan.

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

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

@static_unload

Menandai sebuah skrip agar Godot dapat membongkarnya (unload) dari memori saat tidak ada instance. Ini dapat mengurangi penggunaan memori untuk skrip yang hanya digunakan sementara. Skrip tersebut tidak boleh memiliki variabel statis atau data yang perlu dipertahankan.

GDScript
@static_unload
extends RefCounted

# This script can be safely unloaded when not in use

Praktik Terbaik Pengetikan Statis

Meskipun bukan anotasi, petunjuk tipe statis sangat berkaitan dan sangat direkomendasikan di Godot 4. Petunjuk tipe ini meningkatkan autocompletion, memungkinkan pengecekan kesalahan pada waktu kompilasi, dan dapat meningkatkan performa.

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

Catatan: Hati-hati dengan := di dalam perulangan for saat mengiterasi array tanpa tipe. Gunakan anotasi tipe eksplisit sebagai gantinya: for item: String in array.

Lembar Contekan Migrasi: Godot 3 ke 4

Referensi cepat untuk mengonversi sintaks ekspor Godot 3 menjadi anotasi Godot 4:

Godot 3 Godot 4 Catatan
export var x @export var x Ekspor dasar
export(int, 0, 100) var hp @export_range(0, 100) var hp: int Rentang dengan petunjuk tipe
export(String, "A", "B") var x @export_enum("A", "B") var x: String Dropdown enum
export(String, FILE) var path @export_file var path: String Pemilih file
export(String, MULTILINE) var text @export_multiline var text: String Area teks multi-baris
export(int, FLAGS, ...) var f @export_flags(...) var f: int Flag bitmask
onready var x = $Node @onready var x: Type = $Node Inisialisasi tertunda
tool @tool Eksekusi editor
Tidak tersedia @export_group("...") Baru di Godot 4
Tidak tersedia @export_category("...") Baru di Godot 4
Tidak tersedia @export_subgroup("...") Baru di Godot 4

Godot MCP Pro Memahami Semua Anotasi @export

Godot MCP Pro dapat membuat skrip dengan ekspor bertipe yang benar, membaca dan memodifikasi anotasi ekspor yang ada, serta memeriksa properti yang diekspor pada node mana pun di scene-mu — semuanya melalui AI.

  • create_script
  • edit_script
  • read_script
  • get_node_properties
  • get_scene_exports
  • update_property
Dapatkan Godot MCP Pro — $15