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 emituje z określonej lokalizacji w przestrzeni 3D, zwiększając lub zmniejszając 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.

Używając pliku Gingerbread House - Start .rbxl jako punktu wyjścia oraz Gingerbread House - Complete Audio jako odniesienia, ten samouczek pokazuje, jak dodać zarówno dźwięk 3D w pętli, jak i dźwięk jednorazowy do swoich gier, w tym wskazówki dotyczące:

  • Dźwięków środowiskowych w pętli, które odtwarzają się, gdy gracze łączą się z serwerem.
  • Wyzwalania dźwięku, aby informować graczy o kluczowych wydarzeniach sytuacyjnych, które są ważne dla ich rozgrywki.
  • Aktywacji dźwięku, aby zapewnić graczom informację zwrotną w postaci dźwięku, gdy wchodzą w interakcję z obiektami 3D.
  • Odtwarzania dźwięków postaci, które angażują i prowadzą graczy do punktów zainteresowania w ich otoczeniu.

Jeśli w którymkolwiek momencie utkniesz w procesie, możesz użyć Gingerbread House - Complete Audio jako odniesienia, aby porównać swoje postępy.

Obiekty dźwiękowe

Aby stworzyć dźwięk kierunkowy, ważne jest, aby zrozumieć obiekty dźwiękowe, z którymi będziesz pracować w tym samouczku. 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 środowisku 3D.
  • Obiekt AudioListener to wirtualny mikrofon, który odbiera dźwięk z środowiska 3D.
  • Obiekt AudioDeviceOutput to fizyczne urządzenie sprzętowe 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 rzeczywistym świecie. Przyjrzyjmy się, jak to działa w praktyce, używając przykładu gracza noszącego słuchawki podczas grania w grę na swoim laptopie:

  • Obiekt AudioPlayer ładuje identyfikator zasobu audio 1516791621 do gry dla ścieżki dźwiękowej deszczu.
  • Obiekt AudioEmitter emituje strumień dźwięku ścieżki dźwiękowej deszczu do środowiska 3D.
  • Wire przenosi strumień z AudioPlayer do AudioEmitter, aby strumień wydobywał się z wirtualnego głośnika 3D.
  • Dziecko postaci, obiekt AudioListener, słucha tego dźwięku w środowisku 3D i przekazuje go z powrotem do ich słuchawek.
  • Obiekt AudioDeviceOutput przenosi dźwięk z AudioListener do fizycznego głośnika gracza, lub w tym przypadku, ich słuchawek.
  • Obiekt AudioDeviceInput przechwytuje dźwięk z rzeczywistego świata i przekazuje go z powrotem do gry na potrzeby czatu głosowego.
Reprezentacje obiektów w grze
Reprezentacje obiektów w rzeczywistym świecie

Następujące sekcje zagłębiają się w te obiekty, gdy uczysz się, jak odtwarzać zarówno dźwięk 3D 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 gry do gracza i odwrotnie.

Dźwięk w pętli

Dźwięk 3D w pętli, czyli dźwięk kierunkowy, który powtarza się bezproblemowo, gdy gracze łączą się z serwerem, jest powszechną techniką projektowania dźwięku, aby wzmocnić 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 środowisku, takich jak szum telewizora czy ryk wodospadu; jeśli te dźwięki nagle by ustały, otoczenie wydawałoby się nierealistyczne.

Aby zilustrować ten koncept, sprawdź, jak następujący dźwięk 3D dla dwóch dużych wodospadów zatrzymuje się, gdy tylko niepowtarzalna ścieżka dźwiękowa się kończy. Podczas gdy dźwięki wody początkowo zanurzają graczy w otoczeniu na zewnątrz, nagła zmiana dźwiękowa jest szokująca i nienaturalna w porównaniu do tego, jak zachowuje się wodospad w rzeczywistym świecie.

Podobnie, próbka używa tej techniki 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ę w odległości mniejszej niż 20 studów, emiter emituje dźwięk z pełną głośnością. W miarę oddalania się gracza, dźwięk chlupania zmniejsza się co 20 studów od emitera dźwięku. To emuluje dźwięk w rzeczywistym świecie, który zmniejsza się w głośności, im dalej jesteś od źródła.

Aby odtworzyć dźwięk 3D w pętli w próbce pliku Gingerbread House - Complete Audio:

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

    1. W oknie Explorer wybierz SoundService.
    2. W oknie Properties ustaw DefaultListenerLocation na Character. Gdy uruchomisz grę, silnik automatycznie:
      • Tworzy AudioListener pod Humanoid.RootPart każdej postaci gracza, abyś mógł słyszeć dźwięki zmieniające się w rzeczywistych głośnikach w zależności od pozycji i skali źródeł dźwięku w grze.
      • Tworzy AudioDeviceOutput pod SoundService.
  2. W oknie Explorer przejdź do WorkspaceWaterfallAudioObject, a następnie:

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

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

  5. Wybierz Wire, a następnie w oknie Properties,

    1. Ustaw SourceInstance na nowy AudioPlayer, aby określić, że chcesz, aby przewód przenosił dźwięk z tego konkretnego odtwarzacza audio.
    2. Ustaw TargetInstance na nowy AudioEmitter, aby określić, że chcesz, aby przewód przenosił dźwięk do tego konkretnego emitera audio w wodospadzie.
  6. Wróć do okna Explorer, wstaw Script do WaterfallAudioObject, zmień jego nazwę na LoopWaterfallMusic, ustaw jego właściwość RunContext na Client, a następnie wklej następujący kod do skryptu:

    local audioPlayer = script.Parent
    audioPlayer:Play()

    Skrypt zaczyna od zadeklarowania zmiennej reprezentującej rodzica skryptu AudioPlayer. Następnie skrypt ustawia źródło dźwięku do odtwarzania od momentu, gdy gracz dołącza do gry, do momentu, gdy opuszcza grę.

  7. Przetestuj grę, aby usłyszeć dźwięk deszczu w pętli, gdy twoja postać jest blisko wodospadu. Gdy obracasz głowę postaci, dźwięk dynamicznie zmienia się w twoich rzeczywistych głośnikach w zależności od pozycji emitera w przestrzeni 3D.

Dźwięk jednorazowy

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

Następujące sekcje dostarczają szczegółów implementacji dla typowych scenariuszy rozgrywki, w których gracze potrzebują terminowej, kierunkowej informacji zwrotnej, w tym wydarzeń sytuacyjnych w grze, interakcji z obiektami i dialogów postaci niegrywalnych.

Informacje zwrotne o wydarzeniach

Gdy gracze wyzwalają kluczowe wydarzenia sytuacyjne w swoim otoczeniu, takie jak odblokowywanie nowych obszarów rozgrywki lub wywoływanie ognia wroga, ważne jest, aby rozumieli, w którym miejscu w przestrzeni 3D muszą skierować swoją uwagę. Jeśli nie otrzymają natychmiastowej informacji zwrotnej dźwiękowej, mogą przegapić informacje, które są ważne dla ich rozgrywki, co prowadzi do frustracji z powodu nie wiedzenia, dokąd iść lub co robić dalej.

Aby zilustrować, dlaczego to jest ważne, przyjrzyjmy się dźwiękowi 3D jednorazowemu z szablonu Laser Tag, który odtwarza się z blastera każdego gracza:

  • Głęboki dźwięk wystrzału odtwarza się za każdym razem, gdy gracz strzela z blastera.
  • Dźwięk klikania i robota odtwarza się za każdym razem, gdy gracz przeładowuje blaster nową rundą.

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

Próbka używa tej samej techniki, aby zapewnić graczom świadomość sytuacyjną o ich nagrodzie za ukończenie głównego celu w grze. Po zebraniu wszystkich trzech gumdrops, drzwi do domku z piernika otwierają się, aby umożliwić graczom dostęp do prezentu w środku.

Ponieważ nie ma konkretnej kolejności, w jakiej gracze muszą zbierać gumdrops, ważne jest, aby gracze byli świadomi otwierania drzwi, niezależnie od tego, który gumdrop zbiorą jako ostatni. Dźwięk kierunkowy to umożliwia, aby gracze byli świadomi swojego sukcesu i wiedzieli, dokąd muszą iść dalej, niezależnie od ich względnej odległości i kierunku od drzwi.

Aby odtworzyć dźwięk 3D jednorazowy dla informacji zwrotnej o wydarzeniach w próbce pliku Gingerbread House - Complete Audio:

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

    1. Wstaw obiekt AudioPlayer, aby stworzyć źródło dźwięku dla objętości.
    2. Wstaw obiekt AudioEmitter, aby emitować strumień pozycyjny z Door.
    3. Wstaw obiekt Wire, aby przenieść strumień z odtwarzacza audio do emitera audio.
  2. Wybierz AudioPlayer, a następnie w oknie Properties ustaw AssetID na rbxassetid://5930776613, aby odtworzyć dźwięk przesuwanej metalowej bramy.

  3. Wybierz Wire, a następnie w oknie Properties,

    1. Ustaw SourceInstance na nowy AudioPlayer, aby określić, że chcesz, aby przewód przenosił dźwięk z tego konkretnego odtwarzacza audio.
    2. Ustaw TargetInstance na nowy AudioEmitter, aby określić, że chcesz, aby przewód przenosił dźwięk do tego konkretnego emitera audio w objętości.
  4. Wróć do okna Explorer, przejdź do ServerScriptService, a następnie wstaw Script, zmień jego nazwę na GumdropService, ustaw jego właściwość RunContext na Server, a następnie wklej następujący 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)
    -- Aktualizuj tabelę gumdrops
    local newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)
    -- Aktualizuj tablicę wyników gumdrops
    Leaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)
    -- Sprawdź, czy gracz zebrał trzy gumdrops
    if newGumdropAmount >= 3 then
    -- Odtwórz dźwięk wydarzenia drzwi, gdy gracz zbierze trzy gumdrops
    local audioPlayer = Workspace.Door.AudioPlayer
    audioPlayer:Play()
    -- Animuj drzwi, aby przesunęły 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 obsługi zdarzeń
    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ógł odwoływać się do ich dzieci i funkcjonalności. Następnie wymaga modułów Leaderboard i PlayerData w ServerStorage; te moduły są odpowiedzialne za tworzenie i aktualizowanie tablicy wyników w prawym górnym rogu ekranu, która śledzi ilość gumdrops, które gracz zbiera w otoczeniu.

    Funkcja updatePlayerGumdrops skryptu to miejsce, w którym odbywa się większość pracy związanej z wyzwalaniem dźwięku 3D dla informacji zwrotnej o wydarzeniach, i przyjmuje dwa argumenty:

    • player - Gracz, który zbiera gumdrop.
    • updateFunction - Funkcja zwrotna, która aktualizuje ilość zebranych gumdrops przez gracza.

    Gdy gracz zderza się z gumdropem, skrypt:

    • Uzyskuje nową wartość zbioru gumdrops gracza, wywołując funkcję PlayerData.updateValue.
    • Aktualizuje tablicę wyników tą nową wartością, wywołując funkcję Leaderboard.setStat.
    • Sprawdza, czy ilość jest większa lub równa 3.

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

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

    Reszta skryptu jest głównie odpowiedzialna za wykrywanie, czy cokolwiek, co zderza się z gumdropem, jest graczem, aby mogło wyzwolić dźwięk niepozycyjny dla informacji zwrotnej o zbieraniu. Aby uzyskać więcej informacji na temat tej części skryptu, zobacz Dodaj dźwięk 2D - Informacje zwrotne z rozgrywki.

  5. Przetestuj grę, aby usłyszeć dźwięk przesuwanej bramy po zebraniu wszystkich trzech gumdrops w otoczeniu. Gdy obracasz kamerę, dźwięk dynamicznie zmienia się w twoich rzeczywistych głośnikach, abyś słyszał go 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 światła czy podnoszenie broni, ważne jest, aby zapewnić natychmiastową informację zwrotną, 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 reakcją otoczenia.

Aby rozwinąć ten koncept, przyjrzyjmy się następującemu dźwiękowi 3D jednorazowemu z próbki Plant dla przepływu użytkownika podczas uprawy kapusty:

  • Delikatny dźwięk dzwonka odtwarza się, gdy gracz sadzi nasiono.
  • Dźwięk mokrego plusku odtwarza się, gdy gracz podlewa rosnącą roślinę.
  • Dźwięk przycinania odtwarza się, gdy gracz zbiera dojrzałą roślinę.
  • Delikatny dźwięk uderzenia odtwarza się, gdy gracz umieszcza kapustę w wózku.

Wszystkie te dźwięki wzmacniają kluczowe interakcje gracza z obiektem zmieniającym formy w przestrzeni 3D. Dla graczy z problemami ze wzrokiem, dla których zmiany kolorów lub animacje są trudniejsze do zrozumienia, zapewnienie tych wielu form informacji zwrotnej sensorycznej pomaga, aby interakcje z obiektami 3D były dostępne i intuicyjne dla jak największej liczby graczy.

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

  • Odtwarza dźwięk radosnej melodii.
  • Zabarwia boki przycisku na zielono.
  • Przesuwa przycisk w dół w ziemię.

Od tego momentu możesz połączyć tę interakcję z różnymi unikalnymi akcjami w grze, takimi jak odblokowanie przedmiotu lub wyzwolenie specjalnej umiejętności.

Widok domyślny
Stan naciśnięty

Aby odtworzyć dźwięk 3D jednorazowy dla interakcji z obiektami w próbce pliku Gingerbread House - Complete Audio:

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

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

  3. Wybierz Wire, a następnie w oknie Properties,

    1. Ustaw SourceInstance na nowy AudioPlayer, aby określić, że chcesz, aby przewód przenosił dźwięk z tego konkretnego odtwarzacza audio.
    2. Ustaw TargetInstance na nowy AudioEmitter, aby określić, że chcesz, aby przewód przenosił dźwięk do tego konkretnego emitera audio w przycisku.
  4. Wróć do okna Explorer, wstaw Script do 3DAudioButton, zmień jego nazwę na PlayAudioWhenPressed, a następnie wklej następujący 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 = {
    -- Naciś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 uzyskania:

    • TweenService, aby mógł animować część przycisku, która wystaje z ziemi.
    • Rodzica skryptu, modelu 3DAudioButton.
    • Części przycisku, która wystaje z ziemi.
    • Odpowiedniego odtwarzacza audio z twoją ścieżką dźwiękową do celebracji.

    Skrypt następnie definiuje:

    • Obiekt TweenInfo, który określa, że animacja przycisku będzie odtwarzana z eksponencjalnym stylem animacji.
    • Dwa tweens, które reprezentują stan naciśnięty lub nienaciśnięty przycisku.
      • Stan true naciśnięty przesuwa przycisk nieco w dół w ziemię i zabarwia boki części na zielono.
      • Stan false nienaciśnięty przesuwa przycisk z powrotem do jego pierwotnej pozycji i usuwa poprzednie zabarwienie.

    Reszta skryptu to miejsce, w którym odbywa się większość pracy związanej z informacjami zwrotnymi z interakcji z obiektami, więc przyjrzyjmy się, jak funkcja onIsPlayingChanged i nasłuchiwacze zdarzeń współpracują ze sobą:

    1. buttonPart.Touched nasłuchuje, gdy gracz dotyka przycisku, a następnie wywołuje funkcję Play(), aby rozpocząć odtwarzanie powiązanego dźwięku z odtwarzacza audio. Ten proces zmienia właściwość AudioPlayer.IsPlaying z false na true.
    2. buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") nasłuchuje zmiany właściwości IsPlaying odtwarzacza audio, a następnie wywołuje funkcję onIsPlayingChanged.
    3. Funkcja onIsPlayingChanged wykorzystuje te informacje, 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, gdy odtwarzacz audio kończy odtwarzanie, zanim ponownie wywoła funkcję onIsPlayingChanged.

    Ważne jest, aby zauważyć, że zdarzenie onIsPlayingChanged wyzwala się tylko wtedy, gdy zmienia się z false na true, co oznacza, że nie wyzwala się, gdy zmienia się z true na false. To jest zamierzona funkcjonalność z powodu komplikacji związanych z czasowaniem replikacji właściwości z serwera do klienta. Z tego powodu w tym przykładzie dostarczane jest i nasłuchiwane zdarzenie Ended, aby pokryć obie sytuacje.

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

Dialogi postaci

Zapewnienie dźwięku kierunkowego od twoich postaci niegrywalnych (NPC) jest pomocne w prowadzeniu graczy do punktów zainteresowania w ich otoczeniu i dodaje głębi ich interakcjom z innymi postaciami. W rzeczywistości, w grach opartych na narracji, wielu projektantów strategicznie używa dialogów postaci, aby pośrednio uczyć graczy o ich postaci, sojusznikach i wrogach lub samym świecie.

Typowe przykłady tej techniki obejmują:

  • Styl dialogu, aby ustawić ton twojej gry.
  • Banter, aby uczyć graczy o relacjach postaci.
  • Rozmowy wrogów, aby wyznać motywacje lub ich pozycję w stosunku do gracza.
  • Postacie graczy mówiące na głos swoje myśli, aby delikatnie prowadzić gracza do tego, co powinien zrobić dalej, na przykład leczyć się, przenieść się w inne miejsce lub znaleźć przedmiot.
  • Postacie sojuszników rozmawiające z postacią gracza, aby ujawniać szczegóły dotyczące świata gry, takie jak jego historia, kultura i problemy społeczne.

Aby zilustrować, jak to może wyglądać w praktyce, przyjrzyjmy się następującemu dźwiękowi 3D jednorazowemu z pokazu Beyond the Dark, który okresowo odtwarza się, gdy gracze znajdują się w głównym obszarze lobby stacji kosmicznej.

Używając stacji kosmicznej jako postaci, ten klip dialogowy dostarcza graczom ważnego kontekstu i lore dotyczącego ogólnego otoczenia. Na przykład, z tego jednego zdania gracze dowiadują się:

  • Znajdują się w przestrzeni kosmicznej, konkretnie na stacji kosmicznej o nazwie Kerr-Newman Deep Space Relay 14.
  • Ich otoczenie jest futurystyczne i przyjazne.
  • Są gośćmi i prawdopodobnie wkrótce odejdą.

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żesz również użyć dialogów postaci, aby poinformować graczy, co chcesz, aby zrobili w swojej grze.

Aby zilustrować, próbka używa objętości, czyli niewidocznego obszaru w przestrzeni 3D, aby wyzwolić dialog postaci od bałwana, aby prowadzić graczy do zebrania trzech gumdrops, aby otworzyć drzwi do jego domu. Jako jedna z pierwszych rzeczy, które gracze widzą, gdy dołączają do gry, gracze są bardziej skłonni do wyzwolenia dialogu i wiedzą, co muszą zrobić, aby odnieść sukces.

Objętość wokół bałwana używa informacji zwrotnej o kolizji, aby odtwarzać dźwięk, gdy gracze wchodzą do 3D regionu.

Aby odtworzyć dźwięk 3D jednorazowy dla dialogów postaci w próbce pliku Gingerbread House - Complete Audio:

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

    1. Wstaw obiekt AudioPlayer, aby stworzyć źródło dźwięku dla objętości.
    2. Wstaw obiekt AudioEmitter, aby emitować strumień pozycyjny z DialogueVolume.
    3. Wstaw obiekt Wire, aby przenieść strumień z odtwarzacza audio do emitera audio.
  2. Wybierz AudioPlayer, a następnie w oknie Properties ustaw AssetID na rbxassetid://92917410841704, aby odtworzyć ścieżkę dźwiękową instruktażową dla celu gry.

  3. Wybierz Wire, a następnie w oknie Properties,

    1. Ustaw SourceInstance na nowy AudioPlayer, aby określić, że chcesz, aby przewód przenosił dźwięk z tego konkretnego odtwarzacza audio.
    2. Ustaw TargetInstance na nowy AudioEmitter, aby określić, że chcesz, aby przewód przenosił dźwięk do tego konkretnego emitera audio w objętości.
  4. Wróć do okna Explorer, przejdź do StarterPlayerStarterCharacterScripts, wstaw LocalScript, zmień jego nazwę na PlayAudioWhenInVolume, a następnie wklej następujący kod do lokalnego skryptu:

    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)

    Ten skrypt zaczyna od uzyskania usług Workspace i Players, aby mógł odwoływać się do ich dzieci i funkcjonalności. Dla każdej postaci gracza, która ładuje się lub odradza w grze, skrypt czeka na:

    • Humanoid i Animator postaci.
    • Obiekt objętości w workspace o nazwie DialogueVolume.

    Gdy cokolwiek zderza się z objętością, funkcja obsługi zdarzeń Touched uzyskuje pierwszego przodka, który jest Model, co powinno być postacią, jeśli BasePart, który zderzył się z objętością, jest potomkiem modelu postaci. Jeśli tak jest, funkcja:

    • Ustawia debounce na true.
    • Odtwarza i czeka na zakończenie dźwięku.
    • Ustawia debounce z powrotem na false.

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

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

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