계층
전통적인 채팅 시스템은 클라이언트-서버 모델 을 사용합니다. 서버 사이드 채팅 모듈 구성 요소 ChatChannel 및 ChatSpeaker 는 서버에서 처리하며, 클라이언트는 입력 및 표시 메시지의 표시에 대해
Class.Chat 엔진 서비스 자체는 채팅 시스템에 필수 저장 단위입니다. Roblox 장소가 로드되면(클라이언트나 Studio 실행 또는 플레이 시) 다음 구성 요소가 Class.Chat 서비스에 자동으로 로드됩니다.
- ChatModule — 이 Folder 는 ChatServiceRunner 에 필요한 모듈 컬렉션입니다. 이 폴더의 모든 콘텐츠는 스크립트에 의해 생성되며 서버에서 사용자 지정 동작을 생성하는 데 사용됩니다.
- ClientChatModule — 이 폴더에는 ModuleScripts를 필요로 하는 다양한 요청 스크립트 가 포함되어 있습니다.
- CommandModule — 클라이언트 사이드 채팅 명령을 구현하는 모듈을 포함합니다.
- MessageCreatorModule — 메시지 처리 및 형식 지정에 사용되는 모듈을 포함합니다.
- ChatCommands — 서버와 클라이언트가 공유한 상수를 포함합니다.
- ChatSettings — 다양한 채팅 창 구성을 구성하기 위한 여러 설정을 저장합니다.
- ChatLocalization — 텍스트 번역을 저장하는 데이터 구조.
- ChatServiceRunner — 이 Script는 채팅 서버 구성 요소를 실행합니다. 일반적으로 이 작업을 수행하기 위해 사용자 정의 채팅 동작 및 기능을 만드는 데 필요한 모든 것을 수정할 필요가 없습니다.
- 버블 채팅 — 사용자 채팅 메시지를 게임 아바타 위에 표시합니다(활성화되면).
- ChatScript — 이 LocalScript는 채팅의 클라이언트 구성 요소를 실행합니다. 같이 채팅서비스 실행기처럼 수정할 필요 없이 클라이언트 구성 요소를 클론합니다. 게임이 이것을 클론하면 StarterPlayerScripts로 자동으로 클론됩니다.
채팅 시스템 수정
상속 채팅 시스템을 수정하거나 사용자 정의하려면 먼저 위의 계층을 복사해야 합니다.
탐색기 창에서 TextChatService를 찾습니다. 그런 다음 속성 창에서 채팅 버전을 2>LegacyChatService2>로 설정합니다.
플레이 버튼(F5>)을 사용하여 경험을 실행합니다.
선택 및 복사 ( CtrlC 또는 ⌘C ) 개체를 2>Class.채팅2>에 추가하십시오.
경험을 중지하려면 중지 버튼(ShiftF5)을 사용하십시오.
Select Chat 및 붙여넣기 에 대한 접근 (Ctrl 0> Shift0> 2> V2> 또는 5> ⌘5> 7> Shift7> 9> V9>) 클립된
Class.채팅.LoadDefaultChat 이 활성화되어 있는지 확인하세요.
채팅 워크플로
사용자 정의 채팅을 만들기 전에 채팅 메시지가 처리하는 워크플로를 이해하는 것이 중요합니다. 텍스트 메시지를 보내는 것과 함께, 채팅 시스템에 여러 명령이 구축되어 있으므로 모든 메시지를 확인해야 합니다. 심지어 텍스트 메시지도 이 프로세스에서 수정되고 필터링될
사용자가 채팅 입력에 집중하고 캐릭터를 입력하면 몇 가지 검사가 즉시 클라이언트에서 수행됩니다. 캐릭터가 Enter
채팅의 클라이언트 측에는 두 가지 종류의 프로세서가 있습니다: 진행 중 및 완료. 이전은 모든 문자가 입력된 후 평가하며, 나머지는 사용자가 입력한 후 평가합니다. Enter 를 누르면 됩니다.
사용자가 입력을 완료하고 Enter 텍스트를 누르면 입력이 여러 개의 명령 처리기를 통해 전송됩니다. 만약 In-Progress 명령이 사용자 지정 채팅 상태를 반환하면, 서버
메시지가 서버에 도착하면 다른 명령 처리기를 통해 처리됩니다. 클라이언트의 완료 프로세서와 마찬가지로, 이 프로세서 중 하나가 반환하면 메시지가 실행이 중지됩니다. 그렇지 않으면 메시지가 필터 집합(기본 Roblox 채팅 필터 포함)을
서버 모듈
채팅 모듈에 넣은 모듈은 다양한 목적으로 사용될 수 있습니다. 이 모듈은 채팅 채널 및 스피커를 관리하고, 필터 및 명령 함수를 추가하고, 채팅 봇을 실행하거나 서버에서 처리해야 하는 다른 모든 것을 처리할 수 있습니다. 채팅 시스템과
ChatServiceRunner 가 시작되면 각 ChatModule 내의 모든 모듈이 필요합니다. 각 모듈이 순차적으로 호출되면 ChatService 개체를 통해 각 모듈에 함수를 반환합니다. 모듈이 무엇을 하는지(봇 실행, 필터
샘플 모듈 프레임워크
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에서 수행할 수 있는 또 다른 강력한 기능은 채팅 명령 입니다. 서버
명령 함수는 종종 관리자 명령 을 구현하는 데 사용됩니다, 이는 특정 사용자가 채팅에 나와있는 특정 텍스트를 통해 경험 상태를 조작하도록 허용하는 텍스트 명령입니다.
이 예에서는 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
클라이언트 모듈
클라이언트 채팅 모듈에 넣은 모듈은 클라이언트에 대한 사용자 지정 동작을 만드는 데 사용될 수 있습니다. 이 모듈은 두 개의 다른 폴더로 나뉩니다: 명령 모듈 및 메시지 생성기 모듈.
명령 모듈
명령 모듈 은 서버에서 명령 기능 을 등록한 모듈과 매우 유사합니다. 이 모듈은 사용자가 텍스트에 입력한 후 발생할 함수를 정의
명령의 두 가지 유형 모두에서 모듈은 명령이 사용할 프로세서 유형 및 프로세서를 호출할 때 실행할 함수를 포함하는 사전을 반환해야 합니다. 예를 들어, 완료된 메시지 처리기는 다음과 같은 형식을 취해야 합니다.
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 열거형은 CommandModuleScript 폴더 내의 ModuleScript 안에 정의되어 있습니다.
메시지 명령 완료
메시지 명령을 완료했습니다. 사용자가 입력을 완료하고 입력 을 누르면 프로세서의 기능이 ChatMessage 개체, 서버0>ChatWindow0> 및 3>ChatSettings
예를 들어, 다음 프로세서는 사용자가 명령 /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
}
진행 상황 명령은 종종 사용자 지정 상태를 만들어 채널 수신자 대신 특정 사용자에게 메시지를 보내는 데 사용됩니다. 예를 들어, /whisper 및 /team 시스템은 각각 2>/whisper2> 또는 5>/team5>를 입력했
사용자 정의 상태에는 다음과 같은 기능이 있어야 합니다.A custom state is expected to be table with the following functions:
- 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
}
사용자가 기능과 모양 측면에서 두 가지 이상을 입력할 때 사용자 지정 상태의 채팅 바를 편집하고 텍스트를 포함하는 채팅 모듈을 편집할 수 있습니다. 예를 들어, 이 코드는 20
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 내의 MessageCreatorModule 내에 있어야 합니다. 또한, Chat 내의 2>Class.ModuleScript2>는 새로운 메시지 입력포함하
다음 예시에서는 5초마다 시간을 알려주는 봇을 만들고, 메시지가 빨간색 배경을 가집니다.
시작하려면 ChatCommands ModuleScript 에 새로운 유형의 메시지를 위한 필드를 추가해야 합니다.
-- 채팅 상수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에 배치할 새로운 ModModuleScript
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의 함수는 다음과 같은 순서로 채팅 창에 표시됩니다. 이 중 하나을 생성하려면 함수 util:Create
-- MessageCreatorModule에 포함될 새로운 ModuleScript
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)
-- 프레임과 TextLabel에 메시지를 표시하기 위해 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
}