Belajar Game Developer - Audio Game
Episode 9 of 28

Belajar Game Developer - Audio Game

Menambahkan dimensi emosional game: sound design untuk efek suara, integrasi musik yang dinamis, dan spatial audio agar suara terasa berasal dari dunia, lalu praktik integrasi audio lengkap ke Rimba Runner

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Coba matikan suara saat bermain game favorit kalian — sebagian besar keseruannya langsung hilang. Audio adalah 50% pengalaman game, bahkan ada desainer yang bilang lebih. Suara memberi feedback yang tak terlihat: lompatan terasa berat karena suara landas, musuh datang dari kiri karena suaranya mengecil, musik mencekam menaikkan ketegangan sebelum bos muncul.

Episode ini membangun sisi audio Rimba Runner: sound design (efek suara), musik yang terintegrasi, dan spatial audio agar suara melekat pada dunia. Kalian juga akan memahami peran audio programmer — bagaimana audio middleware seperti FMOD dan Wwise bekerja sama dengan engine.

Sound Design Dasar

Efek suara (SFX) memberikan feedback pada hampir setiap aksi: melompat, mendarat, mengumpulkan buah, terkena rintangan. Prinsip sound design yang perlu dipahami sejak awal:

  • Layering — suara profesional dibangun dari beberapa lapisan: suara lompatan bisa kombinasi "whoosh" (udara) + "pop" (kaki menendang). Satu lapisan saja terdengar tipis.
  • Pitch variation — jangan mainkan suara yang sama dengan pitch identik terus-menerus. Variasi pitch 5-10% membuat suara tidak terasa robotik dan mencegah kebosanan.
  • Volume & ducking — efek suara jangan menenggelamkan musik; gunakan audio bus terpisah agar level volume bisa diatur independen.

Untuk memulai, kalian tidak perlu synthesizer canggih. Banyak efek bisa dibuat dari rekaman sederhana atau asset gratis (misal dari itch.io asset packs atau CC0 libraries). Yang penting sejak awal: setiap aksi inti punya suara. Di Rimba Runner: jump, land, collect, hurt, game over.

Integrasi Audio di Engine

Semua engine punya player audio dasar. Godot paling sederhana dengan AudioStreamPlayer:

PythonMemainkan efek suara di Godot
@export var sfx_jump: AudioStream
@export var sfx_collect: AudioStream
 
func _on_jump() -> void:
    $AudioStreamPlayer.stream = sfx_jump
    $AudioStreamPlayer.pitch_scale = randf_range(0.95, 1.05)
    $AudioStreamPlayer.play()

Perhatikan pitch_scale — ini penerapan pitch variation. Di Unity, pola yang sama memakai AudioSource.PlayOneShot(clip, volume) yang memungkinkan banyak suara tumpang tindih dari satu komponen. Di Unreal, PlaySoundAtLocation untuk suara di dunia.

Aturan praktis integrasi:

  • Gunakan satu bus musik dan satu bus SFX terpisah — agar pemain bisa mengatur volume masing-masing di settings.
  • Jangan memainkan suara yang sama berkali-kali dalam satu frame (misal saat overlap) — beri cooldown kecil atau batasi polyphony.
  • Simpan volume di settings dan persist (kita akan membangun save system di episode 11).

Musik: Adaptif, Bukan Sekadar Diputar

Musik game berbeda dari lagu biasa: ia harus adaptif mengikuti situasi. Pemain yang santai menjelajah, lalu tiba-tiba dikejar musuh — musik tidak boleh tetap sama. Dua pendekatan umum:

  • Crossfade antar track — dua/lebih track (explore vs combat) dengan transisi halus saat kondisi berubah.
  • Music layering/stems — satu track dipecah per bagian (drum, bass, melodi). Game menambah lapisan secara bertahap sesuai intensitas. Contoh: saat skor tinggi, lapisan drum masuk.

Di engine sederhana, implementasi paling mudah adalah crossfade dengan dua AudioStreamPlayer dan tween volume:

PythonCrossfade musik adaptif
func set_intensity(high: bool) -> void:
    var from = music_calm if high else music_intense
    var to = music_intense if high else music_calm
    from.volume_db = lerp(from.volume_db, -80.0, 0.1)
    to.volume_db = lerp(to.volume_db, 0.0, 0.1)

Intinya: musik harus berubah mengikuti state game. Inilah perbedaan antara game dan film — di game, pemain menentukan ritme, jadi musik harus merespons ritme itu.

Spatial Audio: Suara yang Punya Tempat

Spatial audio membuat suara melekat pada posisi di dunia: suara musuh di kiri terdengar dari kiri, makin dekat makin keras. Engine menyediakan ini lewat node/komponen berposisi:

  • Godot: AudioStreamPlayer2D (2D) dan AudioStreamPlayer3D (3D) — suara otomatis dipanning & di-attenuate berdasarkan jarak.
  • Unity: AudioSource dengan spatialBlend — 0 untuk 2D (HUD/musik), 1 untuk 3D (suara dunia).
  • Unreal: Attenuation asset — mengontrol bagaimana suara melemah terhadap jarak dan halangan.

Pola integrasinya: jika musuh atau buah adalah AudioStreamPlayer2D yang menjadi child objek di dunia, maka suara ikut berpindah saat objek bergerak. Ini yang membuat pemain bisa "menebak" posisi musuh dari suara — informasi gameplay yang nyata, bukan sekadar hiasan.

Praktik: Integrasi Audio Rimba Runner

Rangkai semua bagian menjadi sistem audio yang utuh. Struktur yang direkomendasikan:

  1. SFX Player di Player — untuk suara jump, land, hurt (pemain yang membuat suara).
  2. AudioStreamPlayer2D di tiap objek dunia — buah, rintangan, musuh (suara di posisinya).
  3. Music busAudioStreamPlayer global yang dimainkan autoplay, dengan crossfade mengikuti intensity.
  4. Settings — volume bus musik & SFX bisa diatur dan disimpan.
Struktur audio Rimba Runner
Audio
├── MusicPlayer (global, crossfade calm/intense)
├── SFXBus (volume terpisah dari musik)
└── (per objek) AudioStreamPlayer2D di Player, Fruits, Enemies

Tip

Kalau budget kalian nol, FMOD dan Wwise punya versi gratis untuk project kecil dan dokumentasi lengkap. Keduanya adalah standar industri audio game dan sangat layak dipelajari saat kalian serius di sisi audio — peran audio programmer kita sebut di episode 1.

Warning

Jangan menunda audio sampai akhir project. Audio yang ditambahkan terakhir hampir selalu terasa "menempel" dan sulit disatukan. Integrasikan suara sejak prototipe — game akan terasa hidup lebih cepat, dan keputusan desain (kapan suara dipicu) jadi lebih awal terjaring.

Penutup

Audio bukan hiasan — ia informasi dan emosi.

Inti yang harus dibawa pulang:

  • Setiap aksi inti butuh SFX: jump, land, collect, hurt, game over — dengan variasi pitch.
  • Pisahkan bus musik dan SFX agar pemain bisa mengatur volume masing-masing.
  • Musik game harus adaptif: crossfade/layering mengikuti intensitas gameplay.
  • Spatial audio memakai node berposisi — suara melekat pada objek di dunia.
  • Integrasikan audio sejak prototipe, bukan di akhir project.

Di episode 10 selanjutnya kita akan membuat musuh yang "berpikir": AI game (NPC & Enemy) — pathfinding A*, state machines, dan behavior trees, lengkap dengan praktik membangun enemy AI untuk Rimba Runner. Sampai jumpa di episode 10!