계층화
레거시 채팅 시스템은 클라이언트-서버 모델을 사용합니다.서버 측 채팅 모듈 구성 요소 ChatChannel 및 ChatSpeaker 관리는 서버에서 ChatService에서 처리되며, 클라이언트는 메시지의 입력과 표시에 책임이 있습니다.서버와 클라이언트 간의 통신은 RemoteEvents를 사용하여 자동으로 처리됩니다.
엔진 서비스 자체는 채팅 시스템의 필수 저장 단위입니다. Roblox 장소가 로드될 때(클라이언트나 Studio에서 실행하거나 플레이할 때) 다음 구성 요소가 자동으로 서비스에 로드됩니다면 이 경우가 참이면 다음과 같은 구성 요소가 자동으로 서비스에 로드됩니다.
- 채팅 모듈 — 이 는 채팅 서비스 러너에 필요한 모듈 컬렉션입니다.이 폴더의 모든 콘텐츠는 스크립트에 필요하며 서버에서 사용자 지정 동작을 생성하는 데 사용됩니다.
- 클라이언트 채팅 모듈 — 이 폴더에는 ChatScript에 필요한 다양한 항목이 포함되어 있습니다.
- 명령 모듈 — 클라이언트 측 채팅 명령을 구현하는 데 사용되는 모듈을 포함합니다.
- MessageCreatorModules — 메시지를 처리하고 형식을 지정하는 데 사용되는 모듈을 포함합니다.
- ChatConstants — 서버와 클라이언트가 공유하는 상수를 포함합니다.
- ChatSettings — 다양한 설정을 저장하여 채팅창의 다양한 측면을 구성합니다.
- ChatLocalization — 텍스트 번역을 저장하는 데이터 구조.
- ChatServiceRunner — 이 Script는 채팅의 서버 구성 요소를 실행합니다.일반적으로 사용자 지정 채팅 동작과 기능을 만들기 위해 수정할 필요가 없습니다.
- BubbleChat — 게임 아바타 위에 사용자 채팅 메시지를 표시합니다(활성화되어 있는 경우).
- ChatScript — 이 LocalScript는 채팅의 클라이언트 구성 요소를 실행합니다.ChatServiceRunner와 마찬가지로 채팅을 사용자 지정하기 위해 수정할 필요가 없어야 합니다.게임이 실행되면 자동으로 StarterPlayerScripts로 복제됩니다.
채팅 시스템 수정
레거시 채팅 시스템을 수정하거나 사용자 지정하려면 먼저 위의 계층 복사본을 만들어야 합니다.
탐색기 창에서 TextChatService를 찾습니다.그런 다음, 속성 창에서 채팅 버전 속성을 레거시 채팅 서비스 로 설정합니다.
플레이 버튼( **** )을 사용하여 경험을 실행합니다(F5).
선택하고 복사(CtrlC 또는 ⌘C ) 에 추가된 개체를 선택하고 복사합니다(Chat).
경험을 중지하려면 중지 버튼(ShiftF5)을 사용하여 중지합니다.
Select 및 paste into ( 또는 ) 복사된 개체(경험이 실행되는 동안 부모로 지정되었어야 함)를 선택합니다.
Make sure that Chat.LoadDefaultChat 가 활성화되었는지 확인하십시오.
채팅 워크플로우
채팅을 사용자 정의하기 위해 모듈을 만들기 전에 채팅 메시지가 통과하는 워크플로를 이해하는 것이 중요합니다.텍스트 메시지 전송과 함께 채팅 시스템에 통합된 다양한 명령이 있으므로 모든 메시지가 명령으로 해석되어야 하는지 혹은 단순히 텍스트 메시지로 해석되어야 하는지 확인해야 합니다.텍스트 메시지조차도 프로세스에서 수정되고 필터링될 수 있습니다.
사용자가 채팅 입력에 집중하고 문자를 입력하면 클라이언트에서 즉시 여러 검사가 수행됩니다.문자가 Esc 이면 입력 상자가 닫혀 액션이 수행되지 않습니다.문자가 이외의 것이면 텍스트가 진행 중인 명령 프로세서를 통과합니다.이는 텍스트를 평가하여 어떤 조치를 취해야 하는지 확인하는 데 사용됩니다.예를 들어, 사용자가 /whisper 명령으로 속삭임을 시작할 때, 사용자 이름이 명령 후에 입력되자마자 입력 상자가 변경되어 사용자가 이제 속삭임 채널에 들어가고 있음을 나타냅니다.
채팅의 클라이언트 측에는 두 가지 종류의 프로세서가 있습니다: 진행 중 및 완료.전자는 모든 문자가 입력된 후 평가하고, 후자는 사용자가 입력을 마치고 Enter에 도달했을 때만 평가합니다.
사용자가 입력을 마치고 Enter 텍스트를 누르면 여러 개의 명령 프로세서를 통해 입력이 전송됩니다.진행 중인 명령이 사용자 지정 채팅 상태를 만들었으면 채팅은 최종 명령이 실행되어야 하고 메시지가 계속 진행되어야 하는지 상태를 확인합니다.메시지가 계속 전송될 수 있으면 텍스트는 완료 프로세서라고 하는 다른 세트의 프로세서를 통해 전송됩니다.이러한 프로세서 중 하나라도 true를 반환하면 메시지 전송이 중지됩니다.그렇지 않으면 메시지가 서버에 전송됩니다.
메시지가 서버에 도달하면 다른 명령 처리기 집합을 통해 이동합니다.클라이언트의 완료된 프로세서와 마찬가지로, 이러한 프로세서 중 하나라도 true를 반환하면 메시지 실행이 중지됩니다.그렇지 않으면 메시지가 필터 집합을 통해 전달됩니다(기본 Roblox 채팅 필터 포함).이 모든 작업이 완료되면 메시지가 모든 채널과 적절한 스피커에 전송됩니다.
서버 모듈
채팅 모듈 에 배치된 모듈은 다양한 목적으로 사용할 수 있습니다.이러한 모듈은 채팅 채널 및 스피커를 관리하고, 필터 및 명령 기능을 추가하고, 채팅봇을 실행하거나 서버에서 처리해야 하는 모든 것을 처리하는 데 사용할 수 있습니다.채팅 시스템과 상호작용하려면 각 모듈에 ChatService 개체가 전달됩니다.
ChatServiceRunner가 시작되면 ChatModules 내의 모든 모듈이 필요합니다.각 모듈이 차례로 모듈을 호출하여 함수를 반환하고, 각 함수에 자신의 ChatService 개체를 전달하기를 기대합니다.모듈이 수행하는 작업(봇 실행, 필터 함수 추가 등)에 관계없이, 작동하려면 이 형식을 따라야 합니다.
샘플 모듈 프레임워크
local function Run(ChatService)
-- 코드가 여기로 갑니다
end
return Run
채널 추가
ChatModule의 가장 간단한 작업 중 하나는 채널을 관리하는 것입니다.채널 개체는 ChatService의 AddChannel()으로 생성할 수 있습니다.채널 개체는 해당 채널의 멤버(예: 속성 및 함수)를 호출할 때만 사용해야 합니다(예: 속성 및 함수).ChatService 또는 ChatSpeakers의 컨텍스트에서 채널을 참조할 때 채널의 이름이 참조되어 사용됩니다.
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
채널 이벤트
채널에는 구독할 수 있는 여러 이벤트가 있습니다.이 이벤트는 채널에 ChatMessage가 게시되거나, ChatSpeaker가 떠나거나 참여하거나, 스피커가 음소거되거나 음소거가 해제될 때 발생합니다.예를 들어, 이 모듈은 이름 MyChannel 의 채널을 생성합니다.스피커가 채널에 참여하거나 채널을 떠날 때마다 시스템 메시지가 채널의 모든 스피커에 전송되어 이벤트를 알립니다.
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이 수행할 수 있는 또 다른 강력한 기능은 채팅 명령입니다.메시지가 서버에 전송되면 채팅은 ChatService에 등록된 각 명령 기능을 통해 메시지를 전송하고 관련 채널로 보냅니다.이 함수는 메시지가 전송되는 스피커, 메시지, 채널을 보냅니다.함수는 필요한 모든 작업을 수행한 다음 참이나 거짓을 반환할 수 있습니다.함수가 true를 반환하면 메시지가 채팅 시스템에서 처리되지 않게 됩니다.더 이상 명령 기능에 전송되지 않으며 채팅 창에 표시되지 않습니다.함수가 false를 반환하면 메시지가 다른 모든 명령 함수를 통해 계속됩니다.명령 함수 중 하나라도 true를 반환하지 않으면 메시지가 필터를 통해 전송되어 표시됩니다.
명령 기능은 채팅에서 특정 사용자가 경험 상태를 조작하기 위해 사용할 수 있는 텍스트 명령 관리 명령을 구현하는 데 자주 사용됩니다.
이 예제에서는 사용자가 채팅에서 ChatModule 을 입력하면 생성되는 Part 을 만들기 위해 /part가 사용됩니다.이 함수는 부품이 생성되어 메시지가 진행되지 않고 메시지가 표시되지 않으면 진실을 반환합니다. Note that this function returns true if a part was created which will stop the message from proceeding and no message will be displayed.부품이 생성되지 않으면 이 함수는 false를 반환해야 하므로 메시지가 시스템을 통해 계속 작동할 수 있습니다.
local Workspace = game:GetService("Workspace")
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
채팅 채널과 채팅 서비스 자체에도 채팅 명령이 있을 수 있습니다. 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
클라이언트 모듈
클라이언트 채팅 모듈 ClientChatModules 에 배치된 모듈은 클라이언트에 대한 사용자 지정 동작을 만드는 데 사용할 수 있습니다.이 모듈은 두 개의 다른 폴더로 나뉩니다: 명령 모듈 및 메시지 생성기 모듈.
명령 모듈
명령 모듈 은 명령 기능을 등록하는 서버의 모듈과 매우 유사하게 작동합니다.이러한 모듈은 사용자가 텍스트를 입력한 후 실행될 함수를 정의합니다.해당 텍스트를 읽을 수 있으며 명령은 메시지를 서버로 전달하거나 메시지의 진행을 중지할 수 있습니다.메시지 끝에서 평가되는 명령은 COMPLETED_MESSAGE_PROCESSOR 로 태그되고, 각 문자 후에 평가되는 명령은 IN_PROGRESS_MESSAGE_PROCESSOR 로 태그됩니다.
두 가지 유형의 명령에서 모듈은 명령에 사용할 프로세서 유형과 프로세서가 호출될 때 실행할 함수를 나타내는 사전을 반환해야 합니다.예를 들어, 완료된 메시지 프로세서 는 다음 형식을 취해야 합니다:
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
}
열거형은 명령 모듈 폴더 내의 유틸리티 안에 정의되어 있습니다. Note that the enum is defined in the Util inside of the CommandModules folder.
완료된 메시지 명령
완료된 메시지 명령 은 사용자가 입력을 마치고 Enter 평가됩니다.프로세서의 기능은 ChatMessage 개체, 클라이언트의 ChatWindow 및 ChatSettings 테이블을 전달합니다.함수가 true를 반환하면 메시지 처리가 중지되고 서버에 전송되지 않습니다.그렇지 않으면 다른 프로세서 중 누구도 그것을 중지하지 않으면 결국 서버로 전송됩니다.
예를 들어, 다음 프로세서는 사용자가 명령 /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 및 팀 채팅 시스템은 사용자가 /whisper 또는 /team 각각 입력했는지 확인하고 완성된 메시지를 적절한 사용자에게만 보냅니다.
사용자 지정 상태는 다음 기능이 있는 테이블이 될 것으로 예상됩니다:
- TextUpdated() — 입력 상자의 텍스트가 변경될 때 호출됩니다.
- GetMessage() — 사용자가 메시지 입력을 완료하고 Enter에 도달한 후 호출됩니다. 이 함수는 문자열을 반환할 것으로 예상됩니다.
- ProcessCompletedMessage() — 메시지가 처리되는 동안 호출됩니다.사용자 지정 상태 프로세서는 완료된 메시지 프로세서보다 항상 먼저 발사됩니다.다른 프로세서와 마찬가지로 이 함수는 메시지 전송이 중지되어야 하는 경우 true를 반환해야 하고, 그렇지 않으면 false를 반환해야 합니다.
- 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 요소를 생성하는 데 사용됩니다.각 유형의 메시지 생성자는 새로운 메시지 입력정의하므로 서로 다른 형식으로 다른 메시지를 만들 수 있습니다.또한 GUI 요소는 이미지, 버튼 등을 표시할 수 있도록 메시지 표시에 추가할 수 있습니다.
이러한 모듈은 여러 다른 위치에서 설정해야 합니다.각 메시지 입력ModuleScript 내에 메시지 유형 이 있어야 합니다.또한, 채팅 상태 ModuleScript 새로운 메시지 입력포함하도록 편집해야 합니다.마지막으로, 채팅의 서버 구성 요소가 지정된 메시지 입력새 메시지를 생성하면 모듈이 사용됩니다.
다음 예제에서는 5초마다 시간을 말하는 봇을 만들고, 전송된 메시지에 빨간색 배경이 표시되는 과정을 통해 이동합니다.
시작하려면 채팅 상태 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
봇 자체는 서버에서 새로운 채팅 모듈 에 생성됩니다.필터 함수가 사용되어 봇이 보내는 메시지에 새 메시지 유형을 추가하는 것을 참고하십시오.
-- 채팅 모듈에 배치될 새로운 모듈 스크립트
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로 인덱싱된 인덱스와 메시지 GUI 요소를 생성할 때 호출할 함수를 포함하는 사전을 반환해야 합니다: 메시지 인덱스가 KEY_CREATOR_FUNCTION로 인덱싱된 이 모듈은 두 요소를 포함해야 합니다: 메시지 유형, 로 인덱싱된 인덱스와 메시지 GUI 요소를 생성할 때 호출할 함수를 포함하는 사전을 반환해야 합니다.
KEY_CREATOR_FUNCTION에 저장된 함수는 여러 구성 요소가 있는 사전을 반환해야 합니다.먼저, 채팅 창에 표시될 Frame 및 TextLabel를 포함해야 합니다.이들은 함수 util:CreateBaseMessage() 로 생성할 수 있습니다.사전에는 메시지의 텍스트가 업데이트되는 경우 실행할 함수도 포함해야 합니다.클라이언트에 메시지가 처음 나타날 때, 메시지가 처리되고 필터링되는 동안 빈 자리 표시자 텍스트가 있으므로 업데이트 호출을 받을 때와 같은 메시지 개체가 처리해야 합니다.다음으로 사전에는 프레임의 높이를 결정하는 함수를 포함해야 합니다.이 함수는 종종 util:GetMessageHeight() 함수를 호출합니다.마지막으로, 사전에는 창이 사라질 때 요소가 사라지는 방법을 정의하는 여러 함수를 포함해야 합니다(이 기능의 유틸리티는 util:CreateFadeFunctions()).
-- MessageCreatorModules에 포함될 새로운 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)
-- 프레임과 텍스트랩에 메시지를 표시하기 위한 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
}