Dieses Beispiel zeigt, wie man einen exklusiven Chat für Benutzer implementiert, die sich in der 3D-Welt nahe beieinander aufhalten. Es erweitert den Rückruf mit einer Funktion, die TextSource verwendet, um die Standorte eines Benutzers zu identifizieren, der möglicherweise ein potenzieller Nachrichtenempfänger ist. Wenn diese Funktion false zurückgibt, bedeutet das, dass der Benutzer weiter entfernt ist als der voreingestellte gültige Bereich vom Absender der Nachricht, sodass das System die Nachricht nicht an diesen Benutzer sendet.
Fügen Sie Folgendes zu einem Script in ServerScriptService hinzu:
Server
local TextChatService = game:GetService("TextChatService")
local Players = game:GetService("Players")
-- Holen Sie den Chat-Kanal für den nähebasierenden Chat
-- Sie können diesen allgemeinen Kanal durch einen speziellen Kanal ersetzen
local generalChannel: TextChannel = TextChatService:WaitForChild("TextChannels").RBXGeneral
-- Funktion, um die Position des Charakters eines Benutzers zu erhalten
local function getPositionFromUserId(userId: number)
-- Holen Sie sich den Spieler, der mit der angegebenen Benutzer-ID verknüpft ist
local targetPlayer = Players:GetPlayerByUserId(userId)
-- Wenn der Spieler existiert, holen Sie sich die Position seines Charakters
if targetPlayer then
local targetCharacter = targetPlayer.Character
if targetCharacter then
return targetCharacter:GetPivot().Position
end
end
-- Geben Sie eine Standardposition zurück, wenn der Spieler oder Charakter nicht gefunden werden kann
return Vector3.zero
end
-- Setzen Sie den Rückruf für den allgemeinen Kanal, um die Nachrichtenübermittlung zu steuern
generalChannel.ShouldDeliverCallback = function(textChatMessage: TextChatMessage, targetTextSource: TextSource)
-- Holen Sie sich die Positionen des Nachrichtenabsenders und des Ziels
local sourcePos = getPositionFromUserId(textChatMessage.TextSource.UserId)
local targetPos = getPositionFromUserId(targetTextSource.UserId)
-- Nachricht übermitteln, wenn der Abstand zwischen Absender und Ziel weniger als 50 Einheiten beträgt
return (targetPos - sourcePos).Magnitude < 50
end