3D-Audio ist richtungsabhängiger Klang, der von einem bestimmten Ort im 3D-Raum ausgeht und je nach Entfernung und Ausrichtung zwischen dem Audioemitter und dem Zuhörer lauter oder leiser wird. Das bedeutet, dass Spieler, während sie sich in der Umgebung bewegen, diesen Klang dynamisch aus verschiedenen Richtungen und Lautstärken hören können.
Anhand der Gingerbread House - Start .rbxl-Datei als Ausgangspunkt und Gingerbread House - Complete Audio als Referenz zeigt dieses Tutorial, wie man sowohl sich wiederholendes als auch einmaliges 3D-Audio in seine Spiele einfügt, einschließlich Anleitungen zu:
- Wiederholenden Umgebungsgeräuschen, die sofort abgespielt werden, wenn Spieler sich mit dem Server verbinden.
- Auslösen von Audio, um Spieler über wichtige situative Ereignisse zu informieren, die für ihr Gameplay wichtig sind.
- Aktivieren von Audio, um Spielern akustisches Feedback zu geben, wenn sie mit 3D-Objekten interagieren.
- Abspielen von Charakter-Soundbissen, die Spieler ansprechen und sie zu interessanten Punkten in ihrer Umgebung führen.
Wenn Sie während des Prozesses auf Schwierigkeiten stoßen, können Sie Gingerbread House - Complete Audio als Referenz verwenden, um Ihren Fortschritt zu vergleichen.
Audioobjekte
Um richtungsabhängiges Audio zu erstellen, ist es wichtig, die Audioobjekte zu verstehen, mit denen Sie in diesem Tutorial arbeiten werden. Es gibt sechs Haupttypen von Audioobjekten für 3D-Audio:
- Das AudioPlayer-Objekt lädt und spielt die Audio-Datei ab.
- Das AudioEmitter-Objekt ist ein virtueller Lautsprecher, der Audio in die 3D-Umgebung ausstrahlt.
- Das AudioListener-Objekt ist ein virtuelles Mikrofon, das Audio aus der 3D-Umgebung aufnimmt.
- Das AudioDeviceOutput-Objekt ist ein physisches Hardwaregerät in der realen Welt, wie z. B. ein Lautsprecher oder Kopfhörer.
- Das AudioDeviceInput-Objekt ist ein physisches Mikrofon in der realen Welt.
- Wires übertragen Audiostreams von einem Objekt zum anderen.
All diese Audioobjekte arbeiten zusammen, um Klang zu erzeugen, genau wie ihre realen Gegenstücke. Schauen wir uns an, wie das in der Praxis funktioniert, anhand eines Beispiels eines Spielers, der ein Headset trägt, während er mit seinem Laptop spielt:
- Das AudioPlayer lädt die 1516791621 Audio-Asset-ID in das Spiel für einen Regen-Track.
- Das AudioEmitter strahlt einen Stream des Regen-Track-Audios in die 3D-Umgebung aus.
- Ein Wire überträgt den Stream vom AudioPlayer zum AudioEmitter, sodass der Stream aus dem 3D-Lautsprecher kommt.
- Das Kindobjekt AudioListener des Charakters hört diesen Klang in der 3D-Umgebung und gibt ihn an sein Headset weiter.
- Das AudioDeviceOutput-Objekt überträgt den Klang vom AudioListener zum physischen Lautsprecher des Spielers oder in diesem Fall zu seinen Kopfhörern.
- Das AudioDeviceInput-Objekt erfasst Klang aus der realen Welt und gibt ihn für den Voice-Chat ins Spiel zurück.


Die folgenden Abschnitte gehen tiefer auf diese Objekte ein, während Sie lernen, wie man sowohl sich wiederholendes als auch einmaliges 3D-Audio abspielt. Wenn Sie diese Objekte mit den kommenden Techniken überprüfen, können Sie genauer vorhersagen, wie Sie Klang aus dem Spiel an den Spieler und umgekehrt erfassen und übertragen können.
Wiederholendes Audio
Wiederholendes 3D-Audio, oder richtungsabhängiges Audio, das nahtlos wiederholt wird, sobald Spieler sich mit dem Server verbinden, ist eine gängige Sounddesign-Technik, um die Atmosphäre des 3D-Raums zu verbessern, indem es lebendig und dynamisch wirkt. Darüber hinaus sorgt wiederholendes 3D-Audio dafür, dass Ihre Umgebungsgeräuschquellen konsistent bleiben, wie das Rauschen eines Fernsehers oder das Rauschen eines Wasserfalls; wenn diese Geräusche plötzlich aufhören würden, würde die Umgebung unrealistisch wirken.
Um dieses Konzept zu demonstrieren, überprüfen Sie, wie das folgende 3D-Audio für zwei große Wasserfälle stoppt, sobald der nicht wiederholte Audiotrack abgeschlossen ist. Während die Wassergeräusche die Spieler zunächst in die Außenumgebung eintauchen, ist der plötzliche auditive Wechsel schockierend und unnatürlich, wie sich ein Wasserfall in der realen Welt verhält.
Ähnlich verwendet das Beispiel diese Technik für den fließenden Schokoladenwasserfall und passt seine Lautstärke entsprechend der Entfernung des Spielers vom Audioemitter an. Wenn der Spieler weniger als 20 Studs entfernt ist, gibt der Emitter den Klang mit voller Lautstärke aus. Wenn sich der Spieler weiter entfernt, verringert sich die Lautstärke des plätschernden Audios alle 20 Studs vom Audioemitter. Dies emuliert den Klang in der realen Welt, der leiser wird, je weiter man von der Quelle entfernt ist.
Um das wiederholende 3D-Audio im Beispiel Gingerbread House - Complete Audio zu reproduzieren:
Aktivieren Sie einen Standardlistener, der an Ihrem Spielercharakter befestigt ist.
- Wählen Sie im Explorer-Fenster den SoundService aus.
- Setzen Sie im Properties-Fenster DefaultListenerLocation auf Character. Wenn Sie das Spiel ausführen, erstellt die Engine automatisch:
- Ein AudioListener unter dem Humanoid.RootPart jedes Spielercharakters, sodass Sie Geräusche in Ihren realen Lautsprechern entsprechend der Position und dem Maßstab der Schallquellen im Spiel hören können.
- Ein AudioDeviceOutput unter SoundService.
Navigieren Sie im Explorer-Fenster zu Workspace ⟩ WaterfallAudioObject, dann:
- Fügen Sie ein AudioPlayer-Objekt hinzu, um eine Audioquelle für den Wasserfall zu erstellen.
- Fügen Sie ein AudioEmitter-Objekt hinzu, um einen positionsabhängigen Stream von WaterfallAudioObject auszugeben.
- Fügen Sie ein Wire-Objekt hinzu, um den Stream vom Audio-Player zum Audio-Emitter zu übertragen.

Wählen Sie den AudioPlayer aus, und setzen Sie im Properties-Fenster:
- Setzen Sie AssetID auf rbxassetid://1516791621, um einen Regen-Audiotrack abzuspielen.
- Aktivieren Sie Looping, damit das Audio nahtlos wiederholt wird.
Wählen Sie den AudioEmitter aus, und setzen Sie im Properties-Fenster DistanceAttenuation auf {0: 1}, {20: 0.8}, {40: 0.4}, {80: 0}, damit der Klang alle 20 Studs vom Audioemitter progressiv in der Lautstärke abnimmt.
Wählen Sie das Wire-Objekt aus, und setzen Sie im Properties-Fenster:
- Setzen Sie SourceInstance auf Ihren neuen AudioPlayer, um anzugeben, dass Sie möchten, dass das Kabel Audio von diesem spezifischen Audio-Player überträgt.
- Setzen Sie TargetInstance auf Ihren neuen AudioEmitter, um anzugeben, dass Sie möchten, dass das Kabel Audio zu diesem spezifischen Audio-Emitter innerhalb des Wasserfalls überträgt.
Gehen Sie zurück zum Explorer-Fenster, fügen Sie ein Script in WaterfallAudioObject ein, benennen Sie es in LoopWaterfallMusic um, setzen Sie die RunContext-Eigenschaft auf Client und fügen Sie den folgenden Code in das Skript ein:
local audioPlayer = script.ParentaudioPlayer:Play()Code-ErklärungDas Skript beginnt damit, eine Variable zu deklarieren, die das übergeordnete AudioPlayer des Skripts darstellt. Das Skript setzt dann die Audioquelle so, dass sie vom Moment an abgespielt wird, in dem der Spieler dem Spiel beitritt, bis er das Spiel verlässt.
Testen Sie das Spiel, um den sich wiederholenden Schokoladenregen-Sound zu hören, wenn Ihr Avatar in der Nähe des Wasserfalls ist. Wenn Sie den Kopf Ihres Charakters drehen, um in eine andere Richtung zu schauen, verschiebt sich der Klang dynamisch in Ihren realen Lautsprechern entsprechend der Position des Emitters im 3D-Raum.
Einmaliges Audio
Einmaliges 3D-Audio, oder richtungsabhängiges Audio, das einmal zu einem bestimmten Zeitpunkt und an einem bestimmten Ort abgespielt wird, es sei denn, ein Spieler löst es erneut aus, bietet den Spielern Kontext zu ihren Aktionen, der Umgebung und allen Charakteren um sie herum. Die Verwendung dieser Art von akustischem Feedback in Ihren Spielen ist entscheidend, da sie es den Spielern ermöglicht, strategische Entscheidungen zu treffen, wie z. B. das Vermeiden von herannahenden Feinden oder das Aufnehmen nützlicher Gegenstände.
Die folgenden Abschnitte bieten Implementierungsdetails für gängige Gameplay-Szenarien, in denen Spieler zeitnahes, richtungsabhängiges Feedback benötigen, einschließlich situativer Gameplay-Ereignisse, Objektinteraktionen und Dialoge mit nicht spielbaren Charakteren.
Ereignis-Feedback
Wenn Spieler wichtige situative Ereignisse in ihrer Umgebung auslösen, wie das Freischalten neuer Gameplay-Bereiche oder das Auslösen von Feindfeuer, ist es wichtig, dass sie verstehen, wo sie ihre Aufmerksamkeit im 3D-Raum richten müssen. Wenn sie kein sofortiges akustisches Feedback erhalten, könnten sie Informationen verpassen, die für ihr Gameplay wichtig sind, was zu Frustration führen kann, weil sie nicht wissen, wo sie hingehen oder was sie als Nächstes tun sollen.
Um zu demonstrieren, warum dies wichtig ist, überprüfen wir das einmalige 3D-Audio aus der Laser Tag Vorlage, das von jedem Spielerblaster abgespielt wird:
- Ein tiefes Knallgeräusch ertönt bei jedem Schuss, den der Spieler mit seinem Blaster abfeuert.
- Ein Klick- und Roboterpiepsgeräusch ertönt jedes Mal, wenn der Spieler seinen Blaster mit einer neuen Runde nachlädt.
Beide Geräusche bieten situative Wahrnehmung, indem sie alle nahegelegenen Spieler auf die Richtung aufmerksam machen, aus der die Schüsse kommen, damit sie informierte Entscheidungen treffen können, ob sie sich dem Spaß anschließen oder potenzieller Gefahr ausweichen.
Das Beispiel verwendet dieselbe Technik, um den Spielern situative Wahrnehmung über ihre Belohnung für das Abschließen des Hauptziels im Spiel zu geben. Nachdem sie alle drei Gummibärchen gesammelt haben, öffnet sich die Tür zum Lebkuchenhaus, um den Spielern Zugang zu dem Geschenk darin zu gewähren.
Da es keine spezifische Reihenfolge gibt, in der die Spieler die Gummibärchen sammeln müssen, ist es wichtig, dass die Spieler sich der sich öffnenden Tür bewusst sind, egal welches Gummibärchen sie zuletzt sammeln. Richtungsabhängiger Klang macht dies möglich, sodass die Spieler sich ihres Erfolgs und dessen, wo sie als Nächstes hingehen müssen, bewusst sind, unabhängig von ihrer relativen Entfernung und Richtung zur Tür.
Um das einmalige Ereignis-Feedback 3D-Audio im Beispiel Gingerbread House - Complete Audio zu reproduzieren:
Navigieren Sie im Explorer-Fenster zu Workspace ⟩ Door, dann:
- Fügen Sie ein AudioPlayer-Objekt hinzu, um eine Audioquelle für das Volumen zu erstellen.
- Fügen Sie ein AudioEmitter-Objekt hinzu, um einen positionsabhängigen Stream von Door auszugeben.
- Fügen Sie ein Wire-Objekt hinzu, um den Stream vom Audio-Player zum Audio-Emitter zu übertragen.

Wählen Sie den AudioPlayer aus, und setzen Sie im Properties-Fenster AssetID auf rbxassetid://5930776613, um einen Audio-Track für ein gleitendes Metalltor abzuspielen.
Wählen Sie das Wire-Objekt aus, und setzen Sie im Properties-Fenster:
- Setzen Sie SourceInstance auf Ihren neuen AudioPlayer, um anzugeben, dass Sie möchten, dass das Kabel Audio von diesem spezifischen Audio-Player überträgt.
- Setzen Sie TargetInstance auf Ihren neuen AudioEmitter, um anzugeben, dass Sie möchten, dass das Kabel Audio zu diesem spezifischen Audio-Emitter innerhalb des Volumens überträgt.
Gehen Sie zurück zum Explorer-Fenster, navigieren Sie zu ServerScriptService, fügen Sie ein Script hinzu, benennen Sie es in GumdropService um, setzen Sie die RunContext-Eigenschaft auf Server und fügen Sie den folgenden Code in das Skript ein:
-- Variablen initialisierenlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")local TweenService = game:GetService("TweenService")-- Modulelocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- Variablenlocal gumdropsFolder = Workspace.Gumdropslocal gumdrops = gumdropsFolder:GetChildren()local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAMElocal GUMDROP_AMOUNT_TO_ADD = 1local function updatePlayerGumdrops(player, updateFunction)-- Aktualisieren der Gummibärchen-Tabellelocal newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)-- Aktualisieren des Gummibärchen-LeaderboardsLeaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)-- Überprüfen, ob der Spieler drei Gummibärchen gesammelt hatif newGumdropAmount >= 3 then-- Spielen Sie das Türereignis-Audio ab, wenn der Spieler drei Gummibärchen gesammelt hatlocal audioPlayer = Workspace.Door.AudioPlayeraudioPlayer:Play()-- Animieren Sie die Tür, um nach unten zu bewegenlocal doorPart = Workspace.Doorlocal tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Linear)local tween = TweenService:Create(doorPart, tweenInfo, {Position = doorPart.Position + Vector3.new(0, -15, 0)})tween:Play()endend-- Definieren des Ereignis-Handlerslocal function onGumdropTouched(otherPart, gumdrop)if gumdrop:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Spieler hat ein Gummibärchen berührtlocal audioPlayer = gumdrop.AudioPlayeraudioPlayer:Play()gumdrop.Transparency = 1gumdrop:SetAttribute("Enabled", false)updatePlayerGumdrops(player, function(oldGumdropAmount)oldGumdropAmount = oldGumdropAmount or 0return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADDend)print("Spieler hat Gummibärchen gesammelt")endendend-- Einrichten der Ereignis-Listenerfor _, gumdrop in gumdrops dogumdrop:SetAttribute("Enabled", true)gumdrop.Touched:Connect(function(otherPart)onGumdropTouched(otherPart, gumdrop)end)endCode-ErklärungDas Skript beginnt damit, die Workspace, Players, ServerStorage und TweenService-Dienste zu initialisieren, damit es auf deren Kinder und Funktionalitäten zugreifen kann. Dann erfordert es die Leaderboard- und PlayerData-Module in ServerStorage; diese Module sind dafür verantwortlich, ein Leaderboard in der oberen rechten Ecke des Bildschirms zu erstellen und zu aktualisieren, das die Menge an Gummibärchen verfolgt, die ein Spieler in der Umgebung sammelt.
Die Funktion updatePlayerGumdrops des Skripts ist der Ort, an dem der Großteil der Arbeit für das Auslösen von 3D-Audio für Ereignis-Feedback erfolgt, und sie nimmt zwei Argumente:
- player - Ein Spieler, der ein Gummibärchen sammelt.
- updateFunction - Eine Callback-Funktion, die die gesammelte Gummibärchenanzahl des Spielers aktualisiert.
Wenn ein Spieler mit einem Gummibärchen kollidiert, führt das Skript Folgendes aus:
- Holt sich den neuen Wert der Gummibärchen-Sammelanzahl des Spielers, indem es die Funktion PlayerData.updateValue aufruft.
- Aktualisiert das Leaderboard mit diesem neuen Betrag, indem es die Funktion Leaderboard.setStat aufruft.
- Überprüft, ob die Menge größer oder gleich 3 ist.
Wenn dieser Wert größer oder gleich 3 ist, führt das Skript Folgendes aus:
- Spielt den 3D-Audiotrack vom Audio-Player zum Audio-Emitter ab.
- Bewegt die Tür linear 15 Studs unter ihre aktuelle Position.
Der Rest des Skripts ist größtenteils dafür verantwortlich, zu erkennen, dass alles, was mit dem Gummibärchen kollidiert, ein Spieler ist, damit es einen nicht-richtungsabhängigen Sound für das Sammel-Feedback auslösen kann. Für weitere Informationen zu diesem Teil des Skripts siehe 2D-Audio hinzufügen - Gameplay-Feedback.
Testen Sie das Spiel, um das Geräusch des gleitenden Tores zu hören, nachdem Sie alle drei Gummibärchen in der Umgebung gesammelt haben. Wenn Sie die Kamera drehen, verschiebt sich der Klang dynamisch in Ihren realen Lautsprechern, sodass Sie ihn entsprechend der Position des Emitters im 3D-Raum hören.
Objektinteraktion
Wenn Spieler mit 3D-Objekten in ihrer Umgebung interagieren, wie z. B. einem Lichtschalter, den sie einschalten, oder einem Waffen, die sie aufheben, ist es wichtig, sofortiges Feedback zu geben, damit sie intuitiv verstehen, wie sie mit dem Objekt interagieren. Die Kombination aus visuellem und akustischem Feedback verstärkt die Ursache-Wirkung-Beziehung zwischen den Aktionen des Spielers und der Reaktion der Umgebung.
Um dieses Konzept zu erweitern, überprüfen wir das folgende einmalige 3D-Audio aus dem Plant Beispiel für den Benutzerfluss beim Gärtnern eines Kohls:
- Ein sanftes Klirren ertönt, wenn der Spieler einen Samen pflanzt.
- Ein nasses, spritzendes Geräusch ertönt, wenn der Spieler seine wachsende Pflanze gießt.
- Ein Klippgeräusch ertönt, wenn der Spieler die voll gewachsene Pflanze einsammelt.
- Ein sanftes Geräusch ertönt, wenn der Spieler den Kohl in den Wagen legt.
All diese Geräusche verstärken die Proximitätsaufforderung des Spielers bei den Schlüsselinteraktionen mit dem Objekt, das sich in der 3D-Umgebung verändert. Für Spieler mit Sehbehinderungen, bei denen Farbänderungen oder Animationen schwieriger zu erkennen sind, helfen diese verschiedenen Formen des sensorischen Feedbacks, dass Ihre 3D-Objektinteraktionen für so viele Spieler wie möglich zugänglich und intuitiv bleiben.
Um ein anderes Beispiel dafür zu geben, wie Sie die Objektinteraktion mit mehreren Formen des sensorischen Feedbacks konfigurieren können, bietet das Beispiel sowohl visuelles als auch akustisches Feedback, wann immer Spieler auf den 3D-Pfefferminzknopf im Lebkuchenhaus treten. Wenn die Spieler nicht mit dem Knopf interagieren, sieht er aus wie eine typische Pfefferminzsüßigkeit, aber wenn sie auf den Knopf treten, spielt das Beispiel:
- Einen feierlichen Jingle-Audiotrack ab.
- Tönt die Seiten des Knopfes mit einem grünen Farbton.
- Bewegt den Knopf in den Boden.
Von hier aus können Sie diese Interaktion mit allen möglichen einzigartigen Gameplay-Aktionen verbinden, wie z. B. das Freischalten eines Gegenstands oder das Auslösen einer speziellen Fähigkeit.


Um das einmalige Objektinteraktions-3D-Audio im Beispiel Gingerbread House - Complete Audio zu reproduzieren:
Navigieren Sie im Explorer-Fenster zu Workspace ⟩ 3DAudioButton, dann:
- Fügen Sie ein AudioPlayer-Objekt hinzu, um eine Audioquelle für den Knopf zu erstellen.
- Fügen Sie ein AudioEmitter-Objekt hinzu, um einen positionsabhängigen Stream von 3DAudioButton auszugeben.
- Fügen Sie ein Wire-Objekt hinzu, um den Stream vom Audio-Player zum Audio-Emitter zu übertragen.

Wählen Sie den AudioPlayer aus, und setzen Sie im Properties-Fenster AssetID auf rbxassetid://1846248593, um einen fröhlichen, feierlichen Audiotrack abzuspielen.
Wählen Sie das Wire-Objekt aus, und setzen Sie im Properties-Fenster:
- Setzen Sie SourceInstance auf Ihren neuen AudioPlayer, um anzugeben, dass Sie möchten, dass das Kabel Audio von diesem spezifischen Audio-Player überträgt.
- Setzen Sie TargetInstance auf Ihren neuen AudioEmitter, um anzugeben, dass Sie möchten, dass das Kabel Audio zu diesem spezifischen Audio-Emitter innerhalb des Knopfes überträgt.
Gehen Sie zurück zum Explorer-Fenster, fügen Sie ein Script in 3DAudioButton ein, benennen Sie es in PlayAudioWhenPressed um und fügen Sie den folgenden Code in das Skript ein:
local TweenService = game:GetService("TweenService")local buttonModel = script.Parent.Parentlocal buttonPart = buttonModel.ButtonPartlocal buttonPressedAudioPlayer = buttonModel.ButtonPressedAudioPlayerlocal tweenInfo = TweenInfo.new(.2, Enum.EasingStyle.Exponential)local buttonTweenByIsPressed = {-- Gedrückt[true] = TweenService:Create(buttonPart, tweenInfo, {Size = buttonPart.Size / Vector3.new(2, 1, 1),Color = Color3.fromRGB(75, 151, 75),}),-- Standard[false] = TweenService:Create(buttonPart, tweenInfo, {Size = buttonPart.Size,Color = Color3.fromRGB(196, 40, 28),}),}local function onIsPlayingChanged()local isPlaying = buttonPressedAudioPlayer.IsPlayinglocal tween = buttonTweenByIsPressed[isPlaying]tween:Play()endonIsPlayingChanged()buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)buttonPressedAudioPlayer.Ended:Connect(onIsPlayingChanged)buttonPart.Touched:Connect(function(_hit)buttonPressedAudioPlayer:Play()end)Code-ErklärungDas Skript beginnt damit, Folgendes zu erhalten:
- Den TweenService, damit es den Teil des Knopfes animieren kann, der aus dem Boden herausragt.
- Das übergeordnete Modell 3DAudioButton des Skripts.
- Den Teil des Knopfes, der aus dem Boden herausragt.
- Den relevanten Audio-Player mit Ihrem Feier-Sound-Audiotrack.
Das Skript definiert dann:
- Ein TweenInfo-Objekt, das angibt, dass die Animation des Knopfes mit einem exponentiellen Animationsstil abgespielt wird.
- Zwei Tweens, die den gedrückten oder ungedrückten Zustand des Knopfes darstellen.
- Der true gedrückte Zustand bewegt den Knopf leicht nach unten in den Boden und färbt die Seiten des Teils mit einem grünen Farbton.
- Der false ungedrückte Zustand bewegt den Knopf zurück in seine ursprüngliche Position und entfernt den vorherigen Farbton.
Der Rest des Skripts ist der Ort, an dem der Großteil der Arbeit für das Feedback zur Objektinteraktion erfolgt, also lassen Sie uns überprüfen, wie die Funktion onIsPlayingChanged und die Ereignis-Listener zusammenarbeiten:
- buttonPart.Touched hört darauf, dass ein Spieler den Knopf berührt, und ruft dann die Funktion Play() auf, um das zugehörige Audio vom Audio-Player abzuspielen. Dieser Prozess wechselt die AudioPlayer.IsPlaying-Eigenschaft von false auf true.
- buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") hört darauf, dass sich die IsPlaying-Eigenschaft des Audio-Players ändert, und ruft dann die Funktion onIsPlayingChanged auf.
- Die Funktion onIsPlayingChanged verwendet diese Informationen, um das Tween auszulösen, das sein visuelles Erscheinungsbild im 3D-Raum ändert.
- Um zu verhindern, dass der Spieler das Audio versehentlich neu startet, wenn er schnell auf den Knopf springt, hört buttonPressedAudioPlayer.Ended darauf, dass der Audio-Player das Abspielen beendet, bevor die Funktion onIsPlayingChanged erneut aufgerufen wird.
Es ist wichtig zu beachten, dass das onIsPlayingChanged-Ereignis nur ausgelöst wird, wenn es von false auf true wechselt, was bedeutet, dass es nicht ausgelöst wird, wenn es von true auf false wechselt. Dies ist beabsichtigtes Verhalten aufgrund von Komplikationen mit der Zeit, die benötigt wird, um Eigenschaften vom Server zum Client zu replizieren. Aus diesem Grund wird das Ended-Ereignis in diesem Beispiel bereitgestellt und gehört, um beide Fälle abzudecken.
Testen Sie das Spiel, um den Feier-Sound zu hören, wenn Ihr Spielercharakter den 3D-Knopf im Lebkuchenhaus berührt. Wenn Sie sich vom Knopf entfernen, verringert sich die Lautstärke des Sounds.
Charakterdialog
Richtungsabhängiges Audio von Ihren nicht spielbaren Charakteren (NPC) bereitzustellen, ist hilfreich, um Spieler zu interessanten Punkten in ihrer Umgebung zu führen und die Interaktionen mit anderen Charakteren zu vertiefen. Tatsächlich verwenden viele Designer in narrativ getriebenen Spielen strategisch Charakterdialoge, um den Spielern indirekt etwas über ihren Charakter, Verbündete und Feinde oder die Welt selbst beizubringen.
Häufige Beispiele für diese Technik sind:
- Dialogstil, um den Ton Ihres Spiels festzulegen.
- Gespräche, um den Spielern etwas über die Beziehungen zwischen Charakteren beizubringen.
- Feindgespräche, um Motivationen oder ihre Position in Bezug auf den Spieler zu offenbaren.
- Spielercharaktere, die ihre Gedanken laut aussprechen, um den Spieler sanft zu führen, was er als Nächstes tun sollte, wie sich heilen, an einen anderen Ort gehen oder einen Gegenstand finden.
- Verbündete Charaktere, die mit dem Spielercharakter sprechen, um Details über die Spielwelt wie ihre Geschichte, Kultur und soziale Probleme zu enthüllen.
Um zu demonstrieren, wie dies in der Praxis aussehen kann, überprüfen wir das folgende einmalige 3D-Audio aus Beyond the Dark, das periodisch abgespielt wird, wenn sich die Spieler im Hauptlobbybereich der Raumstation befinden.
Die Raumstation als Charakter verwendet diesen Dialogclip, um den Spielern wichtige Kontexte und Geschichten über die gesamte Umgebung zu geben. Zum Beispiel erfahren die Spieler aus diesem einzigen Satz:
- Sie befinden sich im Weltraum, speziell auf einer Raumstation namens Kerr-Newman Deep Space Relay 14.
- Ihre Umgebung ist futuristisch und einladend.
- Sie sind ein Besucher und werden wahrscheinlich bald gehen.
Diese Details tauchen die Spieler in ihre Umgebung ein und verleihen ihrer Mission ein Gefühl der Dringlichkeit. Wenn die Spieler jedoch nicht wissen, was ihre Hauptmission ist, können Sie auch den Charakterdialog verwenden, um die Spieler darüber zu informieren, was Sie möchten, dass sie in Ihrem Spiel tun.
Um dies zu veranschaulichen, verwendet das Beispiel ein Volumen, oder einen unsichtbaren Bereich innerhalb des 3D-Raums, um den Charakterdialog des Schneemanns auszulösen, um die Spieler zu führen, drei Gummibärchen zu sammeln, um die Tür zu seinem Zuhause zu öffnen. Da dies eines der ersten Dinge ist, die die Spieler sehen, wenn sie dem Spiel beitreten, ist es wahrscheinlicher, dass sie den Dialog auslösen und wissen, was sie tun müssen, um erfolgreich zu sein.

Um das einmalige Charakterdialog-3D-Audio im Beispiel Gingerbread House - Complete Audio zu reproduzieren:
Navigieren Sie im Explorer-Fenster zu Workspace ⟩ DialogueVolume, dann:
- Fügen Sie ein AudioPlayer-Objekt hinzu, um eine Audioquelle für das Volumen zu erstellen.
- Fügen Sie ein AudioEmitter-Objekt hinzu, um einen positionsabhängigen Stream von DialogueVolume auszugeben.
- Fügen Sie ein Wire-Objekt hinzu, um den Stream vom Audio-Player zum Audio-Emitter zu übertragen.

Wählen Sie den AudioPlayer aus, und setzen Sie im Properties-Fenster AssetID auf rbxassetid://92917410841704, um einen instruktiven Audiotrack für das Ziel des Spiels abzuspielen.
Wählen Sie das Wire-Objekt aus, und setzen Sie im Properties-Fenster:
- Setzen Sie SourceInstance auf Ihren neuen AudioPlayer, um anzugeben, dass Sie möchten, dass das Kabel Audio von diesem spezifischen Audio-Player überträgt.
- Setzen Sie TargetInstance auf Ihren neuen AudioEmitter, um anzugeben, dass Sie möchten, dass das Kabel Audio zu diesem spezifischen Audio-Emitter innerhalb des Volumens überträgt.
Gehen Sie zurück zum Explorer-Fenster, navigieren Sie zu StarterPlayer ⟩ StarterCharacterScripts, fügen Sie ein LocalScript hinzu, benennen Sie es in PlayAudioWhenInVolume um und fügen Sie den folgenden Code in das lokale Skript ein:
local Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local humanoid = script.Parent:WaitForChild("Humanoid")local volumeDetector = Workspace.DialogueVolumelocal trigger = humanoid:WaitForChild("Animator")local debounce = falselocal localPlayer = Players.LocalPlayervolumeDetector.Touched:Connect(function(hit)if debounce thenreturnendlocal hitCharacter = hit:FindFirstAncestorWhichIsA("Model")local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)if hitPlayer ~= localPlayer thenreturnenddebounce = truelocal audioPlayer = Workspace.DialogueVolume.AudioPlayeraudioPlayer:Play()audioPlayer.Ended:Wait()debounce = falseend)Code-ErklärungDieses Skript beginnt damit, die Dienste Workspace und Players zu erhalten, damit es auf deren Kinder und Funktionalitäten zugreifen kann. Für jeden Spielercharakter, der ins Spiel geladen oder zurück ins Spiel respawnt, wartet das Skript auf:
- Das Volumenobjekt im Workspace mit dem Namen DialogueVolume.
Wenn etwas mit dem Volumen kollidiert, erhält die Touched-Ereignis-Handlerfunktion den ersten Vorfahren, der ein Model ist, was der Charakter sein sollte, wenn das BasePart, das mit dem Volumen kollidiert ist, ein Nachkomme eines Charaktermodells ist. Wenn dies der Fall ist, führt die Funktion Folgendes aus:
- Setzt debounce auf true.
- Spielt das Audio ab und wartet, bis es endet.
- Setzt debounce zurück auf false.
Das Setzen von debounce von false auf true und dann wieder auf false, nachdem das Audio zu Ende gespielt wurde, ist ein Debounce-Muster, das verhindert, dass das Audio wiederholt ausgelöst wird, während die Spieler kontinuierlich mit dem Volumen kollidieren. Für weitere Informationen zu diesem Debounce-Muster siehe Debounce - Kollisionen erkennen.
Testen Sie das Spiel, um den instruktiven Charakterdialog zu hören, wenn Ihr Spielercharakter das Volumen um den Schneemann berührt.