Memahami fondasi gameplay Godot: jenis-jenis node dari Node2D hingga RigidBody2D, menyusun scene dan hierarki node, menginstan scene sebagai prefab yang bisa dipakai ulang, hingga grouping node untuk organisasi scene yang rapi dan scalable.

Selamat datang di episode 4 series Belajar Godot. Di episode 3 kalian sudah menginstal Godot, membuat project pertama, dan menjalankan scene sederhana. Sekarang kita membangun inti gameplay: node, scene, dan instancing — tiga konsep yang membuat kalian benar-benar merasakan "menyusun game" alih-alih "menulis program".
Sebentar lagi kalian akan memahami kenapa Godot disebut berarsitektur scene: hampir tidak ada batas antara editor dan kode. Roadmap episode ini: mengenal jenis-jenis node, menyusun scene dan hierarki, menginstan scene sebagai prefab reusable, lalu grouping node untuk organisasi scene.
Godot punya ratusan node, tapi untuk kebanyakan game kalian hanya perlu menguasai segelintir inti. Jangan pusing dengan node lain yang belum dikenal — kelompok berikut ini mencakup lebih dari sembilan puluh persen kebutuhan game kalian di awal. Berikut kelompok utamanya:
Memilih node yang tepat menentukan berapa banyak kode yang harus kalian tulis. Gunakan CharacterBody2D untuk karakter yang digerakkan kode, RigidBody2D untuk benda yang harus realistis secara fisika, dan Area2D untuk deteksi tanpa perlu fisika tabrakan yang sesungguhnya. Untuk melihatnya secara ringkas:
| Node | Peran Utama | Kapan Dipakai |
|---|---|---|
Node2D | Basis transformasi 2D | Akar scene 2D, penampung objek |
Control | Basis semua UI | Tombol, label, panel, container |
Node3D | Basis transformasi 3D | Akar scene 3D, mesh, lampu |
Area2D | Deteksi zona | Pickup item, area damage, trigger |
RigidBody2D | Fisika pasif | Benda yang didorong physics engine |
CharacterBody2D | Gerak manual via kode | Pemain, musuh, karakter |
Scene hanyalah satu node root beserta anak-anaknya. Buat scene karakter sederhana: root CharacterBody2D, lalu tambahkan anak Sprite2D untuk visual dan CollisionShape2D untuk bentuk tabrakan. Klik node di Scene panel, lalu klik tombol + untuk menambahkan anak. Struktur akhirnya:
Player (CharacterBody2D)
├── Sprite2D
└── CollisionShape2DTatanan ini bukan sekadar kosmetik. Karena Sprite2D adalah anak dari CharacterBody2D, sprite otomatis ikut bergerak ketika body bergerak. Tambahkan Camera2D sebagai anak dan kamera pun akan mengikuti karakter secara otomatis. Inilah kekuatan hierarki: properti mengalir dari parent ke child.
Pemilihan node root juga penting: scene Player ber-root CharacterBody2D agar bisa bergerak dengan move_and_slide di episode 5, sedangkan scene Room cukup Node2D karena hanya penampung. Aturan sederhananya: pilih root paling spesifik yang tetap memenuhi kebutuhan, bukan selalu node yang paling umum.
Setelah scene Player selesai, simpan sebagai player.tscn. Sekarang kalian bisa memakainya di scene mana pun — ini yang disebut instancing: membuat instance dari sebuah scene. Di Godot 4, istilah "prefab" dari engine lain terasa berlebihan karena instancing sudah menjadi bagian alami dari workflow.
Ada dua cara menginstan scene: secara visual (drag scene dari FileSystem ke viewport) dan lewat kode. Yang kedua lebih fleksibel, misalnya untuk meledakkan peluru saat pemain menembak:
const Peluru = preload("res://scenes/bullet.tscn")
func tembak() -> void:
var peluru = Peluru.instantiate()
peluru.position = $Muzzle.global_position
add_child(peluru)Perhatikan polanya: preload memuat scene sekali di awal, instantiate() membuat salinan baru, properti diatur, lalu add_child memasukkan instance ke scene tree. Setiap instance adalah objek mandiri — satu scene peluru bisa melahirkan ratusan peluru tanpa konflik.
Satu hal yang wajib diingat: begitu add_child dipanggil, node langsung masuk scene tree dan callback _ready pada scriptnya langsung dijalankan. Karena itu pastikan semua properti yang dibutuhkan sudah diatur sebelum add_child, bukan sesudahnya. Untuk membuang instance yang tidak lagi dipakai, panggil queue_free() — penghapusan ditunda sampai akhir frame sehingga aman dari konflik physics.
Pola preload + instantiate + add_child ini adalah salah satu idiom paling umum dalam GDScript. Biasakan menuliskannya sampai melekat, karena akan kalian pakai di hampir setiap project game 2D maupun 3D.
Semakin besar scene, semakin penting organisasi. Godot menyediakan dua alat utama: folder node dan groups.
Folder node hanyalah node kosong yang berfungsi sebagai penampung — misalnya node Enemies yang menampung semua musuh, atau node UI yang menampung semua elemen antarmuka. Ini membuat hierarki mudah dibaca dan memungkinkan transformasi bersama.
Groups lebih pintar: kalian bisa menandai node mana pun dengan nama group, lalu memanggil semua anggotanya sekaligus. Ini jauh lebih baik daripada mencari node satu per satu. Contoh penggunaan:
func nonaktifkan_semua_musuh() -> void:
for musuh in get_tree().get_nodes_in_group("enemies"):
musuh.berhenti()
func daftarkan_musuh() -> void:
add_to_group("enemies")Group bisa diatur dari Inspector (tab Node, lalu tab Groups) atau lewat add_to_group di kode. Menandai musuh dengan group enemies membuat kode kalian jauh lebih singkat dibanding menyimpan referensi setiap musuh secara manual.
Sebuah node juga bisa masuk ke banyak group sekaligus — misalnya seekor musuh bisa berada di group enemies dan group flying secara bersamaan. Ini berguna saat kalian ingin memanggil subset objek tertentu dari kode. Perlu diingat bahwa group bersifat runtime dan urutan pemanggilan anggotanya tidak dijamin, jadi pastikan method yang dipanggil tidak saling bergantung satu sama lain.
Info
Group adalah salah satu fitur yang paling jarang dipakai pemula padahal paling berdampak. Biasakan memakai group untuk musuh, item, dan objek yang saling berinteraksi — kode kalian akan lebih bersih sejak awal.
Gabungkan semuanya: buat scene Room dengan root Node2D, tambahkan instance Player, beberapa instance musuh (cukup drag scene musuh beberapa kali), sebuah Area2D sebagai pintu keluar, dan folder node bernama Enemies untuk menampung semua musuh. Beri group enemies pada setiap instance musuh lewat Inspector. Sekarang kalian punya struktur scene yang rapi, reusable, dan siap diprogram di episode 5.
Setelah tersusun, tekan play dan pastikan scene tetap utuh saat dijalankan. Jangan ragu memakai debug output untuk memeriksa apakah group enemies terisi dengan benar — caranya akan kita pelajari di episode 5.
Node, scene, dan instancing adalah tiga pilar yang akan kalian pakai setiap hari. Kalian sekarang tahu memilih jenis node yang tepat (Node2D, Control, Node3D, Area2D, RigidBody2D, CharacterBody2D), menyusun hierarki scene yang propertinya mengalir dari parent ke child, menginstan scene sebagai komponen reusable, dan menata scene dengan folder node serta groups.
Inti yang harus dibawa pulang:
instantiate().preload untuk memuat scene, add_child untuk memasukkannya ke scene tree.Di episode 5 berikutnya, kita menghidupkan scene-scene ini dengan GDScript: sintaks dasar, variabel, fungsi, class, signal, input handling, lifecycle callbacks, hingga debugging dan logging. Inilah episode yang membuat kalian berhenti sekadar "menyusun" dan mulai "memprogram" game.