텍스트 채팅 개요

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

Roblox는 라이브 세션을 통해 플레이어 간 텍스트 기반 메시징을 제공합니다 TextChatService .이 서비스에는 표준 기능이 있지만, 사용자 지정 요구 사항 에 따라 메시지를 전달하거나 특정 플레이어에 특별 권한이나 조정을 추가하고, 특정 작업을 수행하기 위해 사용자 지정 명령을 생성하는 등 채팅을 확장하고 사용자 지정하기 위한 일련의 메서드와 이벤트도 제공합니다.

다음 섹션에서는 채팅 시스템을 사용자 지정하기 위해 사용할 수 있는 주요 클래스와 인스턴스를 요약합니다.

최상위 구성

단일 클래스는 채팅 메시지 필터링, 조정 및 사용자 권한과 같은 전체 채팅 시스템을 관리하는 책임이 있습니다.CreateDefaultTextChannelsCreateDefaultCommands와 같은 속성을 사용하여 기본 채팅 채널 및 명령을 활성화하거나 비활성화합니다.

기본 UI 구성

TextChatService는 경험의 요구에 맞게 사용자 지정할 수 있는 기본 UI를 제공합니다.이러한 구성 중 하나는 연결된 UI 요소를 숨기기 위해 비활성화할 수 있으며, 원하는 경우 사용자 지정 인터페이스로 교체할 수 있습니다.

채널, 메시지 및 명령

  • TextChannel — 클라이언트에서 서버로 사용자가 보낸 채팅 메시지를 전달하는 텍스트 채팅 채널을 나타내며, 이를 권한에 따라 다른 사용자에게 표시합니다.이러한 인스턴스는 기능하려면 TextChatService에 부모로 지정되어야 합니다.

  • TextSource — 사용자를 TextChannel에 나타냅니다.이 인스턴스는 호출될 때 TextChannel 직접 부모로 지정됩니다.These instances are directly parented to the when AddUserAsync() is called.텍스트 소스에는 사용자의 채널 내 메시지 전송 능력과 같은 채널의 상세 권한이 포함됩니다.한 사용자가 여러 텍스트 채널에 추가되었으면 여러 텍스트 소스와 연결할 수 있습니다.

  • TextChatMessage — 텍스트 채널에서 메시지 발신자, 원래 메시지, 필터링된 메시지 및 생성 시간을 포함하는 단일 채팅 메시지를 나타냅니다.

  • TextChatCommand — 사용자가 PrimaryAlias 또는 SecondaryAlias에 일치하는 메시지를 보내 특정 행동이나 동작을 실행할 수 있도록 허용합니다.이러한 인스턴스는 기능하려면 TextChatService 에 부모로 지정되어야 합니다.

채팅 흐름도

텍스트 채팅은 클라이언트-서버 모델을 사용하며, 보내는 클라이언트 , 서버 , 그리고 받는 클라이언트 가 있습니다.

A flowchart for in-experience text chat.
  1. 플레이어가 로컬 기기메시지를 보내 TextChannel:SendAsync() 메서드를 트리거합니다.이 메서드는 메시지를 처리하고 채팅 명령인지 일반 채팅 메시지인지 여부를 결정합니다.

    • 메시지가 채팅 명령이면 TextChatCommand.Triggered 이벤트를 발생시켜 정의된 액션수행합니다. 추가 단계가 필요 없습니다.

    • 메시지가 일반 채팅 메시지인 경우 발신자에게 메시지를 표시하기 위해 TextChatService.SendingMessage 이벤트를 발생시킵니다.동시에, TextChannel:SendAsync() 메시지를 서버에 전달합니다.

  2. 서버는 권한 및 Roblox 커뮤니티 필터링 요구 사항에 따라 메시지를 다른 플레이어에게 전달할지 여부를 결정하기 위해 TextChannel.ShouldDeliverCallback를 발사합니다.

  3. 메시지가 다른 플레이어에게 전달할 수 있는지 확인하면 서버는 필터를 적용하고 두 번 발사합니다:

    1. 첫 번째는 전송 클라이언트에 있으며 서버가 메시지를 TextChatService.MessageReceived 이벤트를 통해 처리하고 있음을 알려줍니다.이 이벤트는 발신 클라이언트의 로컬 메시지를 서버에서 처리된 메시지로 교체합니다.원본에 필터링이 필요하지 않은 경우 메시지는 동일합니다.

    2. 두 번째는 받는 클라이언트에서 발생하며, 이는 메시지를 다른 플레이어에게 표시하는 TextChatService.MessageReceived 이벤트를 트리거합니다.

텍스트 채팅 후크와 콜백

API는 채팅 메시지의 모양과 전달에 대한 명확한 분리를 장려합니다.텍스트 채팅 시스템의 여러 인스턴스가 중앙화된 명확한 위치에서 형식을 지정하기 위한 후크와 콜백을 제공합니다.

A flowchart of the TextChatService callbacks order

| 호출백 | 반환 값 | | ----------------------------------------- | ----------------------------------- | | | boolean | | | | | | | | | | | | | | |

조건부로 메시지 전달

TextChannel.ShouldDeliverCallback 콜백은 서버에서만 정의되어야 합니다.메시지가 전송되어 메시지가 전달되어야 하는지 여부를 결정하기 위해 텍스트 채널의 각 TextSource 자식에 대해 콜백이 발생합니다.이 콜백은 추가 게임플레이 컨텍스트에 의존하는 사용자 지정 메시지 전달 논리를 구현하는 데 사용할 수 있습니다.

  • 근접 기반 채팅 사용자가 자신에게 가까운 사람들에게만 메시지를 보낼 수 있는 곳
  • 특정 특성을 가진 사용자가 다른 사용자에게 메시지를 보내는 것을 방지합니다.

메시지 표시 사용자 지정화

기본 TextChatService UI는 메시지 표시 방식을 형식화하고 사용자 지정하기 위해 풍부한 텍스트에 의존합니다.예를 들어 사용자에게 표시되기 전에 메시지 형식을 지정하기 위해 다음 콜백을 사용할 수 있습니다.색을 추가하거나 채팅 태그사용자 이름이나 메시지 콘텐츠를 형식화하기 위해 또는 사용자 이름에 태그를 추가합니다.

다음 콜백은 표시될 모든 TextChatMessage 에 호출되며, 여기에서 TextChannel , TextSource 또는 TextChatMessage 콘텐츠에 따라 채팅 창 모양을 사용자 지정할 수 있습니다.클라이언트가 메시지를 보낼 때, 메시지가 서버에 전송되고 값이 생성될 때 이러한 콜백이 한 번 호출됩니다.메시지가 서버에 의해 받아지고 다른 사용자에게 전달되면 발신자 클라이언트가 업데이트된 Enum.TextChatMessageStatus 값으로 메시지를 다시 받습니다.

  • TextChatService.OnIncomingMessage — 이 콜백은 클라이언트에서만 정의되어야 합니다.콜백은 서버에서 메시지를 받거나 로컬 클라이언트가 방금 메시지를 보냈을 때 발생합니다.콜백은 모든 TextChatMessage 인스턴스에서 받은 모든 TextChannel 메시지마다 호출되며 사용자에게 표시되기 전에 메시지를 처리하는 첫 번째입니다.
  • TextChannel.OnIncomingMessage — 이 콜백은 클라이언트에서만 정의되어야 합니다.콜백은 서버에서 메시지를 받을 때 발생합니다.콜백은 받은 모든 TextChatMessage에서 매 TextChannel 호출됩니다.기본 TextChannel 인스턴스에서 생성된 TextChatService.CreateDefaultTextChannels 는 이 콜백이 정의되어 있으며 재정의할 수 있습니다.
  • TextChatService.OnBubbleAdded — 이 콜백은 클라이언트에서만 정의되어야 합니다.채팅 창 UI의 메시지 표시와 독립적으로 채팅 버블의 모양을 사용자 지정하려는 데 사용합니다.
  • TextChatService.OnChatWindowAdded — 이 콜백은 클라이언트에서만 정의되어야 합니다.채팅 창 UI에서 채팅 메시지의 모양을 사용자 지정하기 위해 채팅 메시지의 모양과 무관하게 사용합니다.

레거시 채팅에서 마이그레이션

이 섹션은 레거시 채팅 시스템에서 이전하는 데 도움이 되며 공통 채팅 기능 및 동작을 구현하기 위한 대체 방법을 제공하여 TextChatService 을 사용합니다.

  1. 탐색기 창에서 를 선택합니다.

  2. 속성 창에서 드롭다운 을 찾아 선택하십시오.

기본 기능

두 시스템 모두 동일한 기본 채팅 기능을 공유하지만, TextChatService 구현은 일반적으로 더 지속 가능하고 반복하기 쉽습니다.

기능성레거시 채팅텍스트채팅서비스차이점
채팅 메시지 보내기Players:Chat()TextChannel:SendAsync()방법은 풍부한 텍스트 서식 지정 및 메시지 우선 순위와 같은 더 고급 채팅 기능을 지원합니다.또한 부적절한 메시지가 전송되는 것을 방지하기 위한 내장 필터링도 포함합니다.
메시징 콜백 구현Chat:InvokeChatCallback()``Class.Chat:RegisterChatCallback()Class.TextChatService.SendingMessage``Class.TextChatService.OnIncomingMessage레거시 채팅 시스템은 메시지 전달을 위해 채팅 시스템 이벤트에 함수를 바인딩합니다.TextChatService의 두 가지 방법은 더 나은 유연성과 사용자 지정을 제공합니다.
사용자 지정 채팅 명령 추가ChatService/ChatCommand 모듈TextChatCommandTextChatService에는 레거시 채팅 모듈을 사용하는 대신 텍스트 명령에 전용 클래스가 있습니다.
시스템 메시지 표시StarterGui:SetCore() 사용 중 ChatMakeSystemMessageTextChannel:DisplaySystemMessage()TextChannel.OnIncomingMessage 콜백은 메시지 모습사용자 지정하기 위해 TextChatMessageProperties 인스턴스를 반환할 수 있습니다.
채팅 비활성화게임 설정 인 스튜디오와 ChatWindow/ChatSettings 모듈에서 채팅 창 숨기기 위한ChatWindowConfiguration.Enabled

메시지 필터링

TextChatService 각 플레이어의 계정 정보에 따라 채팅 메시지를 자동으로 필터링하여 모든 종류의 채팅 메시지에 대한 텍스트 필터링을 수동으로 구현할 필요가 없습니다.

기능성레거시 채팅텍스트채팅서비스
개별 플레이어에 대한 채팅 메시지 필터링Chat:FilterStringAsync()자동
방송 메시지 필터링 Filter broadcasting messagesChat:FilterStringForBroadcast()자동

창과 거품 채팅

채팅 창 과 거품 채팅 의 모든 동작과 사용자 지정 옵션은 레거시 채팅 시스템과 동일합니다.레거시 채팅 시스템은 채팅 모듈 또는 Players 컨테이너를 사용하여 사용자 지정할 수만 허용하므로 서비스는 모든 채팅 창 및 거품 채팅 속성을 관리하기 위한 전용 클래스(ChatWindowConfigurationBubbleChatConfiguration)를 제공합니다.또한 Studio 설정을 사용하여 전체것을 스크립트해야 하는 대신 대화 거품의 모양과 동작 속성을 쉽게 조정하고 미리 볼 수 있습니다.

기능성레거시 채팅텍스트채팅서비스
채팅 창 활성화Class.Chat.LoadDefaultChat``Class.Players.ClassicChatChatWindowConfiguration.Enabled
거품 채팅 활성화Class.Chat.BubbleChatEnabled``Class.Players.BubbleChatBubbleChatConfiguration.Enabled
채팅 창 속성 설정Players:SetChatStyle()ChatWindowConfiguration
거품 채팅 속성 설정Chat:SetBubbleChatSettings()``Class.Chat.BubbleChatSettingsChanged()``Class.Players.BubbleChat``Class.Players:SetChatStyle()BubbleChatConfiguration
NPC 거품 활성화Chat:Chat()TextChatService:DisplayBubble()

스피커의 "추가 데이터" 마이그레이션

레거시 Lua 채팅 시스템은 개발자가 SetExtraData 클래스에서 Speaker 을 사용할 수 있게 했습니다.이 데이터는 이름 색상, 채팅 색상 또는 특정 스피커에 대한 이름 태그 적용에 사용되었습니다.

레거시 채팅 시스템 SetExtraData

-- 레거시 채팅 시스템에서 스피커에 추가 데이터를 설정하는 예시
ChatService.SpeakerAdded:Connect(function(playerName)
local speaker = ChatService:GetSpeaker(playerName)
speaker:SetExtraData("NameColor", Color3.fromRGB(255, 255, 55))
speaker:SetExtraData("ChatColor", Color3.fromRGB(212, 175, 55))
speaker:SetExtraData("Tags", {{TagText = "YourTagName", TagColor = Color3.fromRGB(0, 255, 0)}, {TagText = "OtherTagName", TagColor = Color3.fromRGB(255, 0, 0)}})
end)

TextChatServiceSetExtraData 와 직접적인 동등성이 없습니다.대신, 콜백을 사용하여 메시지의 모양을 메시지의 에 따라 풍부한 텍스트를 기반으로 사용자 지정합니다.

다음은 레거시 Lua 채팅의 "추가 데이터"를 액세스하여 Player 개체의 특성에 액세스하는 예입니다.

TextChatService 특성 설정

local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
player:SetAttribute("NameColor", Color3.fromRGB(255, 255, 55))
player:SetAttribute("ChatColor", Color3.fromRGB(212, 175, 55))
player:SetAttribute("isYourTag", true)
player:SetAttribute("isOtherTag", true)
end)

그런 다음 플레이어에 설정된 특성에 따라 채팅 창의 모양을 사용자 지정하기 위해 OnChatWindowAdded 콜백을 사용할 수 있습니다.

OnChatWindowAdded에 대한 TextChatService

local TextChatService = game:GetService("TextChatService")
local Players = game:GetService("Players")
TextChatService.OnChatWindowAdded = function(textChatMessage)
local textSource = textChatMessage.TextSource
if textSource then
local player = Players:GetPlayerByUserId(textSource.UserId)
if player then
local overrideProperties = TextChatService.ChatWindowConfiguration:DeriveNewMessageProperties()
overrideProperties.PrefixText = textChatMessage.PrefixText
overrideProperties.Text = textChatMessage.Text
local nameColor = player:GetAttribute("NameColor")
if nameColor and typeof(nameColor) == "Color3" then
overrideProperties.PrefixTextProperties.TextColor3 = nameColor
end
local chatColor = player:GetAttribute("ChatColor")
if chatColor and typeof(chatColor) == "Color3" then
overrideProperties.TextColor3 = chatColor
end
local isYourTag = player:GetAttribute("isYourTag")
if isYourTag == true then
overrideProperties.PrefixText = `<font color='rgb(0, 255, 0)'>[YourTag]</font> {overrideProperties.PrefixText}`
end
local isOtherTag = player:GetAttribute("isOtherTag")
if isOtherTag == true then
overrideProperties.PrefixText = `<font color='rgb(255, 0, 0)'>[OtherTag]</font> {overrideProperties.PrefixText}`
end
return overrideProperties
end
end
return nil
end