ระดับ
ระบบการแชทในมือถือใช้ แบบรุ่นคลายความสัมพันธ์ client-server ส่วนกลางช่องแชทของเซิร์ฟเวอร์จัดการโดย ChatChannel และ ChatSpeaker บริหา
บริการเครื่องยนต์ Chat เองคือหน่วยเก็บข้อมูลที่จำเป็นสำหรับระบบการแชท: เมื่อ Roblox สถานที่โหลด (ไม่ว่าในเคลียดหรือใน Studio เมื่อทำงานหรือเล่น) ส่
- ChatModule — นี่คือคอลเลกชันของโมดูลที่ต้องการโดย Folder สิ่งทั้งหมดในโฟลเดอร์นี้ต้องการโดยสคริปต์และใช้เพื่อสร้างพฤติกรรมที่กำหนดเองบนเซิร์ฟเวอร์
- ClientChatModule — ไดเรกทอรีนี้มีต่างๆ ModuleScripts ที่ต้องการโดย ChatScript * CommandModule ในโมดูล — มีโมดูลที่ใช้ในการใช้คําสั่งแชทข้างล่าง
- MessageCreatorModule ข้อความ — รวมถึงโมดูลที่ใช้สำหรับการจัดการและรูปแบบข้อความ
- ChatCommands — รวมคงคลังของเซิร์ฟเวอร์และลูกค้า
- การตั้งค่าการแชท — เก็บรวบรวมตั้งค่าต่างๆ เพื่อกำหนดด้านต่างๆ ของ หน้าต่างแชท
- ChatLocalization — โครงสร้างข้อมูลที่เก็บไว้ในข้อความ
- ChatServiceRunner — นี่ Script ดำเนินการส่วนประกอบของเซิร์ฟเวอร์ของการแชท ในทั่วไปนี่ไม่จำเป็นต้องแก้ไขเพื่อสร้างพฤติกรรมและคุณสมบัติของการแชทที่กําหนดเอง
- BubbleChat — แสดงข้อความการแชทของผู้ใช้เหนือ avatar ของพวกเขา (ถ้าเปิดใช้งาน)
- ChatScript — ส่วนนี้ของ LocalScript จะดำเนินการส่วนของลูกค้าของการแชท เช่นเดียวกับ StarterPlayerScripts นี้ควรไม่จำเป็นต้องแก้ไขเพื่อปรับแต่งการแชท เมื่อเกมวิ่งนี้ได้รั
การแก้ไขระบบการแชท
เพื่อปรับแต่งหรือปรับแต่งระบบการแชทมรดก คุณต้องสร้างคัดลอกของระดับของหน้าด้านบนก่อน
ใน หน้าต่าง Explorer ค้นหา TextChatService แล้วในหน้าต่าง คุณสมบัติ ตั้งค่า 1>ChatVersion1> ให้เป็น 4>LegacyChatService4>
วิ่งประสบการณ์โดยใช้ปุ่ม เล่น ( F5 )
เลือกและคัดลอก ( CtrlC หรือ ⌘C ) วัตถุที่เพิ่มไปยัง 2> Class.แชท2>
หยุดประสบการณ์โดยใช้ปุ่ม หยุด ( ShiftF5 )
เลือก Chat และ วางใน ( Ctrl 0> Shift 0> 2> V2> หรือ 5> ⌘5> 7> Shift7> 9> V9>) โดย
ให้แน่ใจว่า Chat.LoadDefaultChat เปิดใช้งานแล้ว
การทำงานแชท
ก่อนที่จะสร้างโมดูลเพื่อปรับแต่งการแชท สิ่งสำคัญคือต้องเข้าใจกระบวนการทำงานที่ข้อความแชทผ่าน ร่วมกับการส่งข้อความข้างเคียงของข้อความแชท มีคำสั่งต่างๆ ที่
ช่องหล
ในด้านล่างของการแชทมีสองประเภทของโปรเซสเซอร์: ในการดำเนินการอยู่นั้นเอง และ เสร็จสิ้นแล้ว โปรเซสเตอร์ที่สองจะประเมินหลังจากที่ทุกตัวอักษรถูกพิมพ์แล
เมื่อผู้ใช้จบการพิมพ์และกด เข้า ข้อความเข้าสู่ระบบประมวลผลหลัก หากคำสั่ง เซิร์ฟเวอร์
เมื่อข้อความถึงเซิร์ฟเวอร์แล้วมันจะผ่านผ่านชุดคำสั่งอื่นๆของเซิร์ฟเวอร์ ตัวกรองเสร็จสิ้น บนเครื่องคลิเอนต์หากผู้
โมดูลเซิร์ฟเวอร์
โมดูลที่วางใน ChatModule สามารถใช้สำหรับวัตถุประสงค์ที่หลากหลาย โมดูลเหล่านี้สามารถใช้เพื่อจัดการช่องและผู้พูดในบ่อน้ำของคุณ เพิ่มการกรองและคุณสมบัติ กา
เมื่อ ChatServiceRunner เริ่มขึ้น มันต้องการแต่ละโมดูลภายใน ChatModule ตามลำดับ มันคาดหวังว่าแต่ละโมดูลจะกลับมาเป็นฟังก์ชันในขณะที่มันเรียก
ตัวอย่างโครงสร้างโมดูล
local function Run(ChatService)
-- โค้ดอยู่ที่นี่
end
return Run
เพิ่มช่อง
หนึ่งในสิ่งที่เรียบง่ายที่ ChatModule สามารถทำได้คือการจัดการ ช่อง ช่องสามารถสร้างได้ด้วยวิธีการ
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 สามารถทำได้คือการแชท คําสั
คุณสมบัติการสั่งงานมักใช้เพื่อให้เป็นไปตาม คำสั่งของผู้ดูแลระบบ ซึ่งเป็นคำสั่งข้อความที่ผู้ใช้บางคนสามารถใช้เพื่อปรับแต่งสถานะการประสบการณ์ผ่านการโต้ตอบข้อความที่กระทู้
ในตัวอย่างนี้ ใช้ โมดูลการแชท เพื่อสร้าง Class.Part หากผู้ใช้พิมพ์ 1> /part1> ในการแชท โปรดทราบว่าคุณสมบัตินี้จะกลับคืน true
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 ตัวคำสั่งจะดำเนินการทุกข้อความที่ส่งไปยังเซิร์ฟเวอร์ ในขณะที่ 2> ChatService2> คำสั่งจะดำเนินการเฉพ
การกรองฟังก์ชัน
ข้อความที่ไม่ได้หยุดโดย คุณสมบัติการประมวลผล จะผ่านผ่านทุกคุณสมบัติการกรองที่ลงทะเบียนใน 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 สามารถใช้เพื่อให้พฤติกรรมที่กำหนดเองสำหรับลูกค้า โมดูลเหล่านี้แบ่งออกเป็นสองโฟลเดอร์ที่แตกต่างกัน: โมดูลการใช้งานคำสั่ง และ โมดูลการสร้างข้
โมดูลคําสั่ง
โมดูลคําสั่ง ทํางานเหมือนโมดูลบนเซิร์ฟเวอร์ที่ลงทะเบียน คําสั่งฟังก์ชัน เห
ในทั้งสองประเภทของคำสั่ง โมดูลต้องกลับไปที่พจนารูปแบบที่พูดว่าชนิดของโปรเซสเซอร์ที่คำสั่งนั้นควรใช้และสิ่งที่จะดำเนินการเมื่อโปรเซสเซอร์ถูกเรียก ตัวอย่างเช่น โปรเซสเซอร์ที่เส
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
}
หมายเหตุว่า KEY_COMMAND_PROCESSOR_TYPE รายการใน Util ModuleScript ภายในโฟลเดอร์ 1>CommandModuleScript1>
สำเร็จแล้วคำสั่งข้อความ
คําสั่งข้อความสําเร็จ จะได้รับการประเมินเมื่อผู้ใช้ได้พิมพ์เสร็จและกด เข้า แล้ว ห
เช่นเดียวกับตัวประมวลผลต่อไปนี้จะลบข้อความที่เก่าที่สุดในช่องปัจจุบันหากผู้ใช้กรุณาให้คำสั่ง /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
}
คําสั่งในการดําเนินการขั้นสูงมักใช้เพื่อสร้างสถานะ ที่กําหนด สําหรับการส่งข้อความไปยังผู้ใช้ที่เฉพาะเจาะจงแทนที่จะเป็นช่องที่
คาดหวังว่าสถานะที่กำหนดเองจะเป็นตารางด้วยฟังก์ชันต่อไปนี้:
- TextUpdated() — เรียกเมื่อข้อความในกล่องข้อมูลเปลี่ยนแปลง
- GetMessage() — โทรหลังจากที่ผู้ใช้เสร็จสิ้นการป้อนข้อความและกด Enter คุณสมบัตินี้คาดว่าจะกลับมาเป็นสตริง
- ProcessCompletedMessage() — เรียกว่าเป็นข้อความที่กําลังประมวลผล เครื่องประมวลผลข้อความที่กําลังประมวลผลจะเรียกตัวเองก่อนเมื่อข้อความสําเร็จ เช่นเดียวกับเครื่องประมวลผลอื่น ๆ นี้
- 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
}
หนึ่งในข้อดีหลักในการใช้สถานะที่กำหนดเองคือผู้ใช้สามารถแก้ไขแถบแชทและเนื้อหาในขณะที่พูดคุยในทางการใช้งานแ
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
}
เมื่อกล่าวถึงก่อนหน้านี้, เมื่อส่งข้อความใด ๆ สถานะที่กำหนดเองจะถูกลบออกและ chat จะกลับสู่ปกติ หากจำเป็นต้องรีเซ็ตสถานะที่กำหนดก่อนส่งข้อความ, สถานะสามารถรีเ
โมดูลผู้สร้างข้อความ
ประเภทของโมดูลอื่นที่สามารถใช้ในส่วนประกอบของลูกค้าคือ โมดูล Message Creator โมดูล. ประเภทของโมดูลนี้ใช้เพื่อสร้างรูปแบบข้อความในหน้าต่างแชทเพ
โมดูลเหล่านี้ต้องการการติดตั้งในสถานที่ต่างๆ หลายแห่ง พิมพ์จะต้องมี ModuleScript ภายใน MessageCreatorModule นอก
ตัวอย่างต่อไปจะไปผ่านการสร้างบอทที่พูดว่าเวลาทุก 5 วินาทีและข้อความที่ส่งไปจะได้รับพื้นหลังสีแดง
เพื่อเริ่มต้น ChatSecondsModuleScript ต้องการเพิ่มฟิลด์สำหรับข้อความประเภทใหม่
-- ChatConstructlocal 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 ใหม่บนเซิร์ฟเวอร์ โปรดทราบว่าตัวกรองจะใช้เพื่อเพิ่มประเภทข้อความใหม่ให้กับข้อความที่บอทส่ง
-- ModuleScript ใหม่ที่จะวางใน 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 ต้องการกลับมาเป็นจุดศูนย์กลางของหนั
-- ModuleScript ใหม่ที่จะมีใน 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 สำหรับ Frame และ TextLabel เพื่อรับข้อความ
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)
-- ใช้คุณสมบัติ util เพื่อกำหนดความสูงของแฟรม
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
}