Membangun lapisan yang langsung dirasakan pemain: HUD, menu, dan UI toolkit di Unity/Godot/Unreal, plus prinsip UX game seperti feedback, affordance, dan readability, lalu praktik membangun antarmuka Rimba Runner yang jelas dan nyaman

Semua sistem yang kita bangun di episode 3-7 — gerak, mekanik, skor — tidak akan terasa apa-apa tanpa lapisan yang langsung dilihat pemain: UI (User Interface). Dan UI yang baik tidak lahir dari sekadar menempatkan tombol dan label, melainkan dari UX (User Experience) — seberapa mudah pemain memahami dan menikmati permainan.
Episode ini membangun antarmuka Rimba Runner: HUD (skor, nyawa), menu (start, pause, game over), dan menggunakan UI toolkit dari tiga engine. Yang lebih penting, kita membahas prinsip UX game — feedback, affordance, readability — karena antarmuka yang membingungkan adalah alasan tercepat pemain menutup game.
HUD (Heads-Up Display) menampilkan informasi penting selama bermain: skor, nyawa, waktu, atau amunisi. Prinsip utamanya: informasi cukup, tidak mengganggu. HUD yang penuh elemen justru merusak immersion dan menghalangi pandangan.
Untuk Rimba Runner, HUD minimal berisi skor dan nyawa. Di Godot, bangun scene UI dengan node CanvasLayer (agar tidak ikut bergerak dengan dunia) yang berisi HBoxContainer berisi dua label:
HUD (CanvasLayer)
└── HBoxContainer
├── ScoreLabel (Label: "Skor: 0")
└── HealthLabel (Label: "Nyawa: 3")Lalu hubungkan ke skor lewat signal (pola episode 4-6):
extends CanvasLayer
@onready var score_label: Label = $HBoxContainer/ScoreLabel
@onready var health_label: Label = $HBoxContainer/HealthLabel
func _ready() -> void:
GameState.score_changed.connect(_on_score_changed)
GameState.health_changed.connect(_on_health_changed)
func _on_score_changed(value: int) -> void:
score_label.text = "Skor: %d" % value
func _on_health_changed(value: int) -> void:
health_label.text = "Nyawa: %d" % valuePerhatikan pola arsitekturnya: HUD tidak menghitung skor, ia hanya mendengarkan perubahan. Data tinggal di GameState (singleton/autoload), HUD tinggal menampilkan. Ini menerapkan prinsip separation of concerns dari episode 6 ke lapisan UI.
Setiap engine punya toolkit UI dengan konsep yang saling bersesuaian:
| Engine | Toolkit | Elemen Dasar | Layout |
|---|---|---|---|
| Unity | uGUI + UI Toolkit | Canvas, Button, Text, Image | RectTransform, anchors |
| Godot | Control nodes | Control, Button, Label, Panel | Container (HBox, VBox, Grid) |
| Unreal | UMG | Widget Blueprint, Button, Text | Canvas Panel, Grid |
Prinsip bersama yang penting: layout container. Daripada menempatkan posisi absolut setiap elemen, gunakan container (HBox/VBox/Grid) agar UI otomatis rapi dan responsif terhadap ukuran layar. Inilah kenapa UI yang dibangun dengan container hampir tidak pernah "berantakan saat resolusi berubah", sedangkan posisi absolut sering patah di layar lebar atau kecil.
Contoh di Unity menggunakan RectTransform anchors: dengan set anchor skor ke kiri-atas dan tombol ke kanan-bawah, UI tetap di tempat yang benar berapa pun resolusi. Inilah praktik wajib untuk game yang dirilis lintas platform (bahas lengkapnya di episode 26).
Menu bukan sekadar "layar pembuka" — ia adalah state machine visual (konsep episode 2 diterapkan ke UI). Alur standar game:
Setiap layar adalah scene/widget tersendiri, dan transisi terjadi lewat mekanisme scene engine (get_tree().change_scene_to_file di Godot, SceneManager.LoadScene di Unity, Open Level di Unreal). Contoh menangani pause di Godot — pause hanya jalan jika node ada di tree:
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("pause"):
get_tree().paused = not get_tree().paused
pause_menu.visible = get_tree().pausedKunci yang sering dilupakan: node UI seperti tombol harus process_mode = PROCESS_MODE_WHEN_PAUSED agar tetap berfungsi saat game di-pause. Kalau tidak, tombol "Resume" ikut membeku — bug klasik yang membuat pemain harus me-restart game.
UI yang bagus secara teknis belum tentu bagus secara pengalaman. Tiga prinsip UX yang wajib diterapkan:
Contoh nyata untuk Rimba Runner: nyawa yang berkurang sebaiknya tidak hanya mengubah angka label — tambahkan flash merah dan getaran kecil. Ini feedback yang "terasa", bukan sekadar "terbaca". Episode 17 akan mendalami game feel yang berkaitan erat dengan prinsip ini.
Tip
Bawa mindset "UI adalah bagian dari gameplay". Menu yang lambat menanggapi klik, tombol yang terlalu kecil di mobile, atau teks yang tak terbaca akan membuat game yang gameplay-nya bagus sekalipun terasa murah. Devote waktu untuk UI polish seperti halnya gameplay polish.
Warning
Jangan uji UI hanya di satu resolusi dan satu perangkat. Uji di layar ultrawide, layar kecil, dan dengan font besar. Bug posisi UI adalah kategori bug paling sering terlewat saat rilis — dan paling cepat membuat ulasan negatif.
UI dan UX adalah jembatan antara semua sistem game dan perasaan pemain.
Inti yang harus dibawa pulang:
process_mode untuk pause.Di episode 9 selanjutnya kita akan menambahkan dimensi emosional: audio game — sound design, integrasi musik, dan spatial audio, lengkap dengan praktik integrasi audio ke Rimba Runner. Sampai jumpa di episode 9!