Benutzerdefinierte Sounds in FiveM abspielen: NUI Audio, Lautstärke nach Distanz, Formate
Spiele benutzerdefinierte Sounds in FiveM mit NUI Audio ab (SendNUIMessage und ein HTML Audio-Element), distanzbasierte Lautstärke, OGG-Dateien, xsound und native Audio-Banken.
Du hast eine Sounddatei, wie z.B. eine Türklingel, eine Sirene oder eine Benachrichtigung, und möchtest sie von einem Script abspielen. FiveM hat keinen einfachen Native für benutzerdefinierte Audiodateien, also ist die übliche Antwort NUI: eine versteckte Webseite in deiner Ressource, die die Datei abspielt, wenn ein Client-Script sie auffordert. So funktionieren Ressourcen im Stil von interact-sound. Unten findest du den Code, die Distanzlautstärke, die Formate und die anderen Optionen.
Wie es funktioniert
- Die Ressource hat eine HTML-Seite (
ui_page) mit einem kleinen Script. - Das Client-Script sendet eine Nachricht an die Seite mit
SendNUIMessage. - Die Seite erstellt ein
AudioObjekt mit der Datei und spielt sie ab.
Die Seite kann unsichtbar bleiben und benötigt keinen Mausfocus.
Die Ressource
resources/[mic]/my_sounds/
fxmanifest.lua
client.lua
html/
index.html
sounds/
doorbell.ogg
alarm.ogg-- fxmanifest.lua
fx_version 'cerulean'
game 'gta5'
ui_page 'html/index.html'
files {
'html/index.html',
'html/sounds/*.ogg',
}
client_script 'client.lua'Die Sound-Dateien müssen sich in files befinden, sonst können sie nicht von der Seite geladen werden.
Die HTML-Seite
<!DOCTYPE html>
<html>
<body>
<script>
window.addEventListener('message', (event) => {
const data = event.data
if (data.action !== 'play') return
const audio = new Audio('./sounds/' + data.file + '.ogg')
audio.volume = Math.min(Math.max(data.volume ?? 1.0, 0), 1)
audio.play().catch((err) => console.log('sound error', err))
})
</script>
</body>
</html>audio.volume liegt zwischen 0,0 und 1,0. Werte außerhalb dieses Bereichs verursachen einen Fehler, daher begrenzt der Code ihn.
Das Client-Script
local function playSound(file, volume)
SendNUIMessage({
action = 'play',
file = file,
volume = volume or 1.0,
})
end
RegisterNetEvent('my_sounds:play', function(file, volume)
playSound(file, volume)
end)
exports('PlaySound', playSound)Jetzt kann ein anderes Client-Script exports.my_sounds:PlaySound('doorbell', 0.6) aufrufen, und der Server kann TriggerClientEvent('my_sounds:play', source, 'doorbell', 0.6) an einen Spieler senden, oder -1 für alle.
Tipp: Für einen Sound, den ein Spieler immer hören soll (eine Benachrichtigung, ein Telefon-Klingelton), ist das alles, was du brauchst. Für einen Sound, der zu einem bestimmten Ort gehört, verwende die Distanz-Version unten.
Distanzbasierte Lautstärke
Für einen Sound an einem bestimmten Punkt, wie z.B. einen Alarm auf einem Gebäude, sendet der Server die Koordinaten, und jeder Client entscheidet, wie laut er ist:
-- client.lua
RegisterNetEvent('my_sounds:playAt', function(file, coords, maxDistance, baseVolume)
local pos = GetEntityCoords(PlayerPedId())
local dist = #(pos - vec3(coords.x, coords.y, coords.z))
if dist >= maxDistance then return end
local volume = (1.0 - dist / maxDistance) * (baseVolume or 1.0)
playSound(file, volume)
end)-- server.lua: everyone gets it, only players in range hear it
TriggerClientEvent('my_sounds:playAt', -1, 'alarm', vec3(120.0, -1300.0, 29.0), 40.0, 1.0)Dies überprüft die Entfernung einmal, wenn der Sound startet. Für einen langen Sound, bei dem sich der Spieler bewegt, sende die Position in regelmäßigen Abständen erneut, oder behalte das Audio-Objekt auf der Seite und aktualisiere seine Lautstärke, wenn der Client neue Werte sendet. Ein Sound, der ein bewegendes Fahrzeug folgen muss, ist dort, wo eine vorgefertigte Bibliothek hilft, wie im nächsten Abschnitt.
Behalte die Kontrolle des Servers, wer was auslöst. Wenn du Clients erlaubst, ein „für alle abspielen" Event zu senden, kann jeder Cheater Sounds an den ganzen Server spammen. Siehe Server-Events und Sicherheit.
Dateiformate und Größe
- OGG: die beste Standardeinstellung, klein und gute Qualität.
- MP3: auch in Ordnung und leicht zu finden.
- WAV: funktioniert, aber ist groß. Verwende es nur für sehr kurze Effekte.
Jede Datei in files wird von jedem Spieler heruntergeladen, also halten sie kurz, Mono für Effekte und komprimiert. Trimme die Stille am Anfang der Datei: eine Verzögerung, die du im Spiel hörst, kommt oft daher. Wenn die Gesamtsumme groß ist, gilt die gleiche Warnung wie für andere Assets: siehe zu große Assets.
xsound und andere Bibliotheken
Anstatt die Seite selbst zu schreiben, kannst du eine Sound-Bibliothek wie xsound verwenden. Sie spielt Audio aus einer Datei oder einer URL an einer Position oder auf einer Entity ab und kann die Lautstärke und die Position später ändern, was sich für Musik in einer Bar oder einen Boom Box, der einem Spieler folgt, eignet. Lese ihre README für ihre genauen Exports, da diese sich zwischen Versionen unterscheiden. Die Idee ist die gleiche: eine versteckte NUI-Seite spielt das Audio ab, und ein Client-Script steuert es.
Native Sounds und Audio-Banken
Die eigenen Sounds des Spiels sind eine andere Option. Sie werden mit Natives wie PlaySoundFrontend oder PlaySoundFromCoord abgespielt, mit dem Namen und dem Set des Sounds, und benötigen keine Dateien von dir. Das Hinzufügen deiner eigenen Sounds zum Audio-System des Spiels ist auch möglich, mit Audio-Bank-Dateien und data_file Zeilen für Audio, aber es ist eine Spezialaufgabe mit seinen eigenen Werkzeugen und es ist leicht, es zu brechen. Für die meisten Server ist NUI-Audio einfacher und ausreichend.
Häufige Probleme
- Kein Sound überhaupt. Überprüfe den Dateinamen und dass die Datei in
filesist. Öffne die NUI in den Entwicklertools des Spiels, wenn du sie hast, und lese die Konsole auf einen 404. - Sound wird nur einmal abgespielt. Erstelle jedes Mal ein neues
AudioObjekt, wie im obigen Code, oder setzecurrentTimeauf einem behaltenen zurück. - Zu laut oder zu leise. Halten Sie die Lautstärke zwischen 0,0 und 1,0 und stellen Sie sie standardmäßig niedrig ein.
- Der Sound wird unterbrochen, wenn die Ressource neu startet. Die Seite wird mit der Ressource neu geladen. Das ist zu erwarten.
- Ein Script, das
interact-soundverwendet, schlägt fehl. Ressourcen, die diesen Namen erwarten, benötigen eine Ressource mit dem gleichen Namen und Exports. Überprüfe, was das Script will, bevor du das deine umbenennen.
Checkliste
| Symptom | Behebung |
|---|---|
| Nichts wird abgespielt | Lege die Dateien in files und überprüfe die ui_page Zeile |
| Falscher Pfad | Verwende ./sounds/<name>.ogg relativ zur HTML-Seite |
| Zu laut | Begrenzen Sie audio.volume zwischen 0 und 1 und senken Sie die Standardeinstellung |
| Sound sollte mit Entfernung verblassen | Sende Koordinaten und berechne die Lautstärke auf dem Client |
| Download ist langsam | Verwende kurze OGG-Dateien und komprimiere sie |
| Bewegungsquelle (Fahrzeug) | Verwende eine Bibliothek wie xsound oder aktualisiere die Lautstärke, wenn sich der Spieler bewegt |
Kurze Antworten
Welches Audioformat sollte ich verwenden?
OGG ist eine gute Standardeinstellung: kleine Dateien und gut vom Browser des Spiels unterstützt. MP3 funktioniert auch. Vermeid WAV für etwas Längeres, da die Dateien groß sind und jeder Spieler sie herunterlädt.
Brauche ich SetNuiFocus, um einen Sound abzuspielen?
Nein. Das Abspielen von Audio aus NUI benötigt keinen Focus und keine sichtbare Schnittstelle, nur eine mit ui_page geladene Seite, die den Audio-Code enthält.
Wie mache ich einen Sound leiser, wenn der Spieler weit weg ist?
Sende die Koordinaten des Sounds an den Client, berechne die Distanz zum Spieler und stelle die Audio-Lautstärke danach ein, zum Beispiel linear von 1 in der Nähe bis 0 auf die maximale Distanz.
Scripts ohne dieses Problem
Arcade MachinesSieben spielbare Arcade-Games in echten Automaten, mit Bestenlisten und Wetten.Script ansehen →
Mic PhoneEin faltbares Handy, das sich zum Tablet aufklappt und bis aufs echte Handy des Spielers reicht.Script ansehen →
Crypto MiningKauf eine Lagerhalle, bau Rigs Teil für Teil und mine Coins auf einem Markt, der sich bewegt.Script ansehen →