3D-Audio hinzufügen

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

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.
Objektrepräsentationen im Spiel
Objektrepräsentationen in der realen Welt

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:

  1. Aktivieren Sie einen Standardlistener, der an Ihrem Spielercharakter befestigt ist.

    1. Wählen Sie im Explorer-Fenster den SoundService aus.
    2. 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.
  2. Navigieren Sie im Explorer-Fenster zu WorkspaceWaterfallAudioObject, dann:

    1. Fügen Sie ein AudioPlayer-Objekt hinzu, um eine Audioquelle für den Wasserfall zu erstellen.
    2. Fügen Sie ein AudioEmitter-Objekt hinzu, um einen positionsabhängigen Stream von WaterfallAudioObject auszugeben.
    3. Fügen Sie ein Wire-Objekt hinzu, um den Stream vom Audio-Player zum Audio-Emitter zu übertragen.
  3. Wählen Sie den AudioPlayer aus, und setzen Sie im Properties-Fenster:

    1. Setzen Sie AssetID auf rbxassetid://1516791621, um einen Regen-Audiotrack abzuspielen.
    2. Aktivieren Sie Looping, damit das Audio nahtlos wiederholt wird.
  4. 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.

  5. Wählen Sie das Wire-Objekt aus, und setzen Sie im Properties-Fenster:

    1. Setzen Sie SourceInstance auf Ihren neuen AudioPlayer, um anzugeben, dass Sie möchten, dass das Kabel Audio von diesem spezifischen Audio-Player überträgt.
    2. 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.
  6. 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.Parent
    audioPlayer:Play()

    Das 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.

  7. 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:

  1. Navigieren Sie im Explorer-Fenster zu WorkspaceDoor, dann:

    1. Fügen Sie ein AudioPlayer-Objekt hinzu, um eine Audioquelle für das Volumen zu erstellen.
    2. Fügen Sie ein AudioEmitter-Objekt hinzu, um einen positionsabhängigen Stream von Door auszugeben.
    3. Fügen Sie ein Wire-Objekt hinzu, um den Stream vom Audio-Player zum Audio-Emitter zu übertragen.
  2. 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.

  3. Wählen Sie das Wire-Objekt aus, und setzen Sie im Properties-Fenster:

    1. Setzen Sie SourceInstance auf Ihren neuen AudioPlayer, um anzugeben, dass Sie möchten, dass das Kabel Audio von diesem spezifischen Audio-Player überträgt.
    2. 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.
  4. 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 initialisieren
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    local TweenService = game:GetService("TweenService")
    -- Module
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    -- Variablen
    local gumdropsFolder = Workspace.Gumdrops
    local gumdrops = gumdropsFolder:GetChildren()
    local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAME
    local GUMDROP_AMOUNT_TO_ADD = 1
    local function updatePlayerGumdrops(player, updateFunction)
    -- Aktualisieren der Gummibärchen-Tabelle
    local newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)
    -- Aktualisieren des Gummibärchen-Leaderboards
    Leaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)
    -- Überprüfen, ob der Spieler drei Gummibärchen gesammelt hat
    if newGumdropAmount >= 3 then
    -- Spielen Sie das Türereignis-Audio ab, wenn der Spieler drei Gummibärchen gesammelt hat
    local audioPlayer = Workspace.Door.AudioPlayer
    audioPlayer:Play()
    -- Animieren Sie die Tür, um nach unten zu bewegen
    local doorPart = Workspace.Door
    local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Linear)
    local tween = TweenService:Create(doorPart, tweenInfo, {Position = doorPart.Position + Vector3.new(0, -15, 0)})
    tween:Play()
    end
    end
    -- Definieren des Ereignis-Handlers
    local function onGumdropTouched(otherPart, gumdrop)
    if gumdrop:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- Spieler hat ein Gummibärchen berührt
    local audioPlayer = gumdrop.AudioPlayer
    audioPlayer:Play()
    gumdrop.Transparency = 1
    gumdrop:SetAttribute("Enabled", false)
    updatePlayerGumdrops(player, function(oldGumdropAmount)
    oldGumdropAmount = oldGumdropAmount or 0
    return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADD
    end)
    print("Spieler hat Gummibärchen gesammelt")
    end
    end
    end
    -- Einrichten der Ereignis-Listener
    for _, gumdrop in gumdrops do
    gumdrop:SetAttribute("Enabled", true)
    gumdrop.Touched:Connect(function(otherPart)
    onGumdropTouched(otherPart, gumdrop)
    end)
    end

    Das 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.

  5. 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.

Standardansicht
Gedrückter Zustand

Um das einmalige Objektinteraktions-3D-Audio im Beispiel Gingerbread House - Complete Audio zu reproduzieren:

  1. Navigieren Sie im Explorer-Fenster zu Workspace3DAudioButton, dann:

    1. Fügen Sie ein AudioPlayer-Objekt hinzu, um eine Audioquelle für den Knopf zu erstellen.
    2. Fügen Sie ein AudioEmitter-Objekt hinzu, um einen positionsabhängigen Stream von 3DAudioButton auszugeben.
    3. Fügen Sie ein Wire-Objekt hinzu, um den Stream vom Audio-Player zum Audio-Emitter zu übertragen.
  2. Wählen Sie den AudioPlayer aus, und setzen Sie im Properties-Fenster AssetID auf rbxassetid://1846248593, um einen fröhlichen, feierlichen Audiotrack abzuspielen.

  3. Wählen Sie das Wire-Objekt aus, und setzen Sie im Properties-Fenster:

    1. Setzen Sie SourceInstance auf Ihren neuen AudioPlayer, um anzugeben, dass Sie möchten, dass das Kabel Audio von diesem spezifischen Audio-Player überträgt.
    2. 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.
  4. 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.Parent
    local buttonPart = buttonModel.ButtonPart
    local buttonPressedAudioPlayer = buttonModel.ButtonPressedAudioPlayer
    local 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.IsPlaying
    local tween = buttonTweenByIsPressed[isPlaying]
    tween:Play()
    end
    onIsPlayingChanged()
    buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)
    buttonPressedAudioPlayer.Ended:Connect(onIsPlayingChanged)
    buttonPart.Touched:Connect(function(_hit)
    buttonPressedAudioPlayer:Play()
    end)

    Das 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:

    1. 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.
    2. buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") hört darauf, dass sich die IsPlaying-Eigenschaft des Audio-Players ändert, und ruft dann die Funktion onIsPlayingChanged auf.
    3. Die Funktion onIsPlayingChanged verwendet diese Informationen, um das Tween auszulösen, das sein visuelles Erscheinungsbild im 3D-Raum ändert.
    4. 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.

  5. 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.

Das Volumen um den Schneemann verwendet Kollisionsfeedback, um Audio abzuspielen, wenn Spieler den 3D-Bereich betreten.

Um das einmalige Charakterdialog-3D-Audio im Beispiel Gingerbread House - Complete Audio zu reproduzieren:

  1. Navigieren Sie im Explorer-Fenster zu WorkspaceDialogueVolume, dann:

    1. Fügen Sie ein AudioPlayer-Objekt hinzu, um eine Audioquelle für das Volumen zu erstellen.
    2. Fügen Sie ein AudioEmitter-Objekt hinzu, um einen positionsabhängigen Stream von DialogueVolume auszugeben.
    3. Fügen Sie ein Wire-Objekt hinzu, um den Stream vom Audio-Player zum Audio-Emitter zu übertragen.
  2. 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.

  3. Wählen Sie das Wire-Objekt aus, und setzen Sie im Properties-Fenster:

    1. Setzen Sie SourceInstance auf Ihren neuen AudioPlayer, um anzugeben, dass Sie möchten, dass das Kabel Audio von diesem spezifischen Audio-Player überträgt.
    2. 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.
  4. Gehen Sie zurück zum Explorer-Fenster, navigieren Sie zu StarterPlayerStarterCharacterScripts, 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.DialogueVolume
    local trigger = humanoid:WaitForChild("Animator")
    local debounce = false
    local localPlayer = Players.LocalPlayer
    volumeDetector.Touched:Connect(function(hit)
    if debounce then
    return
    end
    local hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
    local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)
    if hitPlayer ~= localPlayer then
    return
    end
    debounce = true
    local audioPlayer = Workspace.DialogueVolume.AudioPlayer
    audioPlayer:Play()
    audioPlayer.Ended:Wait()
    debounce = false
    end)

    Dieses 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 Humanoid und Animator-Objekte des Charakters.
    • 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.

  5. Testen Sie das Spiel, um den instruktiven Charakterdialog zu hören, wenn Ihr Spielercharakter das Volumen um den Schneemann berührt.

©2026 Roblox Corporation. Roblox, das Roblox-Logo und "Powering Imagination" gehören zu unseren eingetragenen und nicht eingetragenen Markenzeichen in den USA und anderen Ländern.