Game Audio Implementation with FMOD in Godot and Unity
You already have a built FMOD event, so now you get that one event into a Godot 4 project and make it play when something happens in your scene.
This is the one-event Godot handoff, not the FMOD Studio design overview. You will not build events, parameters, buses, or snapshots here. This article assumes you already have one working event in FMOD Studio, assigned to a bank, and built.
You will do three things. Move the built banks into Godot. Tell Godot which event to play. Trigger that event from a signal.
A note on the plugin
FMOD’s own integrations target other engines. For Godot, you use a community plugin.
This article uses FMOD GDExtension from the utopia-rise project, because its readme and user guide were checked while writing this. The readme describes it as a Godot 4 GDExtension that integrates with the FMOD Studio API. At the time of checking, its readme listed Godot 4.4 and FMOD 2.03 as tested versions.
Plugins change faster than articles. Before you install anything, open the plugin’s current readme and user guide, and confirm which Godot and FMOD versions it supports today. If anything below disagrees with those docs, follow the docs.
Also read FMOD’s own licensing terms before you ship. That part is between you and FMOD, and this article does not cover it.
Step 1: Gather your handoff files
Open your FMOD Studio project and build it. In the build output folder you should find .bank files. For a simple project you need:
Master.bankMaster.strings.bank- The bank your event lives in, if it is not the master bank. This article calls it
SFX.bank.
Write down one more thing: your event’s path. In FMOD Studio, every event has a path that starts with event:/, followed by its folders and name. For example, event:/SFX/DoorOpen. Copy it exactly, including capital letters and spaces.
That path and those bank files are the whole handoff. Everything Godot needs to know about your sound lives inside them.
Keep your FMOD Studio version and the plugin’s supported FMOD version matched. A version mismatch is a common reason banks fail to load.
Step 2: Install the plugin
The plugin’s setup guide describes these steps:
- Download the latest release from the plugin’s releases page.
- Unzip it and copy the
addons/fmodfolder into your project’saddonsfolder. - Open Project > Project Settings, go to the Plugins tab, and enable FMOD GDExtension.
After you enable it, the guide says you can create FMOD nodes, use its bank explorer, and write scripts that call FmodServer.
The guide also lists FMOD options in your project settings, such as auto initialize and live update. Leave the defaults for now. You can come back once your one event plays.
Step 3: Copy the banks into your project
Make a folder in your Godot project, such as res://audio/banks/. Copy your .bank files into it.
Every time you rebuild in FMOD Studio, copy the banks again. Godot plays whatever bank files sit in your project, not what is open in FMOD Studio. Forgetting this step is the easiest way to spend an hour chasing a change that never arrived.
Step 4: Load the banks
The plugin’s guide gives two ways to load banks. Pick one.
Use a node. Add an FmodBankLoader node to your scene and add your banks to it. The guide says to place it in the scene tree before any other FMOD nodes that use those banks, and that banks unload when the node leaves the tree. If you want banks loaded for the whole game, the guide suggests using it as an autoload.
Use code. Call FmodServer.load_bank from a script:
extends Node
var banks := []
func _ready() -> void:
banks.append(FmodServer.load_bank("res://audio/banks/Master.strings.bank", FmodServer.FMOD_STUDIO_LOAD_BANK_NORMAL))
banks.append(FmodServer.load_bank("res://audio/banks/Master.bank", FmodServer.FMOD_STUDIO_LOAD_BANK_NORMAL))
banks.append(FmodServer.load_bank("res://audio/banks/SFX.bank", FmodServer.FMOD_STUDIO_LOAD_BANK_NORMAL))
Two rules from the guide matter here.
First, load Master.strings.bank and Master.bank before any other bank. Other banks depend on them.
Second, store the returned banks in a variable, as the banks array does above. The guide explains that banks are reference counted. If you do not keep a reference, the bank can unload right after you load it.
Step 5: Point an emitter at your event
Now add the thing that plays your sound.
- Pick the node in your scene where the sound should come from, such as a door.
- Add a child node of type
FmodEventEmitter2D, orFmodEventEmitter3Dfor a 3D game. - In the Inspector, set its event. The guide says you can type the event name or GUID, or use the event selection button.
- Turn autoplay off. You want the sound to play on a signal, not when the scene loads.
The guide describes a project setting that controls whether events load by name or by ID. If your event will not resolve, check that setting against how you entered the event.
Step 6: Play it on a signal
This is the part that makes it feel like a game. Pick one signal that already fires in your scene. For a door, an Area2D that detects the player works well.
Attach a script to the door and connect the area’s body_entered signal:
extends Node2D
@onready var emitter: FmodEventEmitter2D = $FmodEventEmitter2D
@onready var trigger: Area2D = $Area2D
func _ready() -> void:
trigger.body_entered.connect(_on_body_entered)
func _on_body_entered(body: Node2D) -> void:
if body.is_in_group("player"):
emitter.play()
Add your player to a group called player so the check passes only for the player.
The guide lists play() and play_one_shot() on the emitter. play() restarts the event if it is already playing by default. play_one_shot() starts a separate instance the emitter does not manage, which the guide calls useful for short sound effects. For a door that may be touched twice in a row, either works. Try both and listen.
If you do not want a node at all, the plugin’s API reference also shows FmodServer.play_one_shot("event:/SFX/DoorOpen") as a direct call. Use the path you wrote down in Step 1.
Step 7: Test the handoff
Run the scene and walk into the trigger. You should hear your event.
If you hear nothing, check these in order:
- Did you copy the latest banks after your last FMOD Studio build?
- Did the master and strings banks load before your event’s bank?
- Is a reference to each loaded bank still stored?
- Does the event path match FMOD Studio exactly?
- Is autoplay off, and does your signal fire? Add a
print()in the callback to be sure. - Do your FMOD Studio version and the plugin’s FMOD version match?
What to do next
Once one event plays on one signal, stop and commit your project. You now have a proven path from FMOD Studio to Godot.
Before you add parameters or more events, check the plugin’s setup guide for notes on each platform you plan to ship on. Its install page, for example, has a separate section for Android. Then repeat this same handoff for your second sound.