この例では、3Dワールドでお互いに近いユーザーのための排他的なチャットを実装する方法を示します。これは、TextSourceを使用したコールバックに関数を拡張し、メッセージを受信する可能性があるユーザーの位置を特定します。この関数がfalseを返す場合、それはユーザーがメッセージ送信者から事前に設定された有効範囲を超えていることを意味し、システムはそのユーザーにメッセージを配信しません。
次の内容を ServerScriptService の Script に追加します:
Server
local TextChatService = game:GetService("TextChatService")
local Players = game:GetService("Players")
-- プロキシミティベースのチャットのためのチャットチャンネルを取得
-- この一般的なチャンネルを専用のチャンネルに置き換えることができます
local generalChannel: TextChannel = TextChatService:WaitForChild("TextChannels").RBXGeneral
-- ユーザーのキャラクターの位置を取得する関数
local function getPositionFromUserId(userId: number)
-- 指定されたユーザーIDに関連するプレイヤーを取得
local targetPlayer = Players:GetPlayerByUserId(userId)
-- プレイヤーが存在する場合、彼らのキャラクターの位置を取得
if targetPlayer then
local targetCharacter = targetPlayer.Character
if targetCharacter then
return targetCharacter:GetPivot().Position
end
end
-- プレイヤーまたはキャラクターが見つからない場合、デフォルトの位置を返す
return Vector3.zero
end
-- メッセージ配信を制御するために一般チャンネルのコールバックを設定
generalChannel.ShouldDeliverCallback = function(textChatMessage: TextChatMessage, targetTextSource: TextSource)
-- メッセージ送信者とターゲットの位置を取得
local sourcePos = getPositionFromUserId(textChatMessage.TextSource.UserId)
local targetPos = getPositionFromUserId(targetTextSource.UserId)
-- 送信者とターゲットの距離が50ユニット未満の場合、メッセージを配信
return (targetPos - sourcePos).Magnitude < 50
end