3D-Audio ist richtiger Klang, der von einem bestimmten Standort im 3D-Raum ausgegeben wird, dessen Lautstärke je nach Entfernung und Ausrichtung zwischen dem Audioemitter und dem Zuhörer zunimmt oder abnimmt. Das bedeutet, dass Spieler dieses Audio aus verschiedenen Richtungen und Lautstärken dynamisch hören können, während sie sich im Umfeld bewegen.
Unter Verwendung der Gingerbread House - Start .rbxl-Datei als Ausgangspunkt und Gingerbread House - Complete Audio als Referenz zeigt dieses Tutorial, wie Sie sowohl sich wiederholenden als auch einmaligen 3D-Audio hinzufügen können. Es bietet auch Anleitungen zu:
- Sich 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.
- Aktivierung von Audio, um den Spielern akustisches Feedback zu geben, wenn sie mit 3D-Objekten interagieren.
- Abspielen von Charakter-Soundbissen, die Spieler anregen und zu interessanten Punkten in ihrer Umgebung führen.
Wenn Sie während des Prozesses stecken bleiben, können Sie Gingerbread House - Complete Audio als Referenz verwenden, um Ihren Fortschritt zu vergleichen.
Audioobjekte
Um räumlichen 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.
- Das AudioEmitter-Objekt ist ein virtueller Lautsprecher, der Audio in die 3D-Umgebung abgibt.
- Das AudioListener-Objekt ist ein virtuelles Mikrofon, das Audio aus der 3D-Umgebung aufnimmt.
- Das AudioDeviceOutput-Objekt ist ein physisches Hardware-Gerät in der realen Welt, wie ein Lautsprecher oder Kopfhörer.
- Das AudioDeviceInput-Objekt ist ein physisches Mikrofon in der realen Welt.
- Wires transportieren Audiostreams von einem Objekt zum anderen.
All diese Audioobjekte arbeiten zusammen, um Klang so zu emittieren, wie ihre realen Pendants. Werfen wir einen Blick darauf, wie das in der Praxis funktioniert, indem wir ein Beispiel eines Spielers betrachten, der ein Headset trägt, während er mit seinem Laptop ein Erlebnis spielt:
- Das AudioPlayer lädt die Audiomaterial-ID 1516791621 in das Erlebnis für eine Regenmelodie.
- Das AudioEmitter gibt einen Stream der Regenmelodie in die 3D-Umgebung aus.
- Ein Wire transportiert den Stream vom AudioPlayer zum AudioEmitter, damit der Stream aus dem 3D-Lautsprecher kommt.
- Das Kind-Objekt AudioListener des Charakters hört diesen Klang innerhalb der 3D-Umgebung und gibt ihn an ihr Headset weiter.
- Das AudioDeviceOutput-Objekt leitet den Klang vom AudioListener zum physischen Lautsprecher des Spielers oder in diesem Fall zu ihren Kopfhörern.
- Das AudioDeviceInput-Objekt erfasst Geräusche aus der realen Welt und gibt sie in das Erlebnis für Sprach-Chat zurück.


Die folgenden Abschnitte gehen weiter ins Detail und beziehen sich auf diese Objekte, während Sie lernen, wie man sowohl sich wiederholenden als auch einmaligen 3D-Audio abspielt. Während Sie diese Objekte mit den kommenden Techniken überprüfen, können Sie genauer vorhersagen, wie man Klang vom Erlebnis zum Spieler und umgekehrt aufnimmt und weitergibt.
Sich wiederholendes Audio
Sich wiederholendes 3D-Audio, oder richtiger Audio, der nahtlos wiederholt wird, sobald Spieler sich mit dem Server verbinden, ist eine gängige Klangdesigntechnik, um die Atmosphäre des 3D-Raums zu verbessern, indem er lebendig und dynamisch wirkt. Außerdem sorgt sich 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örten, würde die Umgebung unrealistisch erscheinen.
Um dieses Konzept zu demonstrieren, sehen Sie, wie das folgende 3D-Audio für zwei große Wasserfälle stoppt, sobald die nicht wiederholte Audiostrecke vollständig ist. Während die Geräusche des Wassers die Spieler anfangs in die Außenumgebung eintauchen, ist die plötzliche auditive Veränderung störend und unnatürlich zu dem, wie sich ein Wasserfall in der realen Welt verhält.
In ähnlicher Weise verwendet das Beispiel diese Technik für den fließenden Schokoladenwasserfall und passt seine Lautstärke je nach Abstand des Spielers vom Audioemitter an. Wenn der Spieler weniger als 20 Studs entfernt ist, erfolgt die Emission des Schalls mit voller Lautstärke. Wenn der Spieler sich weiter entfernt, nimmt die plätschernde Audio-Lautstärke alle 20 Studs vom Audioemitter ab. Dies emuliert den Klang aus der realen Welt, der leiser wird, je weiter man sich von der Quelle entfernt.
Um das sich wiederholende 3D-Audio im Beispiel Gingerbread House - Complete Audio zu reproduzieren:
Aktivieren Sie einen Standardhörer, der an Ihrem Spielercharakter angebracht ist.
- Wählen Sie im Explorer-Fenster den SoundService aus.
- Setzen Sie im Properties-Fenster DefaultListenerLocation auf Character. Wenn Sie das Erlebnis ausführen, erstellt die Engine automatisch:
- Ein AudioListener unter dem Humanoid.RootPart jedes Spielercharakters, damit Sie die Geräusche entsprechend der Position und dem Maßstab der Klangquellen im Erlebnis in Ihren echten Lautsprechern 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 positionellen Stream von WaterfallAudioObject auszugeben.
- Fügen Sie ein Wire-Objekt hinzu, um den Stream vom Audioplayer zum Audioemitter zu transportieren.

Wählen Sie den AudioPlayer aus, und setzen Sie dann im Properties-Fenster:
- AssetID auf rbxassetid://1516791621, um eine Regengeräuschspur abzuspielen.
- Aktivieren Sie Looping, damit das Audio nahtlos wiederholt wird.
Wählen Sie den AudioEmitter aus, und setzen Sie dann im Properties-Fenster DistanceAttenuation auf {0: 1}, {20: 0.8}, {40: 0.4}, {80: 0}, sodass der Schall bei jeder Entfernung von 20 Studs vom Audioemitter allmählich in der Lautstärke abnimmt.
Wählen Sie das Wire aus, und setzen Sie dann im Properties-Fenster:
- SourceInstance auf Ihren neuen AudioPlayer, um anzugeben, dass Sie möchten, dass das Kabel Audio von diesem speziellen Audioplayer transportiert.
- TargetInstance auf Ihren neuen AudioEmitter, um anzugeben, dass Sie möchten, dass das Kabel Audio zu diesem speziellen Audioemitter im Wasserfall transportiert.
Navigieren Sie zurück zum Explorer-Fenster, fügen Sie ein Script in WaterfallAudioObject ein, benennen Sie es um in LoopWaterfallMusic, 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 Elternteil des Skripts AudioPlayer repräsentiert. Das Skript setzt dann die Audioquelle so, dass sie ab dem Moment, in dem der Spieler dem Erlebnis beitritt, bis zu dem Moment, in dem sie das Erlebnis verlassen, abgespielt wird.
Testen Sie das Erlebnis, um den sich wiederholenden Sound des Schokoladenregens 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 echten Lautsprechern entsprechend der Position des Emitters im 3D-Raum.
Einmaliges Audio
Einmaliges 3D-Audio, oder richtiger Audio, der einmal zu einem bestimmten Zeitpunkt und an einem bestimmten Standort abgespielt wird, es sei denn, ein Spieler löst es erneut aus, gibt den Spielern Kontext über ihre Aktionen, die Umgebung und alle Charaktere um sie herum. Die Verwendung dieser Art von auditivem Feedback in Ihren Erlebnissen ist entscheidend, da sie es den Spielern ermöglicht, strategische Entscheidungen zu treffen, wie das Vermeiden von herannahenden Feinden oder das Aufnehmen nützlicher Gegenstände.
Die folgenden Abschnitte geben Implementierungsdetails für gängige Spielszenarien, in denen Spieler zeitnahes, gerichtetes Feedback benötigen, einschließlich situativer Gameplay-Ereignisse, Objektinteraktion und Dialoge mit nicht spielbaren Charakteren.
Ereignis-Feedback
Wenn Spieler wichtige situative Ereignisse in ihrer Umgebung auslösen, wie das Freischalten neuer Spielbereiche oder das Auslösen von Feindbeschuss, ist es wichtig, dass sie verstehen, wohin sie sich im 3D-Raum konzentrieren und ihre Aufmerksamkeit lenken müssen. Wenn sie kein sofortiges auditives 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 hin müssen oder was sie als nächstes tun sollen.
Um zu demonstrieren, warum dies wichtig ist, betrachten wir das einmalige 3D-Audio aus der Laser Tag-Vorlage, das von jedem Spielerblaster abgegeben wird:
- Ein tiefes Plopp-Geräusch ertönt bei jedem Schuss, den der Spieler aus seinem Blaster abfeuert.
- Ein Klick- und Roboterpiepston ertönt jedes Mal, wenn der Spieler seinen Blaster mit einer neuen Runde nachlädt.
Beide Geräusche bieten situative Bewusstheit, indem sie alle nahegelegenen Spieler darüber informieren, aus welcher Richtung die Schüsse kommen, damit sie informierte Entscheidungen treffen können, um entweder den Spaß mitzumachen oder potenzielle Gefahren zu vermeiden.
Das Beispiel verwendet dieselbe Technik, um Spieler über ihre Belohnung zu informieren, die sie für das Abschließen des Hauptziels in dem Erlebnis erhalten. Nachdem sie alle drei Gumdrops gesammelt haben, öffnet sich die Tür zum Lebkuchenhaus, um den Spielern Zugang zu dem Geschenk im Inneren zu gewähren.
Da es keine spezifische Reihenfolge gibt, in der die Spieler die Gumdrops sammeln müssen, ist es wichtig, dass die Spieler sich der Türöffnung bewusst sind, egal welchen Gumdrop sie zuletzt sammeln. Räumlicher Klang macht das möglich, damit die Spieler sich ihres Erfolgs und dessen bewusst sind, wo sie als nächstes hingehen müssen, 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 die Lautstärke zu erstellen.
- Fügen Sie ein AudioEmitter-Objekt hinzu, um einen positionellen Stream von Door abzugeben.
- Fügen Sie ein Wire-Objekt hinzu, um den Stream vom Audioplayer zum Audioemitter zu transportieren.

Wählen Sie den AudioPlayer aus, und setzen Sie dann im Properties-Fenster AssetID auf rbxassetid://5930776613, um eine Audio-Tracks für sich öffnende Metalltüren abzuspielen.
Wählen Sie das Wire aus, und setzen Sie dann im Properties-Fenster:
- SourceInstance auf Ihre neue AudioPlayer, um festzulegen, dass Sie möchten, dass das Kabel Audio von diesem spezifischen Audioplayer transportiert.
- TargetInstance auf Ihren neuen AudioEmitter, um festzulegen, dass Sie möchten, dass das Kabel Audio zu diesem spezifischen Audioemitter innerhalb der Lautstärke transportiert.
Navigieren Sie zurück zum Explorer-Fenster, gehen Sie zu ServerScriptService, fügen Sie ein Script ein, benennen Sie es um in GumdropService, setzen Sie die RunContext-Eigenschaft auf Server, und fügen Sie den folgenden Code in das Skript ein:
-- Initialisierung von Variablenlocal 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)-- Update der Gumdrop-Tabellelocal newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)-- Update der Gumdrop-LeaderboardLeaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)-- Überprüfen, ob der Spieler drei Gumdrops gesammelt hatif newGumdropAmount >= 3 then-- Spielen Sie die Türereignis-Audio, wenn der Spieler drei Gumdrops gesammelt hatlocal audioPlayer = Workspace.Door.AudioPlayeraudioPlayer:Play()-- Animieren Sie die Tür, damit sie nach unten bewegt wirdlocal 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-- Definition des Ereignis-Handlerslocal function onGumdropTouched(otherPart, gumdrop)if gumdrop:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Spieler hat einen Gumdrop 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 Gumdrop 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, indem es die Workspace, Players, ServerStorage und TweenService-Dienste initialisiert, damit es deren Kinder und Funktionalität referenzieren kann. Dann erfordert es die Module Leaderboard und PlayerData in ServerStorage; diese Module sind verantwortlich für die Erstellung und Aktualisierung einer Bestenliste in der oberen rechten Ecke des Bildschirms, die verfolgt, wie viele Gumdrops 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 zur Ereignisrückmeldung durchgeführt wird, und sie nimmt zwei Argumente:
- player - Ein Spieler, der einen Gumdrop sammelt.
- updateFunction - Eine Callback-Funktion, die die Anzahl der gesammelten Gumdrops des Spielers aktualisiert.
Wenn ein Spieler mit einem Gumdrop kollidiert, macht das Skript folgendes:
- Erhält den neuen Wert der gesammelten Gumdrops des Spielers, indem es die Funktion PlayerData.updateValue aufruft.
- Aktualisiert die Bestenliste mit dieser neuen Anzahl, indem es die Funktion Leaderboard.setStat aufruft.
- Überprüft, ob die Anzahl größer oder gleich 3 ist.
Wenn dieser Wert größer oder gleich 3 ist, macht das Skript folgendes:
- Spielt die 3D-Audio-Spur vom Audioplayer zum Audioemitter ab.
- Bewegt die Tür linear 15 Studs unter ihrer aktuellen Position.
Der Rest des Skripts ist hauptsächlich dafür zuständig zu erkennen, dass alles, was mit dem Gumdrop kollidiert, ein Spieler ist, damit es ein nicht-räumliches Geräusch für Rückmeldungen beim Einsammeln auslösen kann. Weitere Informationen zu diesem Teil des Skripts finden Sie unter 2D-Audio hinzufügen - Gameplay-Rückmeldungen.
Testen Sie das Erlebnis, um das Geräusch des metallischen Gate zu hören, nachdem Sie alle drei Gumdrops in der Umgebung gesammelt haben. Wenn Sie die Kamera rotieren, verschiebt sich der Klang dynamisch in Ihren echten Lautsprechern, sodass Sie ihn gemäß der Position des Emitters im 3D-Raum hören.
Objektinteraktion
Wenn Spieler mit 3D-Objekten in ihrer Umgebung interagieren, wie z.B. einen Lichtschalter einzuschalten oder eine Waffe aufzuheben, ist es wichtig, sofortige Rückmeldungen zu geben, damit sie intuitiv verstehen, wie sie mit dem Objekt interagieren. Die Kombination aus visuellen und auditiven Rückmeldungen verstärkt die Ursache-Wirkungs-Beziehung zwischen den Aktionen des Spielers und der Reaktion der Umgebung.
Um dieses Konzept weiter auszuführen, betrachten 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 Klick-Geräusch ertönt, wenn der Spieler die volle Pflanze abholt.
- Ein sanftes Geräusch ertönt, wenn der Spieler den Kohl in den Wagen legt.
Alle diese Geräusche verstärken die Proximitätsaufforderung des Spielers, wenn er mit dem Objekt in der 3D-Umgebung interagiert. Für Spieler mit Sehbehinderungen, bei denen Farbänderungen oder Animationen schwieriger zu erkennen sind, helfen diese mehrfachen Formen der sensorischen Rückmeldung, dass Ihre Interaktionen mit 3D-Objekten zugänglich und intuitiv für so viele Spieler wie möglich bleiben.
Um ein anderes Beispiel dafür zu geben, wie Sie die Objektinteraktion mit mehreren Formen der sensorischen Rückmeldung gestalten können, bietet das Beispiel sowohl visuelle als auch akustische Rückmeldung, wann immer Spieler auf den 3D-Pfefferminzknopf innerhalb des Lebkuchenhauses treten. Wenn die Spieler nicht mit dem Knopf interagieren, sieht er wie eine typische Pfefferminzbonbon aus, aber wenn sie auf den Knopf treten, spielt das Beispiel:
- Ein feierliches Jingle-Audio.
- Tintet die Seiten des Knopfes mit einem grünen Farbton.
- Bewegt den Knopf in den Boden.
Von hier aus können Sie diese Interaktion mit all den einzigartigen Gameplay-Aktionen verbinden, wie z.B. das Freischalten eines Objekts oder das Auslösen einer speziellen Fähigkeit.


Um die einmalige Objektinteraktion in 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 positionellen Stream von 3DAudioButton auszugeben.
- Fügen Sie ein Wire-Objekt hinzu, um den Stream vom Audioplayer zum Audioemitter zu transportieren.

Wählen Sie den AudioPlayer aus und setzen Sie dann im Properties-Fenster AssetID auf rbxassetid://1846248593, um einen fröhlichen, feierlichen Audiotrack abzuspielen.
Wählen Sie das Wire aus und setzen Sie dann im Properties-Fenster:
- SourceInstance auf Ihren neuen AudioPlayer, um festzulegen, dass Sie möchten, dass das Kabel Audio von diesem spezifischen Audioplayer transportiert.
- TargetInstance auf Ihren neuen AudioEmitter, um festzulegen, dass Sie möchten, dass das Kabel Audio zu diesem spezifischen Audioemitter innerhalb des Knopfes transportiert.
Navigieren Sie zurück zum Explorer-Fenster, fügen Sie ein Script in 3DAudioButton ein, benennen Sie es um in PlayAudioWhenPressed, 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, zu holen:
- Das TweenService, damit es den Teil des Knopfes animieren kann, der aus dem Boden herausragt.
- Das Elternmodell 3DAudioButton des Skripts.
- Den Teil des Knopfes, der aus dem Boden herausragt.
- Den relevanten Audio-Player mit Ihrem Feiersounds-Audio-Track.
Das Skript definiert dann:
- Ein TweenInfo-Objekt, das festlegt, 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 Parts mit einem grünen Farbton ein.
- Der false ungedrückte Zustand bewegt den Knopf zurück in seine ursprüngliche Position und entfernt die vorherige Färbung.
Der Rest des Skripts ist dort, wo der Großteil der Arbeit für das Feedback zur Objektinteraktion verrichtet wird, sodass wir uns ansehen, wie die Funktion onIsPlayingChanged und die Ereignis-Listener zusammenarbeiten:
- buttonPart.Touched lauscht, ob ein Spieler den Knopf berührt, und ruft dann die Play()-Funktion auf, um das zugehörige Audio vom Audioplayer abzuspielen. Dieser Prozess wechselt den AudioPlayer.IsPlaying-Eigenschaft von false auf true.
- buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") lauscht, ob sich die IsPlaying-Eigenschaft des Audioplayers ä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 verändert.
- Um sicherzustellen, dass der Spieler nicht versehentlich den Audio neu startet, wenn er schnell auf den Knopf springt, lauscht buttonPressedAudioPlayer.Ended, bis der Audio-Player aufhört zu spielen, bevor er die Funktion onIsPlayingChanged erneut aufruft.
Es ist wichtig zu beachten, dass das onIsPlayingChanged-Ereignis nur dann ausgelöst wird, wenn es von false nach true wechselt, was bedeuten soll, dass es nicht ausgelöst wird, wenn es von true nach false wechselt. Dies ist beabsichtigtes Verhalten aufgrund von Komplikationen mit dem Timing beim Replizieren von Eigenschaften vom Server zum Client. Aus diesem Grund wird das Ended`-Ereignis in diesem Beispiel bereitgestellt und gehört, um beide Fälle abzudecken.
Testen Sie das Erlebnis, um den Feier-Sound zu hören, wenn Ihr Spielercharakter den 3D-Knopf im Lebkuchenhaus berührt. Wenn Sie sich vom Knopf entfernen, nimmt die Lautstärke des Klangs ab.
Charakterdialog
Die Bereitstellung von gerichteten Audio von Ihren nicht spielbaren Charakteren (NPC) ist hilfreich, um Spieler zu Punkten von Interesse in ihrer Umgebung zu führen und die Interaktionen mit anderen Charakteren zu vertiefen. Tatsächlich verwenden viele Designer in erzählerisch getriebenen Erlebnissen strategisch Charakterdialog, um den Spielern indirekt über ihren Charakter, verbündete und feindliche Charaktere oder die Welt an sich zu lehren.
Gängige Beispiele für diese Technik sind:
- Dialektstil, um den Ton Ihres Erlebnisses zu setzen.
- Banter, um Spielern über die Beziehungen der Charaktere zu vermitteln.
- Feindgespräche, um Motivationen oder ihre Position im Verhältnis zum Spieler zu gestehen.
- Spielercharaktere, die ihre Gedanken laut aussprechen, um den Spieler sanft zu führen, was sie als nächstes tun sollten, wie sich selbst zu heilen, an einen anderen Ort zu gehen oder einen Gegenstand zu finden.
- Verbündete Charaktere sprechen mit dem Spielercharakter, um Details zur Welt innerhalb des Erlebnisses wie deren Geschichte, Kultur und soziale Probleme zu enthüllen.
Um zu demonstrieren, wie das in der Praxis aussehen kann, betrachten wir das folgende einmalige 3D-Audio aus Beyond the Dark, das regelmäßig abgespielt wird, wenn sich die Spieler im Hauptlobbybereich der Raumstation befinden.
Wenn die Raumstation als Charakter verwendet wird, gibt dieser Dialogclip den Spielern wichtige Kontextinformationen und Überlieferungen über das gesamte Setting. 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 gemeinsam tauchen die Spieler in ihre Umgebung ein und fügen ihrer Mission ein Gefühl von Dringlichkeit hinzu. Wenn die Spieler jedoch nicht wissen, was ihre Hauptmission ist, können Sie auch Charakterdialog verwenden, um sie darüber zu informieren, was sie in Ihrem Erlebnis tun sollen.
Um zu verdeutlichen, 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 Gumdrops zu sammeln, um die Tür zu seinem Haus zu öffnen. Als eines der ersten Dinge, die die Spieler sehen, wenn sie dem Erlebnis beitreten, sind sie wahrscheinlicher, den Dialog auszulösen und zu wissen, was sie tun müssen, um erfolgreich zu sein.

Um das einmalige 3D-Audio für den Charakterdialog 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 positionellen Stream von DialogueVolume auszugeben.
- Fügen Sie ein Wire-Objekt hinzu, um den Stream vom Audioplayer zum Audioemitter zu transportieren.

Wählen Sie den AudioPlayer aus, und setzen Sie dann im Properties-Fenster AssetID auf rbxassetid://92917410841704, um einen instruktiven Audiotrack für das Ziel des Erlebnisses abzuspielen.
Wählen Sie das Wire aus, und setzen Sie dann im Properties-Fenster:
- SourceInstance auf Ihren neuen AudioPlayer, um festzulegen, dass Sie möchten, dass das Kabel Audio von diesem spezifischen Audioplayer transportiert.
- TargetInstance auf Ihren neuen AudioEmitter, um festzulegen, dass Sie möchten, dass das Kabel Audio zu diesem spezifischen Audioemitter innerhalb des Volumens transportiert.
Navigieren Sie zurück zum Explorer-Fenster, gehen Sie zu StarterPlayer ⟩ StarterCharacterScripts, fügen Sie ein LocalScript hinzu, benennen Sie es um in PlayAudioWhenInVolume, 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, indem es die Dienste Workspace und Players abruft, damit es deren Kinder und Funktionalität referenzieren kann. Für jeden Spielercharakter, der in das Erlebnis geladen oder zurückgesetzt wird, wartet das Skript auf:
- Das Volumenobjekt im Arbeitsbereich 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, ein Nachkomme eines Charaktermodells ist. Wenn dem so ist, macht die Funktion:
- Setzt Debounce auf true.
- Spielt das Audio ab und wartet, bis es endet.
- Setzt Debounce wieder auf false.
Das Setzen von Debounce von false auf true und dann wieder auf false nach dem Audio wird eine Debounce-Muster, das das wiederholte Auslösen des Tons verhindert, wenn Spieler kontinuierlich mit dem Volumen kollidieren. Weitere Informationen zu diesem Debounce-Muster finden Sie unter Debounce - Kollisionen erkennen.
Testen Sie das Erlebnis, um den instruktiven Charakterdialog zu hören, wenn Ihr Spielercharakter das Volumen um den Schneemann berührt.