階層
レガシーチャットシステムは、クライアント-サーバーモデルを使用しています。サーバー側チャットモジュールのコンポーネント ChatChannel および ChatSpeaker は、2>ChatService2> によって処理され、クライアントは入力
Class.Chat エンジンサービス自体は、チャットシステムの必須のストレージユニットです:Roblox 場所が読み込まれると、次のコンポーネントが自動的に Chat サービスに読み込まれます。Chat.LoadDefaultChat が true の場合、1>Class.Chat1> サービスは自動
- ChatModuleScript — この Folder は、 ChatServiceRunner によって要求されるモジュールのコレクションです。このフォルダ内のすべてのコンテンツは、スクリプトによって作成され、サーバーでカスタム動作を作成するために使用されます。
- ClientChatModuleScript — このフォルダには、ModuleScripts が含まれています。
- コマンドモジュール — クライアント側のチャットコマンドを実装するモジュールを含みます。
- メッセージ作成モジュール — メッセージの処理と形式付けを行うモジュールを含む。
- ChatCommands — サーバーとクライアントによって共有された定数を含みます。
- ChatSettings — さまざまなチャットウィンドウの機能を構成するためにさまざまな設定を保存します。
- ChatLocalization — テキストの翻訳を保存するデータ構造。
- ChatServiceRunner — この Script は、チャットのサーバーコンポーネントを実行します。一般的に、カスタムチャット動作と機能を作成するためには、これを変更する必要はありません。
- バブルチャット — ユーザーのチャットメッセージをゲーム内のアバターの上に表示します (有効にすると)。
- ChatScript — これは、LocalScript というクライアントコンポーネントのチャットを実行します。ChatServiceRunner と同様に、これはチャットをカスタマイズする必要がなく、実行する必要がありません。ゲームが実行すると、StarterPlayerScripts。
チャットシステムを変更する
レガシーチャットシステムを変更またはカスタマイズするには、まず上記の階層のコピーを作成する必要があります。
エクスペリエンスを実行するには、 プレイ ボタン(F5)を使用します。
Select and copy ( CtrlC or ⌘C ) the objects that are added to 2> Class.Chat2> .
停止ボタンを使用してエクスペリエンスを停止する ( ShiftF5 )。
Select Chat and を ( Ctrl 0> Shift0> 2> V2> または 5> ⌘5> 7> Shift7> 9> V9>) the copied objects (they must be parented to 2>
Clasチャット.Chat.LoadDefaultChat が有効であることを確認してください。
チャットワークフロー
チャットをカスタマイズする前に、チャット メッセージが通過するワークフローを理解することは重要です。チャットメッセージを送信すると、チャットシステムに構築されたさまざまなコマンドが表示されます。それらのコマンドは、テキストメッセージを受信するとインタープートされるか、またはコマンドとしてフィルタリン
ユーザーがチャット入力に集中し、キャラクターを入力すると、数秒間、クライアントで複数のチェックが実行されます。如果、キャラクターが Esc
チャットのクライアント側には、2種類のプロセッサーがあります: In-Progress と Completed 。前者は、すべてのキャラクターが入力された後に評価されます、後者は、ユーザーが入力して Enter を押した後に評価されます。
ユーザーが入力を完了し、入力 テキストを押すと、入力はさらにいくつかのコマンドプロセッサーを通過して送信されます。如果 進行中 コマンドが作成されたカスタムチャットステー
メッセージがサーバーに到達すると、別のコマンドプロセッサーを経てメッセージが完了します。クライアント上の 完了 プロセッサーと同様に、これらのプロセッサーの 1 つが 真 に返すと、メッセージの実行が停止します。そうでない場合、メッセージはフィルターセッ
サーバーモジュール
チャットモジュール に入れられたモジュールは、さまざまな目的で使用できます。これらのモジュールは、チャットチャンネルとスピーカーを管理、フィルターとコマンド機能を追加し、チャットボットを実行するなど、サーバーで処理する必要があるすべての種類のコンテンツを処理するために使用されます
ChatServiceRunner が開始されると、 ChatModule 内の各モジュールがそれぞれ ChatService オブジェクトを呼び出します。それぞれのモジュールが、1>ChatService1> オブジェクトを通じて、それぞれのモジュールを返します。ボットの実行、
サンプルモジュールフレームワーク
local function Run(ChatService)
-- コードはここに行く
end
return Run
チャンネルの追加
ChatModule は、 チャンネル を管理することができます。チャンネルオブジェクトは、AddChannel() メソッドの 1>チャンネルサービス1> によって作成されることができ
local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
end
return Run
ベーシックチャンネル構成
チャンネルには、スライトで変更できるいくつかのプロパティがあります。たとえば、このモジュールはチャンネルを作成し、ウェルカムメッセージを設定し、ユーザーがエクスペリエンスに参加すると自動的にチャンネルに参加させます。
local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
-- ユーザーがチャンネルに参加すると表示されるメッセージを設定
myChannel.WelcomeMessage = "Welcome to my channel!"
-- プレイヤーがゲームに入ると自動的にチャンネルに参加するようにします
myChannel.AutoJoin = true
end
return Run
チャンネルイベント
チャンネルには、チャットメッセージ をチャンネルに投稿すると、イベントが発動します。チャンネルのオープンや閉鎖、スピーカーのミュート/ミュート解除、スピーカーのミュート/ミュート解除など、すべてのスピーカー
local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
local function onSpeakerJoined(speakerName)
myChannel:SendSystemMessage(speakerName .. " has joined the channel.")
end
local function onSpeakerLeft(speakerName)
myChannel:SendSystemMessage(speakerName .. " has left the channel.")
end
myChannel.SpeakerJoined:Connect(onSpeakerJoined)
myChannel.SpeakerLeft:Connect(onSpeakerLeft)
end
return Run
コマンド機能
チャットモジュール は、 チャットコマンチャンネル を送信することができます。当サーバ
コマンド機能は、チャットで指定されたテキストコマンドを実行するなど、エクスペリエンス状態を操作するために使用されるテキストコマンドを実装するのに使用されることがあります。
この例では、 ChatModule は、ユーザーがチャットで Part を作成するように、チャットに /part を入力した場合に作成されます。この関数は、パーツが作成された場合、メッセージが続行しないようにして表示されないようにするために
local function Run(ChatService)
local function createPart(speakerName, message, channelName)
if string.sub(message, 1, 5) == "/part" then
local newPart = Instance.new("Part")
newPart.Parent = workspace
return true
end
return false
end
ChatService:RegisterProcessCommandsFunction("createPart", createPart)
end
return Run
ChatChannels と ChatService 自体はチャットコマンドを持つことができます。 ChatService コマンドプロセッサーは、サーバーに送信されたすべてのメッセージで実行されますが、チャットコマンドは、メッセージがチャンネルに登録されたチャンネルに送信されるだけで実行されます。
フィルタ機能
コマンド機能 で停止されないメッセージは、ChatService に登録されたすべてのフィルター機能を通過します。各フィルター機能はスピーカー、メッセージオブジェクト、チャンネル名を通過します。メッセージオブジェクトに対する変更は、スピーカー、メッセージオ
この例では、単純なフィルター機能が登録されており、すべてのメッセージが大文字に表示されます。
local function Run(ChatService)
local function makeLowercase(sender, messageObject, channelName)
messageObject.Message = string.lower(messageObject.Message)
end
ChatService:RegisterFilterMessageFunction("makeLowercase", makeLowercase)
end
return Run
クライアントモジュール
ClientChatModule に入れられたモジュールは、クライアントにカスタムな動作を作成するために使用できます。これらのモジュールは 2つの異なるフォルダに分割されています:コマンドモジュール と メッセージクリエーターモジュール 。
コマンドモジュール
コマンドモジュール は、ユーザーが入力した後に コマンド機能 を発動するモジューメッセージと同様に機能します。 これらのモジュールは、ユーザーが入力した後に コマ
両方のタイプのコマンドで、モジュールは、コマンドが使用するプロセッサーの種類と実行時に実行する機能を含む辞書を返す必要があります。たとえば、 完了したメッセージプロセッサー は、形式を取る必要があります:
local util = require(script.Parent:WaitForChild("Util"))
function ProcessMessage(message, ChatWindow, ChatSettings)
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.COMPLETED_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}
Class.ModuleScript フォルダ内の KEY_COMMAND_PROCESSOR_TYPE 枚数は、 ModuleScript 1>Class.ModuleScript1> 内の 4>CommandModuleScript4> で定義されています。
メッセージコマンドを完了
完了したメッセージコマンド は、ユーザーが入力を完了し、Enter を押したときに評価されます。プロセッサーの機能は ChatMessage オブジェクト、クライアントの
たとえば、次のプロセッサーは、ユーザーがコマンド /last を入力した場合、現在のチャンネルの最古のメッセージを削除します。
local util = require(script.Parent:WaitForChild("Util"))
function ProcessMessage(message, ChatWindow, ChatSettings)
if string.sub(message, 1, 5) == "/last" then
local currentChannel = ChatWindow:GetCurrentChannel()
if currentChannel then
currentChannel:RemoveLastMessageFromChannel()
end
return true
end
return false
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.COMPLETED_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}
進行中のコマンド
進行中のコマンドは、ユーザーがチャット入力にキャラクターを入力するたびに評価されます。たとえば、次のコードは、ユーザーがタイプライターを入力しているかのように聞かせるために、すべてのキープレス後にクラックをプレイします。
local util = require(script.Parent:WaitForChild("Util"))
local keyEffect = Instance.new("Sound")
keyEffect.SoundId = "rbxassetid://12221976"
keyEffect.Parent = script
function ProcessMessage(message, ChatWindow, ChatBar, ChatSettings)
keyEffect:Play()
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.IN_PROGRESS_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}
進行中のコマンドは、チャットが現在のチャンネルではなく、特定のユーザーにメッセージを送信するために カスタムステート を作成するのによく使用されます。たとえば、<a href=\"/whisper\">Whisper</a> および<a href=\"/team>チーム システムは、ユーザーが
カスタム状態は、次の機能を含むテーブルである必要があります:
- TextUpdated() ー 入力ボックスのテキストが変更されるときに呼び出されます。
- GetMessage() — ユーザーがメッセージを入力した後に呼び出され、Enter を押します。この関文字列は、ストリングを返す必要があります。
- ProcessCompletedMessage() — メッセージが処理されているときに呼び出されます。カスタムステートプロセッサーは、完了したメッセージプロセッサーを呼び出す前に常にファイアをオンにします。他のプロセッサーと同様、この関数は、メッセージが送信される前に常に true を返す必要があります。
- Destroy() — メッセージが送信された後に呼び出されます。カスタムステートによって設定されたものをすべてクリアする必要があります。
カスタムステートを使用するには、コマンドモジュールの ProcessMessage() 機能が状態を返す必要があります。基本的なカスタムステートは次の形式を取ります:
local util = require(script.Parent:WaitForChild("Util"))
local oneLineState = {}
oneLineState.__index = oneLineState
function oneLineState:TextUpdated()
local text = self.TextBox.Text
local length = string.len(text)
if length > 20 then
local chopLength = length - 20
local addToPrefix = string.sub(text, 1, chopLength)
self.Prefix = self.Prefix .. addToPrefix
self.TextBox.Text = string.sub(text, chopLength + 1)
end
end
function oneLineState:GetMessage()
local fullString = self.Prefix .. self.TextBox.Text
return fullString
end
function oneLineState:ProcessCompletedMessage()
return false
end
function oneLineState:Destroy()
self.Destroyed = true
end
function oneLineState.new(ChatWindow, ChatBar, ChatSettings)
local obj = {}
setmetatable(obj, oneLineState)
obj.Destroyed = false
obj.ChatWindow = ChatWindow
obj.ChatBar = ChatBar
obj.ChatSettings = ChatSettings
obj.TextBox = ChatBar:GetTextBox()
obj.MessageModeLabel = ChatBar:GetMessageModeTextLabel()
obj.Prefix = ""
return obj
end
local function ProcessMessage(message, ChatWindow, ChatBar, ChatSettings)
return oneLineState.new(ChatWindow, ChatBar, ChatSettings)
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.IN_PROGRESS_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}
カスタムステートを使用する主な利点の 1 つは、モジュールがチャットバーとその内容を編集しながら、ユーザーが両方の機能と見た目の点で入力している間、チャットバーを編集できることです。その後、モジュールはメッセージ
local util = require(script.Parent:WaitForChild("Util"))
local oneLineState = {}
oneLineState.__index = oneLineState
function oneLineState:TextUpdated()
local text = self.TextBox.Text
local length = string.len(text)
if length > 20 then
local chopLength = length - 20
local addToPrefix = string.sub(text, 1, chopLength)
self.Prefix = self.Prefix .. addToPrefix
self.TextBox.Text = string.sub(text, chopLength + 1)
end
end
function oneLineState:GetMessage()
local fullString = self.Prefix .. self.TextBox.Text
return fullString
end
function oneLineState:ProcessCompletedMessage()
return false
end
function oneLineState:Destroy()
self.Destroyed = true
end
function oneLineState.new(ChatWindow, ChatBar, ChatSettings)
local obj = {}
setmetatable(obj, oneLineState)
obj.Destroyed = false
obj.ChatWindow = ChatWindow
obj.ChatBar = ChatBar
obj.ChatSettings = ChatSettings
obj.TextBox = ChatBar:GetTextBox()
obj.MessageModeLabel = ChatBar:GetMessageModeTextLabel()
obj.Prefix = ""
return obj
end
local function ProcessMessage(message, ChatWindow, ChatBar, ChatSettings)
return oneLineState.new(ChatWindow, ChatBar, ChatSettings)
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.IN_PROGRESS_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}
以前に述べたように、メッセージが送信されると、カスタムステートは削除され、チャットは通常に戻ります。メッセージを送信する前にカスタムステートをリセットする必要がある場合は、ChatBar:ResetCustomState() で状態をリセットできます。これにより、チャットバーのテキストボックスのフォーカスも削除されます。
メッセージクリエーターモジュール
クライアントコンポーネントに使用できる別のモジュールタイプは、 メッセージクリエーター モジュールです。このタイプのモジュールは、チャットウィンドウでメッセー入力を表示するために GUI 要素を作成します。各種のメッセージクリエーターは、形式を定義する新しいメッセージ
これらのモジュールは、いくつかの異なる場所で設定が必要になります。各メッセージタイプには、ModuleScript 内の Class.ModuleScript が必要です。また、ChatConstructorsModule 内の 2> Class.ModuleScript2> を編集して、新しいメッセ
次の例では、5秒ごとに時間を表示するボットを作成し、送信されたメッセージに赤いバックグラウンドを付けます。
開始するには、ChatCommandsModuleScript に新しいタイプのメッセージのフィールドを追加する必要があります。
-- チャット常数local module = {}---[[メッセージタイプ ]]module.MessageTypeDefault = "Message"module.MessageTypeSystem = "System"module.MessageTypeMeCommand = "MeCommand"module.MessageTypeWelcome = "Welcome"module.MessageTypeSetCore = "SetCore"module.MessageTypeWhisper = "Whisper"module.MessageTypeTime = "Time"module.MajorVersion = 0module.MinorVersion = 2return module
ボット自体は、サーバー上の新しい ChatModule で作成されます。フィルター機能は、ボットが送信するメッセージに新しいメッセージタイプを追加するのに使用されます。
-- チャットモジュールに置く新しいモジュールスクリプト
local Chat = game:GetService("Chat")
local ReplicatedModules = Chat:WaitForChild("ClientChatModules")
local ChatConstants = require(ReplicatedModules:WaitForChild("ChatConstants"))
local function Run(ChatService)
local timeBot = ChatService:AddSpeaker("TimeBot")
timeBot:JoinChannel("All")
local function addMessageType(speaker, messageObject, channelName)
if speaker == "TimeBot" then
messageObject.MessageType = ChatConstants.MessageTypeTime
end
end
ChatService:RegisterFilterMessageFunction("TimeBotFilter", addMessageType)
task.spawn(function()
while task.wait(5) do
timeBot:SayMessage("The current time is: " .. os.time(), "All", {})
end
end)
end
return Run
最後に、メッセージ作成モジュールが作成される必要があります。このモジュールは、メッセージの種類を返し、KEY_MESSAGE_TYPE でインデックスされたインデックスに、KEY_CREATOR_FUNCTION を呼び出す必要があります。
機能は、KEY_CREATOR_FUNCTION によって保存される必要があります。まず、Frame と TextLabel を含む、メッセージ
-- MessageCreatorModule に含まれる新しいモジュールスクリプト
local messageCreatorModules = script.Parent
local util = require(messageCreatorModules:WaitForChild("Util"))
local clientChatModules = messageCreatorModules.Parent
local ChatSettings = require(clientChatModules:WaitForChild("ChatSettings"))
local ChatConstants = require(clientChatModules:WaitForChild("ChatConstants"))
local function CreateMessageLabel(messageData, channelName)
-- フレームとテキストラベルにメッセージを表示するためのGUIオブジェクトを作成
local BaseFrame, BaseMessage = util:CreateBaseMessage("", ChatSettings.DefaultFont, ChatSettings.ChatWindowTextSize, ChatSettings.DefaultMessageColor)
-- フレームの背景を赤に変更
BaseFrame.BackgroundColor3 = Color3.new(1,0,0)
BaseFrame.BackgroundTransparency = 0
-- プレースホルダーメッセージのテキストを更新するハンドル
local function UpdateTextFunction(messageObject)
if messageObject.IsFiltered then
BaseMessage.Text = messageObject.Message
end
end
UpdateTextFunction(messageData)
-- 使用可能な関数を使用してフレームの高さを決定する
local function GetHeightFunction(xSize)
return util:GetMessageHeight(BaseMessage, BaseFrame, xSize)
end
-- チャットウィンドウがフェイドするときに呼び出されるフェイド関数を作成します
local FadeParameters = {}
FadeParameters[BaseMessage] = {
TextTransparency = {FadedIn = 0, FadedOut = 1},
TextStrokeTransparency = {FadedIn = 0.75, FadedOut = 1}
}
local FadeInFunction, FadeOutFunction, UpdateAnimFunction = util:CreateFadeFunctions(FadeParameters)
-- メッセージラベルを定義する返典典
return {
[util.KEY_BASE_FRAME] = BaseFrame,
[util.KEY_BASE_MESSAGE] = BaseMessage,
[util.KEY_UPDATE_TEXT_FUNC] = UpdateTextFunction,
[util.KEY_GET_HEIGHT] = GetHeightFunction,
[util.KEY_FADE_IN] = FadeInFunction,
[util.KEY_FADE_OUT] = FadeOutFunction,
[util.KEY_UPDATE_ANIMATION] = UpdateAnimFunction
}
end
return {
[util.KEY_MESSAGE_TYPE] = ChatConstants.MessageTypeTime,
[util.KEY_CREATOR_FUNCTION] = CreateMessageLabel
}