Czat głosowy to funkcja czatu oparta na zasięgu, która symuluje realistyczną komunikację poprzez dostosowywanie głośności mówiących graczy w miarę zbliżania się lub oddalania od siebie w przestrzeni 3D. Pozwalając graczom rozmawiać ze sobą za pomocą mikrofonów, mogą oni w czasie rzeczywistym nawiązywać relacje i wspólnie opracowywać strategie w celu realizacji celów Twojego doświadczenia.
Korzystając z pliku .rbxl Gingerbread Island - Czat głosowy jako odniesienia, ten przewodnik pokazuje, jak włączyć różne formy czatu głosowego do swojej gry, w tym wskazówki dotyczące:
- Sortowania graczy w zespoły, które mogą używać czatu głosowego tylko z członkami swojego zespołu.
- Pozwalania graczom na tymczasowe włączenie mikrofonu, gdy przyciskają określony przycisk na swoim urządzeniu.
- Konfigurowania okresów czasowych, w których czat głosowy jest włączony lub wyłączony.
Przeglądając poniższe sekcje wraz z przykładem, możesz dostosować każdy fragment kodu, aby lepiej odpowiadał Twoim wymaganiom dotyczącym czatu głosowego.
Skonfiguruj ustawienia
Aby czat drużynowy, push-to-talk lub czat oparty na czasie działały prawidłowo, musisz skonfigurować swoje ustawienia czatu głosowego, aby włączyć czat głosowy i utworzyć odpowiednie obiekty audio niezbędne do odbierania i emitowania dźwięku w środowisku 3D.
Gdy gracze dołączają do Twojego doświadczenia, Twoje ustawienia czatu głosowego teraz:
- Pozwalają graczom uprawnionym do korzystania z mikrofonów.
- Tworzą i przypisują obiekt AudioDeviceInput pod każdym obiektem Player, który ma prawa głosowe.
- Tworzą i przypisują obiekt AudioEmitter pod każdym "Członkiem" Player.
- Tworzą i przypisują obiekt AudioListener pod Workspace.CurrentCamera.
Poniższe sekcje szczegółowo opisują trzy unikalne konfiguracje czatu głosowego z wykorzystaniem tych ustawień. Podążając za przykładowym plikiem Gingerbread Island - Czat głosowy, możesz włączyć odpowiedni wyłączony skrypt w oknie Eksplorator, aby przetestować ich działanie. Aby upewnić się, że każdy działa prawidłowo, upewnij się, że ponownie wyłączysz skrypt przed przejściem do kolejnej konfiguracji.

Dodaj czat drużynowy
Czat drużynowy to konfiguracja czatu głosowego, w której tylko gracze w tej samej drużynie mogą mówić lub słyszeć się nawzajem w doświadczeniu. Integracja czatu drużynowego w Twojej grze jest przydatna, gdy chcesz, aby gracze współpracowali i wspólnie analizowali problemy w doświadczeniach, takie jak koordynowanie informacji o pozycjach drużyn przeciwnych, zasobach i zadaniach.
Aby odtworzyć drużynowy czat głosowy w przykładowym pliku Gingerbread Island - Czat głosowy:
W oknie Eksplorator wstaw Skrypt do ServerScriptService.
Zmień nazwę skryptu na TeamChat, a następnie wklej następujący kod do skryptu:
local Teams = game:GetService("Teams")local Players = game:GetService("Players")local redTeam = Instance.new("Team", Teams)redTeam.TeamColor = BrickColor.new("Bright red")redTeam.AutoAssignable = trueredTeam.Name = "Czerwony Zespół"local blueTeam = Instance.new("Team", Teams)blueTeam.TeamColor = BrickColor.new("Bright blue")blueTeam.AutoAssignable = trueblueTeam.Name = "Niebieski Zespół"local function getUserIds(team : Team) : {number}local userIds = {}for _, player : Player in team:GetPlayers() dotable.insert(userIds, player.UserId)endreturn userIdsendlocal function getDevices(team : Team) : {AudioDeviceInput}local devices = {}for _, player : Player in team:GetPlayers() dolocal device : AudioDeviceInput = player:FindFirstChild("AudioDeviceInput")if not device thencontinueendtable.insert(devices, device)endreturn devicesendlocal function updateTeam(team : Team)local users = getUserIds(team)for _, device in getDevices(team) dodevice.AccessType = Enum.AccessModifierType.Allowdevice:SetUserIdAccessList(users)endendlocal function onDeviceAdded(device : AudioDeviceInput)local player : Player = device.Parentif player.Team thenupdateTeam(player.Team)endendlocal function onPlayerAdded(player : Player)local device = player:FindFirstChild("AudioDeviceInput")if device thenonDeviceAdded(device)endplayer.ChildAdded:Connect(function(child)if child.Name == "AudioDeviceInput" thenonDeviceAdded(child)endend)endupdateTeam(blueTeam)updateTeam(redTeam)for _, player in Players:GetPlayers() doonPlayerAdded(player)endPlayers.PlayerAdded:Connect(onPlayerAdded)blueTeam.PlayerAdded:Connect(function() updateTeam(blueTeam) end)blueTeam.PlayerRemoved:Connect(function() updateTeam(blueTeam) end)redTeam.PlayerAdded:Connect(function() updateTeam(redTeam) end)redTeam.PlayerRemoved:Connect(function() updateTeam(redTeam) end)Wyjaśnienie koduSkrypt zaczyna od uzyskania usług Teams i Players, aby móc wykorzystać ich wbudowaną funkcjonalność do sortowania graczy w drużyny, gdy tylko dołączą do doświadczenia. Na przykład, bez dodatkowych działań w kodzie, usługa Teams zajmuje się takimi działaniami jak:
- Równomierne sortowanie i balansowanie graczy w każdej drużynie.
- Grupowanie graczy w ich drużynie na tablicy wyników.
- Zabarwienie nazw graczy w przestrzeni 3D na odpowiadający im kolor drużyny.
Korzystając z tej usługi, skrypt tworzy dwa różne obiekty Team z różnymi wartościami właściwości Color, aby reprezentować każdą drużynę: jaskrawa czerwień dla jednej drużyny i jaskrawa niebieskość dla drugiej.
Następnie skrypt definiuje trzy funkcje, w których odbywa się większość pracy związanej z ustawieniem konfiguracji czatu głosowego drużyny:
- getUserIds - Zwraca tablicę userID dla wszystkich graczy w drużynie.
- getDevices - Zwraca tablicę obiektów AudioDeviceInput dla wszystkich graczy w drużynie. Każdy obiekt Class.AudioDeviceInput reprezentuje fizyczny mikrofon gracza w rzeczywistości.
- updateTeam - Pobiera wszystkie userID z getUserIds, iteruje przez obiekty AudioDeviceInput z getDevices, ustawia ich właściwość Enum.AccessModifierType na Allow, aby tylko userID w każdej drużynie mogli słyszeć mikrofony swoich kolegów z drużyny, a następnie aktualizuje SetUserIdAccessList z userID z drużyny.
Pozostała część skryptu kontroluje, jak te funkcje i nasłuchiwacze zdarzeń współpracują ze sobą:
- Gdy nowy gracz dołącza do doświadczenia, skrypt sprawdza, czy gracz ma mikrofon i aktualizuje jego drużynę.
- Gdy skrypt wykryje nowy obiekt AudioDeviceInput, wywołuje updateTeam dla ich odpowiedniej drużyny czerwonej lub niebieskiej.
- Gdy gracze dołączają lub opuszczają doświadczenie, skrypt łączy się z wydarzeniami PlayerAdded i PlayerRemoved, aby zaktualizować ustawienia każdej drużyny.
Przetestuj doświadczenie z kilkoma przyjaciółmi, aby upewnić się, że członkowie każdej drużyny mogą słyszeć się nawzajem tylko przez czat głosowy.
Dodaj push to chat
Push to chat to konfiguracja czatu głosowego, w której gracze mogą aktywować swój mikrofon w doświadczeniu tylko podczas naciśnięcia i przytrzymania określonego przycisku na swoim urządzeniu. Integracja push to chat w Twojej grze jest przydatna, gdy chcesz, aby gracze mieli większą prywatność i kontrolę nad tym, kiedy chcą być słyszeni w porównaniu do innych graczy i hałasu otoczenia.
Aby odtworzyć czat głosowy push-to-talk w przykładowym pliku Gingerbread Island - Czat głosowy:
W oknie Eksplorator wstaw Skrypt do ReplicatedStorage.
W oknie Właściwości ustaw RunContext na Client, aby skrypt kontrolował tylko mikrofon lokalnego gracza.
Zmień nazwę skryptu na PushToChat, a następnie wklej następujący kod do skryptu:
local Players = game:GetService("Players")local UserInputService = game:GetService("UserInputService")local audioIn: AudioDeviceInput = Players.LocalPlayer:WaitForChild("AudioDeviceInput")local pushToTalkKey = Enum.KeyCode.VaudioIn.Muted = trueUserInputService.InputBegan:Connect(function(input: InputObject)if input.KeyCode == pushToTalkKey thenaudioIn.Muted = falseendend)UserInputService.InputEnded:Connect(function(input: InputObject)if input.KeyCode == pushToTalkKey thenaudioIn.Muted = trueendend)Wyjaśnienie koduSkrypt zaczyna od uzyskania:
- Usługi Players, aby mógł odwołać się do wszystkich graczy w doświadczeniu.
- Usługi UserInputService, aby mógł sprawdzać, kiedy gracz naciska przyciski na swoim urządzeniu.
- Obiektu AudioDeviceInput lokalnego gracza, czyli fizycznego mikrofonu na ich urządzeniu.
Następnie skrypt:
- Ustawia klawisz V jako przycisk, który gracz musi nacisnąć i przytrzymać, aby mówić do swojego mikrofonu.
- Wyłącza mikrofon gracza.
Pozostała część skryptu ustawia dwa nasłuchiwacze zdarzeń dla InputBegan i InputEnded z UserInputService. Gdy naciśnie naciśnięcie klawisza V, zdarzenie InputBegan wyłącza wyciszenie mikrofonu gracza, a gdy zwolni klawisz V, zdarzenie InputEnded ponownie wycisza ich mikrofon.
Przetestuj doświadczenie, aby upewnić się, że gracze mogą słyszeć się nawzajem przez czat głosowy tylko wtedy, gdy naciskają klawisz V.
Dodaj czat oparty na czasie
Czat oparty na czasie to konfiguracja czatu głosowego, w której gracze mogą mówić i słyszeć się nawzajem tylko w ustalonym okresie czasu. Integracja czatu opartego na czasie w Twojej grze jest przydatna, gdy chcesz, aby gracze starannie planowali, jak komunikują się nawzajem podczas konkretnych faz, takich jak dyskusje w rundzie lub po scenkach przerywnikowych.
Aby odtworzyć czat głosowy oparty na czasie w przykładowym pliku Gingerbread Island - Czat głosowy:
W oknie Eksplorator wstaw Skrypt do ServerScriptService.
Zmień nazwę skryptu na TimeBasedChat, a następnie wklej następujący kod do skryptu:
local Players = game:GetService("Players")local muteAll = falselocal function toggleMuteAll()muteAll = not muteAllfor _, player in Players:GetPlayers() dolocal device : AudioDeviceInput = player:FindFirstChild("AudioDeviceInput")if not device thencontinueenddevice.Muted = muteAllendendwhile true dotask.wait(15) -- co 15 sekundtoggleMuteAll() -- albo pozwól ludziom mówić, albo uniemożliw im mówienieendWyjaśnienie koduTen skrypt zaczyna od uzyskania usługi Players, aby mógł odwołać się do swojej funkcjonalności zarządzania wszystkimi graczami w doświadczeniu. Następnie ustawia flagę muteAll na false, którą następnie wykorzystuje funkcja toggleMuteAll, aby przełączać czat głosowy włączony i wyłączony.
Przyjrzyjmy się funkcji toggleMuteAll:
- Zaczyna się od iteracji przez wszystkich graczy w doświadczeniu za pomocą Players.GetPlayers.
- Dla każdego gracza sprawdza, czy ma obiekt AudioDeviceInput, czyli fizyczny mikrofon na swoim urządzeniu.
- Jeśli tak, to ustawia właściwość Muted obiektu AudioDeviceInput na wartość muteAll. Na przykład, jeśli muteAll to true, mikrofon gracza jest wyłączony, a jeśli muteAll to false, mikrofon gracza jest włączony.
Następnie skrypt wchodzi w nieskończoną pętlę, czekając 15 sekund na wyciszenie i odciszenie wszystkich obiektów AudioDeviceInput.
Przetestuj doświadczenie, aby upewnić się, że gracze mogą słyszeć się nawzajem przez czat głosowy w 15-sekundowych odstępach.