使用 Roblox 的 內容聊天 系統,玩家可以在現實會話中使用文字基礎消息來與其他玩家通信。系統提供一套方法和事件來擴展並自訂聊天功能,例如基於 自訂需求 的消息、給特定玩家特殊權限或管理、並創建 自訂指令
此指南涵蓋聊天工作流程和方法,用於擴展聊天系統的功能。對於聊天使用者界面 (UI) 的自訂資訊,請參閱 自訂文字聊天。
聊天工作流程
體驗內容聊天系統包括您可以擴展的可變類別,代表您可以從可變類別返回的特定聊天元素,並且代表特定聊天元素的隱藏數據對象immutable data objects。
可變更的聊天類別
體驗內的文字聊天系統提供以下可變類別:
- TextChatService — 此單一類負荷處理器負荷處理器負荷處理器,負荷處理器,用戶權限,審核,和聊天訊息過濾器。 可從服務伺服器存取,提供一套方法和事件,其他文字聊天 API 或玩家行動可以通過聊天傳送工作流程呼叫。
- TextChannel — 此類代表傳送玩家聊天訊息給服務器並顯示給其他玩家的權限,以便基於權限對文字聊天頻道進行管理。您可以使用它來在您的體驗中創建立、創作、修改和管理文字聊天頻道。此外,您可以創建多個文字頻道以團體玩家聊天,例如允許玩
- TextChatCommand — 此類別讓您創建自訂聊天指令,允許玩家以特殊角色和命令名稱寫下特定行動或行為。聊天指令有助於添加額外的功能和交互性到聊天體驗。您也可以使用它們來創建管理員指令來管理和檢查您的體驗。
不可變更的聊天對象
體驗內的文字聊天系統包含以下不可修改的 immutable 對象:
- TextChatMessage : 此對象代表一個文字聊天頻道中的單一聊天訊息,並且提供基本信息,例如發送訊息的來源、原始訊息、過濾訊息和創建時間。
- TextSource : 此對象代表一個人在多個文字聊天頻道中的訊息發件發件人,並且有詳細的權限。如果玩家在多個文字聊天頻道中,他們可以有多個文字來源。
聊天流程圖
聊天訊息傳送和交付過程中,方法,回撥式和事件的變更聊天類別的工作,並且在 客戶端伺服器 模型的三個方面,與不變更的聊天對象:
- 發送客戶,這是玩家發送訊息的本地裝置。
- 接收客戶,這是其他玩家的本地裝置。
- 這個服務伺服器是發送客戶端發送訊息的中央處理器,並且處理發送到收件客戶端的交付。
流程圖所示,體驗內容聊天系統會通過以下步驟處理聊天訊息:
- 玩家從本地設裝置發送消息,觸發 Class.TextChannel:SendAsync() 方法。這個方法會處理消息,並確認它是否是聊天指令或正常聊天訊息。
- 如果玩家輸入是聊天指令,它會發射 TextChatCommand.Triggered 事件來執行您為指令定義的行動。
- 如果玩家輸入是一個正常的聊天訊息,它會發射 TextChatService.SendingMessage 以顯示原始訊息給發件人。同時, TextChannel:SendAsync() 傳送訊息給伺服器。
- 服務器發射 TextChannel.ShouldDeliverCallback 來確認是否要根據您設置的權限和 Roblox 社群篩選要求向其他玩家發送訊息。
- 如果 TextChannel.ShouldDeliverCallback 確認發送訊息資格,則會對伺服器適用任何過濾器,並且在 TextChannel.OnIncomingMessage 次發射:
- 第一次在發送客戶端發出信號,表示服務器正在通過 TextChatService.MessageReceived 事件處理訊息。這也會重新在發送客戶端上顯示顯示客戶端所接收的訊息。訊息內容和原始訊息無需過濾。
- 第二次是在接收客戶端發動 TextChatService.MessageReceived 事件以顯示訊息給其他玩家。
聊天系統的工作流程有多個區域,您可以擴展並自訂聊天系統的行為,但系統的操作步驟保持相同。
自訂訊息傳送行為
除了遵守預設聊天訊息傳送行為外,您可以使用 TextChannel.ShouldDeliverCallback 來添加權限和特定行為來確認玩家是否能夠收到自訂互動與訊息,例如:
- 支援僅有玩家在同一群組或小隊間通信的群組聊天功能。
- 支持基於接近度的聊天,玩家只能向那些靠近他們的人發送消息。
- 防止玩家擁有特定屬性發送訊息給其他玩家。 例如,禁止死亡狀態的玩家發送訊息給活玩家。
- 增加透過聊天對話框不能顯示正確答案的猜測功能。
下列示例顯示了如何為靠近的玩家角色在地點上實現獨家聊天。它使用 TextSource 來檢查出玩家角色位置,可能是目標訊息接收人。如果此功能返回 false,這表示玩家角色位置超出預設範圍,因此系統不會發送訊息給
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
建立自訂指令
體驗內的聊天系統有內置的聊天指令,例如創建團隊聊天頻道和播放虛擬人偶動作。您可以通過設定 TextChatService.CreateDefaultCommands
下面的例子顯示了如何創建一個允許玩家增加或減少角色大小時輸入 /super 或 /mini 的聊天指令。
將 TextChatCommand 實例放入 TextChatService 內。
將它重命名為 大小指令 。
將其 主要屬性 設為 /super 和其 SecondaryAlias 設為 1> /mini1>。
將 Script 插入 ServerScriptService 內,以定義對話指令,可以擴大角色大小。
腳本local TextChatService = game:GetService("TextChatService")local Players = game:GetService("Players")local sizeCommand: TextChatCommand = TextChatService:WaitForChild("SizeCommand")sizeCommand.Triggered:Connect(function(textSource, message)local scaleMult = 1local messageWords = string.split(message, " ")if messageWords[1] == "/super" thenscaleMult = 2elseif messageWords[1] == "/mini" thenscaleMult = 0.5endlocal player = Players:GetPlayerByUserId(textSource.UserId)if player thenlocal character = player.Characterif character thenlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenfor _, child in humanoid:GetChildren() doif child:IsA("NumberValue") thenchild.Value *= scaleMultendendendendendend)
從傳統聊天室 migra
此部分幫助您從 傳統聊天系統 移行,提供使用體驗內容聊天系統的替代方法來實現常見聊天功能和行為。
要將現有體驗的聊天系統切換到傳統聊天系統的文字聊天系統:
基本功能
雖然兩個系統都共享相同的基本聊天功能,但在體驗中的聊天系統實現是更可持續、更容易重複的。
功能 | 傳奇聊天 | 體驗內容聊天 | 差異 |
---|---|---|---|
發送聊天訊息 | Players:Chat() | TextChannel:SendAsync() | Class.TextChatService:SendAsync() 方法支援更高階的聊天功能,例如豐富的文字格式和訊息優先權。它還包含內置過濾器以幫助防止發送不適當的訊息。 |
實現訊息傳輸回調 | Chat:InvokeChatCallback() Chat:RegisterChatCallback() | TextChatService.SendingMessage TextChatService.OnIncomingMessage | 傳統聊天系統會將一個函數綁定到聊天系統事件以傳送訊息。體驗內的文字聊天系統會提供兩種方法來擴展和自訂選項。 |
添加自訂聊天指令 | ChatService/ChatCommand 模組 | TextChatCommand | 體驗內的文字聊天系統有專屬的類別代表文字指令進行自訂,而不是使用傳統聊天模組。 |
顯示系統訊息 | StarterGui:SetCore() 使用 "ChatMakeSystemMessage" | TextChannel:DisplaySystemMessage() | Class.TextChannel.OnIncomingMessage 回歸可以返回一個 TextChatMessageProperties 實例來自訂訊息外觀。 |
停用聊天 | 遊戲設定 在 Studio 和 ChatWindow/ChatSettings 模組中,用於隱藏聊天視窗 | ChatWindowConfiguration.Enabled |
訊息過濾
內容聊天系統會自動濾過聊天訊息,根據每個玩家的帳戶資訊,讓您不需要手動實現文字過濾器功能。
功能 | 傳奇聊天 | 體驗內容聊天 |
---|---|---|
為個人玩家過濾訊息 | Chat:FilterStringAsync() | 無 |
過濾廣播訊息 | Chat:FilterStringForBroadcast() | 無 |
視窗和泡泡聊天
聊天視窗和 泡泡聊天 行為和 自訂 選項都與傳統聊天系統相同。雖然傳統聊天系統只允許使用聊天模組或
功能 | 傳奇聊天 | 體驗內容聊天 |
---|---|---|
啟用聊天視窗 | Chat.LoadDefaultChat Players.ClassicChat | ChatWindowConfiguration.Enabled |
啟用泡泡聊天 | Chat.BubbleChatEnabled Players.BubbleChat | BubbleChatConfiguration.Enabled |
設定聊天視窗屬性 | Players:SetChatStyle() | ChatWindowConfiguration |
設定泡泡聊天功能 | Chat:SetBubbleChatSettings() Chat.BubbleChatSettingsChanged() Players.BubbleChat 0> Class.Players:SetChatStyle()0> | BubbleChatConfiguration |
啟用 NPC 泡泡 | Chat:Chat() | TextChatService:DisplayBubble() |