Samouczki dla średnio zaawansowanych

Dodaj dźwięk 3D

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Dźwięk 3D to dźwięk kierunkowy, który emitowany jest z konkretnego miejsca w przestrzeni 3D, zwiększający lub zmniejszający swoją głośność w zależności od odległości i orientacji między emiterem dźwięku a słuchaczem. Oznacza to, że gdy słuchacze lub emitery poruszają się po otoczeniu, gracze mogą dynamicznie słyszeć ten dźwięk z różnych kierunków i poziomów głośności.

Korzystając z pliku Gingerbread House - Start .rbxl jako punktu wyjścia i Gingerbread House - Complete Audio jako wzoru, ten poradnik pokazuje, jak dodać zarówno dźwięk 3D w pętli, jak i dźwięk jednorazowy do swoich doświadczeń, w tym wskazówki dotyczące:

  • Dźwięków otoczenia w pętli, które odtwarzają się od razu po połączeniu graczy z serwerem.
  • Uruchamiania dźwięku, aby informować graczy o kluczowych wydarzeniach sytuacyjnych, które są ważne dla ich rozgrywki.
  • Aktywacji dźwięku, aby dostarczać graczom informacje zwrotne w postaci dźwięku podczas interakcji z obiektami 3D.
  • Odtwarzania dźwięków postaci, które angażują i prowadzą graczy w kierunku punktów zainteresowania w ich otoczeniu.

Jeśli w jakimkolwiek momencie utkniesz w procesie, możesz skorzystać z Gingerbread House - Complete Audio jako odniesienia do porównania swojego postępu.

Obiekty dźwiękowe

Aby stworzyć dźwięk kierunkowy, ważne jest zrozumienie obiektów dźwiękowych, z którymi będziesz pracować w całym tym poradniku. Istnieje sześć głównych typów obiektów dźwiękowych dla dźwięku 3D:

  • Obiekt AudioPlayer ładuje i odtwarza plik audio.
  • Obiekt AudioEmitter to wirtualny głośnik, który emituje dźwięk w przestrzeni 3D.
  • Obiekt AudioListener to wirtualny mikrofon, który zbiera dźwięki z przestrzeni 3D.
  • Obiekt AudioDeviceOutput to fizyczne urządzenie w rzeczywistym świecie, takie jak głośnik lub słuchawki.
  • Obiekt AudioDeviceInput to fizyczny mikrofon w rzeczywistym świecie.
  • Wires przenoszą strumienie audio z jednego obiektu do drugiego.

Wszystkie te obiekty dźwiękowe współpracują ze sobą, aby emitować dźwięk, tak jak ich odpowiedniki w rzeczywistości. Przejrzyjmy, jak to działa w praktyce, korzystając z przykładu gracza noszącego słuchawki podczas gry na laptopie:

  • Obiekt AudioPlayer ładuje identyfikator zasobu audio 1516791621 do doświadczenia dla ścieżki deszczu.
  • Obiekt AudioEmitter emituje strumień dźwięku ścieżki deszczu do przestrzeni 3D.
  • Wire przenosi strumień z AudioPlayer do AudioEmitter, aby strumień wychodził z wirtualnego głośnika 3D.
  • Dziecko postaci obiekt AudioListener słucha tego dźwięku w przestrzeni 3D i przekazuje go z powrotem do swoich słuchawek.
  • Obiekt AudioDeviceOutput przenosi dźwięk z obiektu AudioListener do fizycznego głośnika gracza, lub w tym przypadku, jego słuchawek.
  • Obiekt AudioDeviceInput przechwytuje dźwięk z rzeczywistego świata i wprowadza go z powrotem do doświadczenia dla czatu głosowego.
Reprezentacje obiektów w doświadczeniu
Reprezentacje obiektów w rzeczywistości

Kolejne sekcje zgłębią te obiekty i odwołają się do nich, gdy nauczysz się, jak odtwarzać dźwięk 3D zarówno w pętli, jak i dźwięk jednorazowy. Przeglądając te obiekty z nadchodzącymi technikami, możesz dokładniej przewidzieć, jak przechwytywać i przekazywać dźwięk z doświadczenia do gracza oraz odwrotnie.

Dźwięk w pętli

Dźwięk 3D w pętli, czyli dźwięk kierunkowy, który powtarza się bez przerwy, gdy tylko gracze połączą się z serwerem, jest powszechną techniką projektowania dźwięku, aby wzbogacić atmosferę przestrzeni 3D, sprawiając, że wydaje się ona żywa i dynamiczna. Ponadto, dźwięk 3D w pętli utrzymuje spójność źródeł dźwięku w otoczeniu, takich jak szum telewizora lub huk wodospadu; jeśli te dźwięki nagle się zatrzymały, otoczenie wydawałoby się nielogiczne.

Aby zobrazować ten koncept, przejrzyj, jak następujący dźwięk 3D dla dwóch dużych wodospadów zatrzymuje się, gdy tylko niepętlowa ścieżka audio się kończy. Podczas gdy odgłos wody początkowo zanurza graczy w zewnętrznym otoczeniu, nagła zmiana dźwięku jest szokująca i nienaturalna w odniesieniu do zachowania wodospadu w rzeczywistości.

Podobnie, przykład wykorzystuje tę technikę dla płynącego wodospadu czekoladowego i dostosowuje jego głośność w zależności od odległości gracza od emitera dźwięku. Gdy gracz znajduje się mniej niż 20 studów od emitera, emiter emituje dźwięk z pełną głośnością. W miarę oddalania się gracza, dźwięk bulgoczącej wody zmniejsza swoją głośność co 20 studów od emitera dźwięku. To naśladuje rzeczywisty dźwięk, który zmniejsza swoją głośność w miarę oddalania się od źródła.

Aby odtworzyć dźwięk 3D w pętli w przykładzie pliku Gingerbread House - Complete Audio:

  1. Włącz domyślny słuchacz, który jest przypisany do postaci gracza.

    1. W oknie Eksploratora wybierz SoundService.
    2. W oknie Właściwości ustaw DefaultListenerLocation na Character. Gdy uruchomisz doświadczenie, silnik automatycznie:
      • Utworzy obiekt AudioListener pod Humanoid.RootPart każdej postaci gracza, aby można było słyszeć dźwięki, które zmieniają się w głośnikach w rzeczywistości w zależności od pozycji i rozmiaru źródeł dźwięku w doświadczeniu.
      • Utworzy obiekt AudioDeviceOutput pod SoundService.
  2. W oknie Eksploratora przejdź do WorkspaceWaterfallAudioObject, następnie:

    1. Wstaw obiekt AudioPlayer, aby stworzyć źródło audio dla wodospadu.
    2. Wstaw obiekt AudioEmitter, aby emitować strumień lokalizacyjny z WaterfallAudioObject.
    3. Wstaw obiekt Wire, aby przenieść strumień od odtwarzacza audio do emitera audio.
  3. Wybierz AudioPlayer, następnie w oknie Właściwości,

    1. Ustaw AssetID na rbxassetid://1516791621, aby odtworzyć ścieżkę dźwiękową deszczu.
    2. Włącz Looping, aby dźwięk powtarzał się bez przerwy.
  4. Wybierz AudioEmitter, następnie w oknie Właściwości ustaw DistanceAttenuation na {0: 1}, {20: 0.8}, {40: 0.4}, {80: 0}, aby dźwięk stopniowo zmniejszał głośność co 20 studów od emitera dźwięku.

  5. Wybierz Wire, następnie w oknie Właściwości,

    1. Ustaw SourceInstance na swój nowy AudioPlayer, aby określić, że chcesz, aby przewód przenosił dźwięk z tego konkretnego odtwarzacza audio.
    2. Ustaw TargetInstance na swój nowy AudioEmitter, aby określić, że chcesz, aby przewód przenosił dźwięk do tego konkretnego emitera dźwięku w wodospadzie.
  6. Z powrotem w oknie Eksploratora wstaw Skrypt do WaterfallAudioObject, zmień jego nazwę na LoopWaterfallMusic, ustaw jego właściwość RunContext na Client, następnie wklej poniższy kod do skryptu:


    local audioPlayer = script.Parent
    audioPlayer:Play()

    Skrypt zaczyna od zadeklarowania zmiennej, która reprezentuje rodzica skryptu, czyli AudioPlayer. Następnie skrypt ustawia źródło audio do odtwarzania od momentu, gdy gracz dołącza do doświadczenia, aż do momentu, gdy opuszcza to doświadczenie.

  7. Przetestuj doświadczenie, aby usłyszeć powtarzający się dźwięk czekoladowego deszczu, gdy twoja postać znajduje się blisko wodospadu. Gdy obracasz głowę postaci, dźwięk dynamicznie przechodzi w twoich głośnikach w realnym świecie, zgodnie z pozycją emitera w przestrzeni 3D.

Dźwięk jednorazowy

Dźwięk 3D jednorazowy, czyli dźwięk kierunkowy, który odtwarzany jest raz w określonym czasie i miejscu, chyba że gracz uruchomi go ponownie, dostarcza graczom kontekstu dotyczącego ich działań, otoczenia i wszelkich postaci wokół nich. Wykorzystanie tego typu informacji zwrotnej w swoich doświadczeniach jest kluczowe, ponieważ pozwala graczom podejmować strategiczne decyzje, takie jak unikanie nadchodzących wrogów lub zbieranie przydatnych przedmiotów.

Kolejne sekcje dostarczają szczegóły implementacji dla typowych scenariuszy rozgrywki, w których gracze potrzebują terminowych informacji zwrotnych kierunkowych, w tym sytuacyjnych wydarzeń rozgrywkowych, interakcji z obiektami oraz dialogów z postaciami niegrywalnymi.

Informacje zwrotne z wydarzeń

Gdy gracze uruchamiają kluczowe sytuacyjne wydarzenia w swoim otoczeniu, takie jak odblokowywanie nowych obszarów rozgrywki czy wywoływanie ognia wrogów, ważne jest, aby rozumieli, na którym obszarze przestrzeni 3D należy skierować ich uwagę. Jeśli nie otrzymają natychmiastowej informacji zwrotnej w postaci dźwięku, mogą przegapić informacje istotne dla ich rozgrywki, co prowadzi do frustracji wynikającej z tego, że nie wiedzą, gdzie iść lub co robić dalej.

Aby pokazać, dlaczego jest to ważne, przejrzyj dźwięk 3D jednorazowy z szablonu Laser Tag, który odtwarzany jest z wyrzutni każdego gracza:

  • Głębokie stłumione dźwięki odtwarzają się za każdym razem, gdy gracz strzela z wyrzutni.
  • Kliknięcie i dźwięk robota odtwarzają się za każdym razem, gdy gracz przeładowuje swoją wyrzutnię nową amunicją.

Obydwa te dźwięki dostarczają informacji o sytuacji, alertując wszystkich pobliskich graczy o kierunku, z którego pochodzą wystrzały, aby mogli podejmować świadome decyzje dotyczące dołączenia do zabawy lub unikania potencjalnego niebezpieczeństwa.

Przykład używa tej samej techniki, aby zapewnić graczom świadomość sytuacyjną dotyczącą ich nagrody za ukończenie głównego celu w doświadczeniu. Po zebraniu wszystkich trzech cukierków, drzwi do domku z piernika otwierają się, aby umożliwić graczom dostęp do prezentu w jego wnętrzu.

Ponieważ nie ma konkretnej kolejności, w jakiej gracze muszą zbierać cukierki, ważne jest, aby gracze byli świadomi otwierania drzwi, niezależnie od tego, który cukierek zbiorą jako ostatni. Dźwięk kierunkowy czyni to możliwym, aby gracze byli świadomi swojego sukcesu oraz gdzie muszą iść dalej, niezależnie od ich względnej odległości i kierunku od drzwi.

Aby odtworzyć dźwięk 3D jednorazowy dotyczący informacji zwrotnych w zdarzeniach w przykładowym pliku Gingerbread House - Complete Audio:

  1. W oknie Eksploratora przejdź do WorkspaceDoor, następnie:

    1. Wstaw obiekt AudioPlayer, aby stworzyć źródło audio dla objętości.
    2. Wstaw obiekt AudioEmitter, aby emitować strumień positionalny z Door.
    3. Wstaw obiekt Wire, aby przenieść strumień od odtwarzacza audio do emitera audio.
  2. Wybierz AudioPlayer, następnie w oknie Właściwości ustaw AssetID na rbxassetid://5930776613, aby odtworzyć ścieżkę dźwiękową przesuwnych drzwi metalowych.

  3. Wybierz Wire, następnie w oknie Właściwości,

    1. Ustaw SourceInstance na swój nowy AudioPlayer, aby określić, że chcesz, aby przewód przenosił dźwięk z tego konkretnego odtwarzacza audio.
    2. Ustaw TargetInstance na swój nowy AudioEmitter, aby określić, że chcesz, aby przewód przenosił dźwięk do tego konkretnego emitera dźwięku w objętości.
  4. Z powrotem w oknie Eksploratora przejdź do ServerScriptService, następnie wstaw Skrypt, zmień jego nazwę na GumdropService, ustaw jego właściwość RunContext na Server, następnie wklej poniższy kod do skryptu:


    -- Inicjalizacja zmiennych
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    local TweenService = game:GetService("TweenService")
    -- Moduły
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    -- Zmienne
    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)
    -- Aktualizacja tabeli gumdropów
    local newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)
    -- Aktualizacja tabeli wyników gumdropów
    Leaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)
    -- Sprawdzenie, czy gracz zebrał trzy gumdrops
    if newGumdropAmount >= 3 then
    -- Odtwarzanie dźwięku zdarzenia drzwi, gdy gracz zbierze trzy gumdrops
    local audioPlayer = Workspace.Door.AudioPlayer
    audioPlayer:Play()
    -- Animacja drzwi aby przemieszczać się w dół
    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
    -- Definiowanie uchwytu zdarzenia
    local function onGumdropTouched(otherPart, gumdrop)
    if gumdrop:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- Gracz dotknął gumdropa
    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("Gracz zebrał gumdrop")
    end
    end
    end
    -- Ustawianie nasłuchiwaczy zdarzeń
    for _, gumdrop in gumdrops do
    gumdrop:SetAttribute("Enabled", true)
    gumdrop.Touched:Connect(function(otherPart)
    onGumdropTouched(otherPart, gumdrop)
    end)
    end

    Skrypt zaczyna od inicjalizacji usług Workspace, Players, ServerStorage i TweenService, aby móc odnosić się do ich dzieci i funkcjonalności. Następnie wymaga modułów Leaderboard i PlayerData z ServerStorage; te moduły są odpowiedzialne za tworzenie i aktualizację tabeli wyników w prawym górnym rogu ekranu, która śledzi liczbę gumdropów, które gracz zbiera w otoczeniu.

    Funkcja updatePlayerGumdrops w skrypcie to miejsce, gdzie dzieje się większość pracy związanej z uruchamianiem dźwięku 3D dla informacji zwrotnych z wydarzeń, a przyjmuje dwa argumenty:

    • player - Gracz, który zbiera gumdrop.
    • updateFunction - Funkcja wywołania zwrotnego, która aktualizuje liczbę zebranych gumdropów przez gracza.

    Gdy gracz koliduje z gumdropem, skrypt:

    • Pobiera nową wartość liczby gumdropów gracza, wywołując funkcję PlayerData.updateValue.
    • Aktualizuje tabelę wyników za pomocą tej nowej wartości, wywołując funkcję Leaderboard.setStat.
    • Sprawdza, czy wartość jest większa lub równa 3.

    Gdy ta wartość jest większa lub równa 3, skrypt:

    • Odtwarza piosenkę dźwiękową 3D z odtwarzacza audio do emitera dźwięku.
    • Przemieszcza drzwi liniowo o 15 studów poniżej ich aktualnej pozycji.

    Reszta skryptu przede wszystkim odpowiada za wykrywanie, czy coś, co koliduje z gumdropem, jest graczem, aby móc uruchomić dźwięk niekierunkowy jako informację zwrotną o zbieraniu. Aby uzyskać więcej informacji na ten temat, zobacz Dodaj dźwięk 2D - Informacje zwrotne z rozgrywki.

  5. Przetestuj doświadczenie, aby usłyszeć dźwięk przesuwanych drzwi po zebraniu wszystkich trzech gumdropów w otoczeniu. Gdy obracasz kamerę, dźwięk dynamicznie przechodzi w twoich głośnikach w realnym świecie, więc możesz go usłyszeć zgodnie z pozycją emitera w przestrzeni 3D.

Interakcja z obiektami

Gdy gracze wchodzą w interakcję z obiektami 3D w swoim otoczeniu, takimi jak włączanie włącznika czy podnoszenie broni, ważne jest dostarczenie natychmiastowej informacji zwrotnej, aby intuicyjnie zrozumieli jak wchodzą w interakcję z obiektem. Połączenie zarówno wizualnej, jak i dźwiękowej informacji zwrotnej wzmacnia związek przyczynowo-skutkowy między działaniami gracza a odpowiedzią w otoczeniu.

Aby rozwijać ten koncept, przejrzyjmy następujący dźwięk 3D jednorazowy z próbki Rośliny dla przebiegu użytkownika ogrodzenia kapusty:

  • Delikatny dźwięk dzwonienia odtwarzany jest, gdy gracz sadzi nasionko.
  • Dźwięk splash odtwarzany jest, gdy gracz podlewa swoją rosnącą roślinę.
  • Dźwięk kliknięcia jest odtwarzany, gdy gracz zbiera pełnowyrastającą roślinę.
  • Delikatny dźwięk uderzenia jest odtwarzany, gdy gracz umieszcza kapustę w wózku.

Wszystkie te dźwięki wzmacniają kluczowe interakcje gracza z obiektem podczas ich zmiany w przestrzeni 3D. Dla graczy z problemami ze wzrokiem, ułatwienie zrozumienia kolorów czy animacji, oferowanie wielu form informacji zwrotnej pomaga w interakcjach z twoimi obiektami 3D pozostawać dostępnym i intuicyjnym dla tak wielu graczy, jak to możliwe.

Aby podać inny przykład, jak możesz skonfigurować interakcję z obiektami z różnymi formami informacji zwrotnej, próbka zapewnia zarówno wizualną, jak i dźwiękową informację zwrotną, gdy gracze stają na 3D przycisku miętowym wewnątrz domku z piernika. Gdy gracze nie wchodzą w interakcję z przyciskiem, wygląda on jak typowy cukierek miętowy, ale kiedy stają na przycisku, próbka:

  • Odtwarza dźwięk radosnej melodii.
  • Zabarwia boki przycisku na zielony kolor.
  • Przemieszcza przycisk w dół.

Od tego momentu możesz powiązać tę interakcję z różnymi unikalnymi działaniami dotyczącymi rozgrywki, takimi jak odblokowywanie przedmiotu lub wywoływanie specjalnej umiejętności.

Widok domyślny
Stan wciśnięty

Aby odtworzyć dźwięk 3D jednorazowy dotyczący interakcji z obiektem w próbkowym pliku Gingerbread House - Complete Audio:

  1. W oknie Eksploratora przejdź do Workspace3DAudioButton, następnie:

    1. Wstaw obiekt AudioPlayer, aby stworzyć źródło audio dla przycisku.
    2. Wstaw obiekt AudioEmitter, aby emitować strumień lokalizacyjny z 3DAudioButton.
    3. Wstaw obiekt Wire, aby przenieść strumień od odtwarzacza audio do emitera audio.
  2. Wybierz AudioPlayer, następnie w oknie Właściwości ustaw AssetID na rbxassetid://1846248593, aby odtworzyć radosną ścieżkę audio.

  3. Wybierz Wire, następnie w oknie Właściwości,

    1. Ustaw SourceInstance na swój nowy AudioPlayer, aby określić, że chcesz, aby przewód przenosił dźwięk z tego konkretnego odtwarzacza audio.
    2. Ustaw TargetInstance na swój nowy AudioEmitter, aby określić, że chcesz, aby przewód przenosił dźwięk do tego konkretnego emitera dźwięku w przycisku.
  4. Z powrotem w oknie Eksploratora wstaw Skrypt do 3DAudioButton, zmień jego nazwę na PlayAudioWhenPressed, a następnie wklej poniższy kod do skryptu:


    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 = {
    -- Wciśnięty
    [true] = TweenService:Create(buttonPart, tweenInfo, {
    Size = buttonPart.Size / Vector3.new(2, 1, 1),
    Color = Color3.fromRGB(75, 151, 75),
    }),
    -- Domyślny
    [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)

    Skrypt zaczyna od pobrania:

    • TweenService, aby można było animować część przycisku, która wystaje z ziemi.
    • Rodzica skryptu, model 3DAudioButton.
    • Części przycisku, która wystaje z ziemi.
    • Odpowiedniego odtwarzacza audio z twoją ścieżką dźwiękową do świętowania.

    Skrypt definiuje następnie:

    • Obiekt TweenInfo, który określa, że animacja przycisku będzie grała za pomocą stylu animacji wykładniczej.
    • Dwa tweeny, które reprezentują stan wciśnięty lub niewciśnięty przycisku.
      • Stan true podczas wciśnięcia lekko porusza przyciskiem w dół i barwi boki na zielono.
      • Stan false przyciski niewciśniętego przywraca przycisk do pierwotnej pozycji i usuwa poprzedni odcień.

    Reszta skryptu to miejsce, gdzie dzieje się większość pracy na interakcji z obiektami, dlatego przyjrzyjmy się, jak funkcja onIsPlayingChanged i nasłuchiwacze wydarzeń współpracują razem:

    1. buttonPart.Touched nasłuchuje na dotyk gracza przycisku, następnie wywołuje funkcję Play(), aby rozpocząć odtwarzanie skojarzonego dźwięku z odtwarzacza audio. Ten proces przełącza właściwość AudioPlayer.IsPlaying z false na true.
    2. buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") nasłuchuje, czy zmienia się właściwość IsPlaying odtwarzacza audio, następnie wywołuje funkcję onIsPlayingChanged.
    3. Funkcja onIsPlayingChanged wykorzystuje tę informację, aby wyzwolić tween, który zmienia jego wizualny wygląd w przestrzeni 3D.
    4. Aby zapobiec przypadkowemu ponownemu uruchomieniu dźwięku przez gracza, jeśli szybko skoczy na przycisk w szybkim tempie, buttonPressedAudioPlayer.Ended nasłuchuje na zakończenie odtwarzania odtwarzacza audio przed ponownym wywołaniem onIsPlayingChanged.

    Ważne jest, aby zauważyć, że zdarzenie onIsPlayingChanged uruchamia się tylko wtedy, gdy zmienia się ona z false na true, co oznacza, że nie uruchamia się podczas zmiany z true na false. To jest zamierzona logika z powodów związanych z czasem replikacji właściwości z serwera do klienta. Z tego powodu, zdarzenie Ended jest dostarczone i nasłuchiwane w tym przykładzie, aby pokrywać obie sytuacje.

  5. Przetestuj doświadczenie, aby usłyszeć dźwięk celebracji, gdy twoja postać dotyka 3D przycisku w domku z piernika. Gdy odejdziesz od przycisku, głośność dźwięku się zmniejsza.

Dialogi postaci

Zapewnienie dźwięku kierunkowego z twoich postaci niegrywalnych (NPC) jest pomocne w prowadzeniu graczy do punktów zainteresowania w ich otoczeniu i dodaje głębi ich interakcji z innymi postaciami. W rzeczy samej, w doświadczeniach prowadzonych narracyjnie, wielu projektantów strategicznie wykorzystuje dialogi postaci, aby pośrednio uczyć graczy o swojej postaci, sojusznikach i wrogach, lub samym świecie.

Typowe przykłady tej techniki to:

  • Styl dialogu, aby ustawić ton swojego doświadczenia.
  • Złośliwości, aby nauczyć graczy o relacjach między postaciami.
  • Rozmowy wrogów, aby ujawnić motywacje lub ich pozycję w stosunku do gracza.
  • Postacie graczy mówiące na głos aby delikatnie prowadzić gracza do tego, co powinien zrobić dalej, jak na przykład wyleczyć się, przejść do innego miejsca lub znaleźć przedmiot.
  • Postacie sojusznicze rozmawiające z postacią gracza aby ujawnić w szczegóły dotyczące świata w doświadczeniu, takie jak jego historia, kultura lub problemy społeczne.

Aby pokazać, jak to może wyglądać w praktyce, przejrzyjmy następujące dźwięki jednorazowe 3D z próbki Beyond the Dark, które okresowo odtwarzane są, gdy gracze znajdują się w głównym obszarze holu stacji kosmicznej.

Używając stacji kosmicznej jako postaci, ten fragment dialogu dostarcza graczom ważny kontekst i historię dotyczącą ogólnego otoczenia. Na przykład, z tego jednego zdania gracze dowiadują się:

  • Znajdują się w przestrzeni kosmicznej, dokładniej na stacji kosmicznej zwanej Kerr-Newman Deep Space Relay 14.
  • Ich otoczenie jest futurystyczne i gościnne.
  • Są gośćmi i prawdopodobnie wkrótce opuszczą to miejsce.

Te szczegóły razem zanurzają graczy w ich otoczeniu i dodają poczucie pilności do ich misji. Jednak, jeśli gracze nie wiedzą, jaka jest ich główna misja, można także użyć dialogów postaci, aby poinformować graczy, co chcesz, aby zrobili w swoim doświadczeniu.

Aby zobrazować, próbka korzysta z objętości, czyli niewidzialnego obszaru w przestrzeni 3D, aby uruchomić dialog postaci z bałwankiem, aby poprowadzić graczy do zebrania trzech gumdrops, aby otworzyć drzwi do jego domu. Jako jedno z pierwszych rzeczy, które gracze widzą, gdy dołączają do doświadczenia, gracze są bardziej skłonni do uruchamiania dialogu i wiedzą, co muszą robić, aby odnieść sukces.

Objętość wokół bałwanka wykorzystuje sprzężenie zwrotne kolizyjne do odtwarzania audio, gdy gracze wchodzą w obszar 3D.

Aby odtworzyć dźwięk jednorazowy dotyczący dialogów postaci w przykładowym pliku Gingerbread House - Complete Audio:

  1. W oknie Eksploratora przejdź do WorkspaceDialogueVolume, następnie:

    1. Wstaw obiekt AudioPlayer, aby stworzyć źródło audio dla objętości.
    2. Wstaw obiekt AudioEmitter, aby emitować strumień lokalizacyjny z DialogueVolume.
    3. Wstaw obiekt Wire, aby przenieść strumień od odtwarzacza audio do emitera audio.
  2. Wybierz AudioPlayer, następnie w oknie Właściwości ustaw AssetID na rbxassetid://92917410841704, aby odtworzyć ścieżkę audio z instrukcjami dla celu doświadczenia.

  3. Wybierz Wire, następnie w oknie Właściwości,

    1. Ustaw SourceInstance na swój nowy AudioPlayer, aby określić, że chcesz, aby przewód przenosił dźwięk z tego konkretnego odtwarzacza audio.
    2. Ustaw TargetInstance na swój nowy AudioEmitter, aby określić, że chcesz, aby przewód przenosił dźwięk do tego konkretnego emitera dźwięku w objętości.
  4. Z powrotem w oknie Eksploratora przejdź do StarterPlayerStarterCharacterScripts, wstaw LocalScript, zmień jego nazwę na PlayAudioWhenInVolume, a następnie wklej poniższy kod do skryptu lokalnego:


    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    lokalny humanoid = script.Parent:WaitForChild("Humanoid")
    lokalny volumeDetector = Workspace.DialogueVolume
    lokalny trigger = humanoid:WaitForChild("Animator")
    lokalny debounce = false
    lokalny localPlayer = Players.LocalPlayer
    volumeDetector.Touched:Connect(function(hit)
    if debounce then
    return
    end
    lokalny hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
    lokalny hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)
    if hitPlayer ~= localPlayer then
    return
    end
    debounce = true
    lokalny audioPlayer = Workspace.DialogueVolume.AudioPlayer
    audioPlayer:Play()
    audioPlayer.Ended:Wait()
    debounce = false
    end)

    Skrypt zaczyna od pobrania usług Workspace i Players, aby można było odwoływać się do ich dzieci i funkcjonalności. Dla każdej postaci gracza, która ładowana lub odradzana jest w doświadczeniu, skrypt czeka na:

    • Humanoid i Animator obiektów postaci.
    • Obiektu objętości w przestrzeni roboczej o nazwie DialogueVolume.

    Gdy cokolwiek koliduje z objętością, funkcja obsługi zdarzeń Touched pobiera pierwszego przodka, który jest Model, co powinno być postacią, jeśli BasePart, która kolidowała z objętością, jest potomkiem modelu postaci. Jeśli tak jest, funkcja następnie:

    • Ustawia debounce na true.
    • Odtwarza i czeka na zakończenie odtwarzania audio.
    • Przywraca debounce do false.

    Ustawienie debounce z false na true, a następnie z powrotem na false po zakończeniu odtwarzania to wzór debounce, który zapobiega wielokrotnemu uruchamianiu audio, gdy gracze ciągle kolidują z objętością. Aby uzyskać więcej informacji na temat tego wzoru debounce, zobacz Debounce - Wykrywanie kolizji.

  5. Przetestuj doświadczenie, aby usłyszeć instruktażowy dialog postaci, gdy twoja postać dotyka objętości wokół bałwanka.

©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.