Soundscapes erstellen: Umgebungssound für GMod-Maps
Soundscapes erstellen in Hammer: env_soundscape, Proxy und Trigger, eigenes Skript pro Map, Packen in die BSP und Lösungen, wenn es still bleibt.
Ein Soundscape ist ein benannter Eintrag in einer Skriptdatei, der eine Geräuschkulisse beschreibt: Dauerschleifen, zufällige Einzelgeräusche und einen Halleffekt. In der Map setzt du pro Bereich ein env_soundscape und trägst den Namen ein. Die Engine bestimmt für jeden Spieler einzeln, welches Entity gerade gilt, und blendet beim Wechsel weich über. Eigene Soundscapes schreibst du in die Datei scripts/soundscapes_<mapname>.txt und packst sie mit ihren Sounds in die BSP.
So funktioniert ein Soundscape
Die Arbeit ist geteilt. Der Server prüft für jeden Spieler, welches Soundscape-Entity aktiv ist, und teilt das dem Client mit. Der Client liest den Eintrag aus dem Skript und spielt die Sounds lokal ab. Daraus folgt:
- Server und Client brauchen dasselbe Skript. Kennt eine Seite den Namen nicht, bleibt es still.
- Beim Wechsel werden Schleifen überblendet. Die Dauer steuert
soundscape_fadetime, im Source SDK sind es 3 Sekunden.
Entities platzieren: env_soundscape, Proxy und Trigger
| Entity | Aufgabe | Wichtige Keyvalues |
|---|---|---|
env_soundscape | Punkt-Entity, das über Radius und Sichtlinie aktiv wird | Radius (radius, Standard 128), Soundscape (soundscape), Sound Position 0 bis 7 (position0 bis position7) |
env_soundscape_proxy | eigener Ort und Radius, übernimmt Soundscape und Positionen eines anderen Entity | Soundscape Entity (MainSoundscapeName), Radius (radius) |
env_soundscape_triggerable | wie env_soundscape, wird zusätzlich über ein trigger_soundscape geschaltet | wie env_soundscape |
trigger_soundscape | Brush-Trigger, der beim Betreten das genannte Entity einschaltet | Soundscape (soundscape): Name eines env_soundscape_triggerable |
Die Auswahlregel steht in der FGD: Aktiv ist das Soundscape, das zuletzt Sichtlinie zum Spieler hatte und in dessen Radius der Spieler stand. Der Quellcode des Source SDK zeigt die Details:
- Die Sichtlinie wird vom Entity zum Spieler geprüft. Solide Geometrie und Wasser unterbrechen sie.
- Erfüllen mehrere Entities beide Bedingungen, gewinnt das nächstgelegene.
- Erfüllt keines mehr die Bedingungen, läuft das letzte weiter.
- Der Radius
-1bedeutet: Sichtlinie genügt, die Entfernung spielt keine Rolle.
Setze das Entity deshalb frei in den Raum und wähle den Radius so, dass er nicht durch Türen in den Nachbarraum reicht. Auch die Spawnpunkte brauchen ein Soundscape, sonst hören Spieler nichts, bis sie das erste Entity erreichen. Für verwinkelte Räume setzt du mehrere env_soundscape_proxy, die auf dasselbe Haupt-Entity zeigen. Wo die Sichtlinie nicht zur Raumaufteilung passt, etwa bei Glaswänden oder offenen Höfen, nimmst du trigger_soundscape. Laut Valve Developer Community hat ein Entity, das den Spieler über Radius und Sichtlinie erreicht, Vorrang vor dem Trigger, und das env_soundscape_triggerable selbst reagiert weiterhin auf Radius und Sichtlinie. Setze es deshalb so, dass Spieler nicht in seinen Radius kommen.
Vorhandene Soundscapes nutzen
Welche Skripte geladen werden, steht in scripts/soundscapes_manifest.txt. Das Manifest von GMod listet eigene Einträge wie construct.outside sowie die Skripte aus Half-Life 2, den Episoden, Portal, Counter-Strike: Source, Day of Defeat: Source und Team Fortress 2. Die Auswahlliste im Entity zeigt nur wenige Einträge wie GenericIndoor, du kannst aber jeden Namen eintippen.
Ein Name im Manifest heißt nicht, dass die Sounds vorhanden sind. Bei einer aktuellen Installation enthalten die Pakete, die GMod selbst mitbringt, fast alle Sounddateien der Skripte aus Half-Life 2, den Episoden und Counter-Strike: Source, von Team Fortress 2 und Day of Defeat: Source dagegen nur einen kleinen Teil. Mehr dazu steht in CS:S- und HL2-Content in GMod-Maps.
Zum Probehören gibst du in der Konsole sv_cheats 1 und danach playsoundscape mit einem Namen ein.
Eigenes Skript schreiben
Lege die Datei scripts/soundscapes_<mapname>.txt an, wobei <mapname> der Name der BSP ohne Endung ist. Die Engine lädt sie zusätzlich zum Manifest, sobald sie existiert. Das Manifest selbst lässt du unverändert. Benennst du die Map um, benennst du die Datei mit um.
"mymap.halle"
{
"dsp" "1"
"playlooping"
{
"volume" "0.4"
"wave" "ambient/atmosphere/indoor2.wav"
}
"playlooping"
{
"volume" "0.6"
"soundlevel" "SNDLVL_70dB"
"position" "0"
"wave" "deinname/mymap/generator_loop.wav"
}
"playrandom"
{
"time" "8,20"
"volume" "0.3,0.6"
"pitch" "90,110"
"soundlevel" "SNDLVL_75dB"
"position" "random"
"rndwave"
{
"wave" "ambient/levels/canals/drip1.wav"
"wave" "ambient/levels/canals/drip2.wav"
}
}
}
- Name: Soundscape-Namen gelten über alle geladenen Dateien hinweg. Ein Präfix wie
mymap.verhindert Kollisionen. dsp: der Halleffekt des Bereichs. In den mitgelieferten Skripten steht0für aus und1für die automatische Wahl.playlooping: eine Dauerschleife. Der Pfad beiwaveist relativ zum Ordnersound/. Gibvolumeimmer an: Im Code des Source SDK ist der Ausgangswert 0, und eine Schleife mit Lautstärke 0 wird übersprungen.playrandom: spielt in zufälligen Abständen einen der Sounds ausrndwave.time,volumeundpitchsind Bereiche in der FormMinimum,Maximum,timein Sekunden.position: Ohne diese Angabe kommt der Sound gleichmäßig von überall. Die Zahl0verweist auf den Keyvalue Sound Position 0 des Entity, in den du den Namen eines Ziel-Entity einträgst, zum Beispiel einesinfo_targetam Generator.randomfunktioniert nur inplayrandomund setzt den Sound jedes Mal an eine andere Stelle nahe beim Spieler. Ein positionierter Sound inplayrandombraucht außerdemsoundleveloderattenuation: Im Code des Source SDK bleibt der Pegel sonst auf 0, und der Sound spielt ohne Abfall über die Entfernung, als hätte er keine Position.
Skript und Sounds in die BSP packen
Server und Spieler brauchen das Skript und jede eigene Sounddatei. Als lose Datei in einem Workshop-Addon geht das Skript nicht mit: Die Whitelist von gmad erlaubt im Ordner scripts/ nur scripts/vehicles/*.txt. Der übliche Weg ist deshalb das Pakfile der Map. Den Ablauf beschreibt Custom Content in BSP packen. Zwei Punkte sind bei Soundscapes besonders:
- Sounds, die nur im Skript stehen, tauchen in der Map selbst nirgends auf. Prüfe die Liste eines automatischen Packers deshalb von Hand.
- Für
playloopingbrauchst du eine WAV mit Loop-Markierung (Cue Point), wie sie die mitgelieferten Schleifen enthalten. Source erkennt eine Schleife nur an dieser Markierung, ohne sie spielt die WAV einmal ab.
Ob Skript und Sounds im Pakfile angekommen sind, zeigt dir bspzip -dir oder der Map Scanner, der die eingebetteten Dateien auflistet.
Wann ambient_generic besser passt
| Soundscape | ambient_generic | |
|---|---|---|
| Gedacht für | die Grundstimmung eines Bereichs | eine einzelne Schallquelle |
| Steuerung | automatisch nach Standort des Spielers | über Inputs wie PlaySound, StopSound, Volume, FadeIn, FadeOut |
| Wer hört es | jeder Spieler seine eigene Mischung | alle Spieler in Reichweite dasselbe |
Nimm ambient_generic für alles, was die Map schalten soll: eine Maschine mit Ausschalter, einen Alarm, Musik auf Knopfdruck. Laut FGD sind die Flags „Start Silent“ und „Is NOT Looped“ bei einem neuen Entity gesetzt. Es bleibt also stumm, bis ein Output PlaySound auslöst. Wie du das verdrahtest, steht in Hammer Inputs und Outputs.
Typische Probleme
- Überall Stille: Meist stimmt der Name nicht, oder die Datei heißt nicht wie die Map. Mit
developer 1meldet die KonsoleCan't find soundscape: <Name>. Laut Valve Developer Community brauchen Soundscapes außerdem eine Map, die mit VVIS kompiliert wurde, mindestens mit-fast. - Das Soundscape wechselt nicht oder an der falschen Stelle: Das neue Entity hat keine Sichtlinie, sein Radius ist zu klein, oder ein näheres Entity sieht durch eine Tür in den Raum.
soundscape_debug 1zeichnet Linien zu allen Entities: grün für das aktive, weiß für Entities in Reichweite, rot für Entities außer Reichweite. - Anderen Spielern fehlen Sounds: Skript oder Sounddateien sind nicht gepackt, oder das Soundscape nutzt Sounds eines Spiels, das die Spieler nicht haben. Teste die gepackte Map ohne deine losen Dateien.
- Änderungen am Skript wirken nicht:
soundscape_flushlädt die Skripte neu, ohne die Map neu zu starten.
sv_cheats 1
soundscape_debug 1
playsoundscape mymap.halle
stopsoundscape
soundscape_flush
Die Befehle zwei bis vier brauchen sv_cheats 1. soundscape_flush nimmt der Server nur von seiner eigenen Konsole oder vom Host eines lokalen Servers an, und im Source SDK ist auch der clientseitige Teil, den der Befehl auslöst (cl_soundscape_flush), ein Cheat-Befehl.
Häufige Fragen
Hören alle Spieler dasselbe Soundscape?
Nein. Das aktive Soundscape wird für jeden Spieler einzeln bestimmt und auf seinem Client abgespielt. Jeder hört die Kulisse seines eigenen Standorts.
Was bedeuten die Zahlen bei dsp?
Jede Zahl steht für eine Hall-Voreinstellung. Die Kommentare in Valves eigenem Skript nennen neben 0 (aus) und 1 (allgemein) unter anderem 2 bis 4 für Metallräume, 5 bis 7 für Tunnel, 17 bis 19 für Betonräume und 23 bis 25 für Höhlen, jeweils klein, mittel und groß, dazu 14 bis 16 für Wasser.
Muss ich die Datei soundscapes_manifest.txt bearbeiten?
Nein. Eine Datei mit dem Namen scripts/soundscapes_<mapname>.txt lädt die Engine von selbst, zusätzlich zu allem, was im Manifest steht. Das Manifest gilt für alle Maps und bleibt unverändert.