Memperluas editor Godot agar bekerja untuk kalian: membuat EditorPlugin, script bertanda @tool yang berjalan di dalam editor, custom inspector dengan EditorInspectorPlugin, hingga automasi asset pipeline dan utilitas editor yang bisa dipakai ulang di seluruh tim.

Di episode 14 kalian membuat game yang cepat dan terukur. Sekarang saatnya mempercepat sisi lain: workflow kalian sendiri. Godot berbeda dari banyak engine — seluruh editor dibangun di atas node yang sama dengan game kalian, sehingga kalian bisa menulis alat sendiri yang berjalan di dalam editor. Episode 15 membahas custom tools & editor plugins.
Roadmap episode ini: anatomi EditorPlugin, membuat menu dan panel editor pertama, script bertanda @tool yang berjalan di editor, custom inspector dengan EditorInspectorPlugin, automasi asset pipeline, dan menutup dengan pola utilitas editor yang bisa dipakai ulang.
Semua ekstensi editor berakar pada satu kelas: EditorPlugin. Ia adalah titik masuk ke editor: dari sana kalian bisa menambah menu, membuat dock panel, mendaftarkan inspector plugin, dan menyambungkan ke signal editor. Plugin dideklarasikan lewat file plugin.cfg di folder addons/:
[plugin]
name="Level Builder"
description="Alat untuk menyusun level lebih cepat"
author="Arman Dwi Pangestu"
version="1.0"
script="plugin.gd"Setelah file ini dibuat dan scriptnya terisi, aktifkan plugin lewat menu Project → Project Settings → Plugins. Godot memuat dan menjalankan script tersebut di dalam editor. Dua fungsi wajibnya adalah _enter_tree dan _exit_tree:
@tool
extends EditorPlugin
func _enter_tree() -> void:
add_tool_menu_item("Buat Level Baru", _buat_level)
func _exit_tree() -> void:
remove_tool_menu_item("Buat Level Baru")add_tool_menu_item menambahkan entri ke menu Tool di editor. Karena plugin berjalan di dalam editor, ia punya akses ke EditorInterface — gerbang menuju scene yang sedang terbuka, FileSystem, dan banyak lagi.
Tool menu cukup untuk aksi sekali klik, tetapi untuk alat yang dipakai berulang kali, buatlah dock panel — jendela yang bisa disematkan di samping editor. Prosesnya: buat scene UI biasa, simpan sebagai panel.tscn, lalu daftarkan lewat add_control_to_dock:
@tool
extends EditorPlugin
var panel: Control
func _enter_tree() -> void:
panel = preload("res://addons/level_builder/panel.tscn").instantiate()
add_control_to_dock(DOCK_SLOT_LEFT_UL, panel)
func _exit_tree() -> void:
if panel:
remove_control_from_dock(panel)
panel.queue_free()Karena panel hanyalah node Control biasa, kalian membangunnya persis seperti UI game: tombol, label, dan container. Perbedaannya, ia hidup di dalam editor dan bisa membaca scene yang sedang dibuka lewat EditorInterface.
Fitur paling ampuh Godot untuk tooling adalah script bertanda @tool (di Godot 3, kata kuncinya adalah tool). Script biasa hanya berjalan saat game berjalan; script @tool juga dieksekusi di dalam editor. Ini membuka pintu untuk node yang menghitung visualnya sendiri saat scene dibuka.
Contoh klasik: node penanda yang menggambar lingkaran radiusnya langsung di editor, sehingga desainer level melihat area tanpa menjalankan game:
@tool
extends Node2D
@export var radius: float = 100.0
func _ready() -> void:
if Engine.is_editor_hint():
queue_redraw()
func _draw() -> void:
draw_circle(Vector2.ZERO, radius, Color(0.4, 0.8, 1.0, 0.3))Pola Engine.is_editor_hint() wajib dikuasai: ia memberi tahu kalau script sedang dijalankan di editor. Gunakan untuk melindungi kode yang hanya masuk akal saat game berjalan — seperti mengakses autoload atau input — agar editor tidak error ketika membuka scene.
Info
Saat membuat script @tool, selalu tanya: apakah fungsi ini perlu berjalan di editor atau cukup saat game? Kode @tool yang berhati-hati (dilindungi is_editor_hint()) menyelamatkan tim dari error editor yang membingungkan.
Sering kali yang kalian butuhkan bukan panel besar, melainkan kontrol yang lebih baik di Inspector. @export_custom memungkinkan kalian menyediakan control sendiri untuk properti:
@export_custom(ProceduralType)
var tipe: ProceduralType = ProceduralType.HILL
func _validate_property(property: Dictionary) -> void:
if property.name == "tipe":
property.hint = PROPERTY_HINT_ENUM
property.hint_string = "Bukit, Lembah, Gunung"_validate_property memberi kalian kendali penuh atas tampilan properti di Inspector. Untuk kontrol yang benar-benar bebas — slider warna, grafik, tombol aksi — gunakan EditorInspectorPlugin: buat subclass, daftarkan via add_inspector_plugin(), lalu di parse_property kalian bisa menambahkan control kustom ke Inspector node mana pun yang tipenya sesuai.
Editor plugin juga bisa menjadi otomasi pipeline: pekerjaan berulang yang seharusnya tidak dilakukan manual. Pola yang umum adalah memproses asset saat diimpor. Godot menyediakan signal filesystem_changed dan scene_imported, yang bisa kalian sambungkan dari plugin untuk menjalankan langkah pascaproses.
Contoh nyata: sebuah plugin yang membaca semua file konfigurasi level di folder levels/, memvalidasi ID-nya, lalu menulis daftar level ke file JSON saat editor menutup:
func _on_filesystem_changed() -> void:
var daftar: Array = []
var dir := DirAccess.open("res://levels")
if dir:
for nama in dir.get_files():
if nama.ends_with(".tscn"):
daftar.append(nama.trim_suffix(".tscn"))
var file := FileAccess.open("res://levels/index.json", FileAccess.WRITE)
file.store_string(JSON.stringify(daftar))Dengan pola seperti ini, desainer menambah level tanpa menyentuh kode — plugin yang menjaga index tetap sinkron. Inilah inti workflow automation: menggeser pekerjaan mekanis dari manusia ke editor.
Plugin yang baik tidak hanya menyelesaikan satu masalah; ia menyelesaikan masalah berulang untuk seluruh tim. Beberapa pola yang layak dijadikan plugin:
Agar plugin tetap terawat, simpan di folder addons/ per fitur dan gunakan version control. Struktur yang bersih terlihat seperti ini:
addons/level_builder/
├── plugin.cfg
├── plugin.gd
└── panel.tscnKalian sekarang bisa memperluas editor Godot: EditorPlugin sebagai titik masuk untuk menu, dock, dan inspector, script @tool yang berjalan di editor untuk visualisasi langsung, @export_custom dan EditorInspectorPlugin untuk kontrol Inspector yang rapi, automasi asset pipeline lewat signal editor dan file IO, serta pola plugin kecil yang bisa dipakai ulang oleh seluruh tim.
Inti yang harus dibawa pulang:
plugin.cfg dan script extends EditorPlugin di folder addons/.add_control_to_dock.@tool menjalankan script di editor; Engine.is_editor_hint() melindungi kode yang hanya untuk game.@export_custom dan EditorInspectorPlugin memberi kontrol penuh atas Inspector.Di episode 16, kalian menyentuh lapisan paling visual dari game: shaders & visual effects — bahasa shader Godot dan material workflow, fragment shader untuk 2D, spatial material untuk 3D, hingga kombinasi shader dengan particle untuk VFX yang memukau. Semua efek keren yang kalian lihat di game komersial mulai dari satu file shader.