TextChatService를 사용하면 사용자 아바타와 NPC 위에 사용자 정의 가능한 음성 채팅 버블을 표시하기 위해 버블 채팅을 사용할 수 있습니다. 버블 채팅은 게임을 시각적으로 더 몰입감 있게 만들고 사용자가 메시지와 발신자를 쉽게 식별할 수 있도록 도와줍니다. 이 기능은 사용자가 다른 사람과 소통하는 동안 콘텐츠에 집중해야 하는 게임에서 특히 유용합니다.
버블 채팅 활성화
게임에서 버블 채팅을 활성화하려면:
탐색기 창에서 BubbleChatConfiguration을 선택하고 TextChatService 아래에 위치합니다.

속성 창에서 BubbleChatConfiguration.Enabled 체크박스를 선택합니다.

버블 사용자 정의
버블 채팅을 활성화한 후, 게임의 테마에 맞게 채팅 버블의 모양과 동작을 사용자 정의할 수 있습니다. 텍스트 색상 및 간격과 같은 기본 변경 사항에 대해서는 BubbleChatConfiguration의 속성 창을 사용하거나, 버블 배경 이미지 및 기타 시각적 조정을 위한 고급 사용자화를 구현하십시오.

또는 StarterPlayerScripts에 모든 사용자 정의 설정을 포함한 LocalScript를 추가하십시오. 이렇게 하면 엔진이 런타임 동안 사용자 정의를 적용하여 Studio의 설정을 덮어씁니다. 사용자가 특정 이벤트나 조건을 트리거할 때 채팅 버블에 특수 효과를 추가하는 데 유용합니다.
기본 사용자 정의
다음 표는 일반적인 버블 채팅 사용자 정의 속성을 보여줍니다. 전체 사용자 정의 속성 목록은 BubbleChatConfiguration을 참조하십시오.
| 속성 | 설명 | 기본값 |
|---|---|---|
| BackgroundColor3 | 버블의 배경색 (Datatype.Color3). | [250, 250, 250] |
| FontFace | 버블 텍스트의 Font. | BuilderSansMedium |
| TextColor3 | 버블 텍스트의 색상 (Datatype.Color3). | [57, 59, 61] |
| TextSize | 버블 텍스트의 크기. | 16 |
고급 사용자 정의
버블의 고급 사용자 지정을 위해, BubbleChatConfiguration 아래에 버블 모양의 특정 측면을 표시하는 UI 객체를 자식으로 추가합니다:
- 버블 배경 이미지 설정을 위한 ImageLabel.
- 배경 그라디언트 설정을 위한 UIGradient.
- 버블의 모서리 모양을 위한 UICorner.
- 텍스트와 버블 가장자리 간의 여백을 위한 UIPadding, 부모의 일반 크기에 상대적으로.
이 객체들을 추가한 후, 채팅 버블에 적용할 해당 속성을 수정하여 고급 버블 사용자 정의를 할 수 있습니다. 다음 예제 LocalScript는 버블에 배경 이미지를 추가하고 날카로운 모서리를 추가합니다:
고급 버블 사용자 정의local TextChatService = game:GetService("TextChatService")local bubbleChatConfiguration = TextChatService.BubbleChatConfigurationbubbleChatConfiguration.TailVisible = falsebubbleChatConfiguration.TextColor3 = Color3.fromRGB(220, 50, 50)bubbleChatConfiguration.FontFace = Font.fromEnum(Enum.Font.LuckiestGuy)local bubbleUICorner = bubbleChatConfiguration:FindFirstChildOfClass("UICorner")if not bubbleUICorner thenbubbleUICorner = Instance.new("UICorner")bubbleUICorner.Parent = bubbleChatConfigurationendbubbleUICorner.CornerRadius = UDim.new(0, 0)local bubbleUIPadding = bubbleChatConfiguration:FindFirstChildOfClass("UIPadding")if not bubbleUIPadding thenbubbleUIPadding = Instance.new("UIPadding")bubbleUIPadding.Parent = bubbleChatConfigurationendbubbleUIPadding.PaddingTop = UDim.new(0, 20)bubbleUIPadding.PaddingRight = UDim.new(0, 10)bubbleUIPadding.PaddingBottom = UDim.new(0, 15)bubbleUIPadding.PaddingLeft = UDim.new(0, 10)local bubbleImageLabel = bubbleChatConfiguration:FindFirstChildOfClass("ImageLabel")if not bubbleImageLabel thenbubbleImageLabel = Instance.new("ImageLabel")bubbleImageLabel.Parent = bubbleChatConfigurationendbubbleImageLabel.Image = "rbxassetid://109157529833093"bubbleImageLabel.ScaleType = Enum.ScaleType.SlicebubbleImageLabel.SliceCenter = Rect.new(40, 40, 320, 120)bubbleImageLabel.SliceScale = 0.5

다음 표에서는 사용 가능한 GuiObject 및 모양 수정자 자식과 그 유효한 사용자 정의 속성을 설명합니다:
| 속성 | 설명 | 기본값 |
|---|---|---|
| Image | 버블 배경 이미지의 자산 ID. | |
| ImageColor3 | 버블 배경 이미지의 색상 색조 (Datatype.Color3). | [255, 255, 255] |
| ImageRectOffset | 위치에서 표시할 이미지 영역의 오프셋(픽셀). | (0, 0) |
| ImageRectSize | 표시할 이미지 영역의 크기(픽셀). 전체 이미지를 표시하려면 어떤 차원이라도 0으로 설정합니다. | (0, 0) |
| ScaleType | 버블의 절대 크기와 이미지의 크기가 다를 때 이미지를 렌더링하기 위한 스케일 유형입니다. | Stretch |
| SliceCenter | 이미지가 9 슬라이스 이미지인 경우 이미지의 슬라이스 경계. ScaleType를 Slice로 설정할 때만 적용됩니다. | (0, 0, 0, 0) |
| SliceScale | 9 슬라이스 이미지인 경우 슬라이스 가장자리의 스케일 비율. ScaleType를 Slice로 설정할 때만 적용됩니다. | 1 |
| TileSize | 이미지의 타일링 크기. ScaleType를 Tile로 설정할 때만 적용됩니다. | (1, 0, 1, 0) |
버블 개별 사용자 정의
특정 조건에 따라 채팅 버블의 스타일을 개별적으로 조정하고 동작을 수정할 수 있어 일반 설정을 덮어쓸 수 있습니다. 예를 들어, NPC와 사용자를 구분하기 위해 채팅 버블을 사용하거나, 중요한 건강 상태를 강조 표시하고, 미리 정의된 키워드가 있는 메시지에 특별 효과를 적용할 수 있습니다.
버블 개별 사용자 지정을 설정하려면, BubbleChatMessageProperties를 사용하는 클라이언트 측 LocalScript를 추가합니다. 이는 BubbleChatConfiguration의 일치하는 속성을 덮어쓰고, 각 버블의 사용자 지정을 지정하기 위해 TextChatService.OnBubbleAdded 콜백을 추가합니다. 이 콜백은 TextChatMessage 속성과 부착물도 제공하므로 사용자의 속성, 채팅 텍스트 내용 및 정의하고자 하는 기타 특별 조건을 기반으로 사용자 지정을 적용할 수 있습니다.
다음은 개별 버블 사용자 지정을 위한 기본 사용자 정의 속성입니다:
| 속성 | 설명 | 기본값 |
|---|---|---|
| BackgroundColor3 | 버블의 배경색 (Datatype.Color3). | (250, 250, 250) |
| BackgroundTransparency | 버블의 배경 투명도. | 0.1 |
| FontFace | 버블 텍스트의 Font. | BuilderSansMedium |
| TextColor3 | 버블 텍스트의 색상 (Datatype.Color3). | [57, 59, 61] |
| TextSize | 버블 텍스트의 크기. | 16 |
다음 예제는 채팅 메시지 발신자가 IsVIP 속성을 가지고 있는지 확인하여 VIP 사용자의 채팅 버블에 특별한 외관을 추가합니다:
VIP 버블
local TextChatService = game:GetService("TextChatService")
local Players = game:GetService("Players")
-- 새로운 채팅 버블이 게임에 추가될 때 이벤트 처리기
TextChatService.OnBubbleAdded = function(message: TextChatMessage, adornee: Instance)
-- 채팅 메시지에 연결된 TextSource(발신자)가 있는지 확인합니다.
if message.TextSource then
-- 채팅 버블을 사용자 정의하기 위한 새로운 BubbleChatMessageProperties 인스턴스를 만듭니다.
local bubbleProperties = Instance.new("BubbleChatMessageProperties")
-- UserId를 기반으로 채팅 메시지를 보낸 사용자 가져오기
local player = Players:GetPlayerByUserId(message.TextSource.UserId)
if player:GetAttribute("IsVIP") then
-- 플레이어가 VIP인 경우 채팅 버블 속성을 사용자 정의합니다.
bubbleProperties.TextColor3 = Color3.fromHex("#F5CD30")
bubbleProperties.BackgroundColor3 = Color3.fromRGB(25, 27, 29)
bubbleProperties.FontFace = Font.fromEnum(Enum.Font.PermanentMarker)
end
return bubbleProperties
end
end
모든 고급 사용자 정의 옵션은 개별 버블 사용자 지정에도 사용 가능합니다. 전반적인 버블에 대한 고급 사용자 정의와 유사하게, BubbleChatMessageProperties의 자식으로 사용자 지정하고자 하는 인스턴스를 추가하십시오. 다음 예제는 채팅 메시지 발신자의 Humanoid.Health 속성을 확인하여 낮은 건강 상태의 사용자 채팅 버블에 특별한 그라디언트 효과와 기타 속성을 추가합니다:
낮은 건강 버블
local TextChatService = game:GetService("TextChatService")
local Players = game:GetService("Players")
-- 새로운 채팅 버블이 게임에 추가될 때 이벤트 처리기
TextChatService.OnBubbleAdded = function(message: TextChatMessage, adornee: Instance)
-- 채팅 메시지에 연결된 TextSource(발신자)가 있는지 확인합니다.
if message.TextSource then
-- 사용자 ID를 사용하여 채팅 메시지를 보낸 사용자 가져오기
local player = Players:GetPlayerByUserId(message.TextSource.UserId)
-- 사용자의 캐릭터에서 humanoid 찾기
local humanoid = player.Character:FindFirstChildWhichIsA("Humanoid")
if humanoid and humanoid.Health < 25 then
-- 채팅 버블을 사용자 정의하기 위한 새로운 BubbleChatMessageProperties 인스턴스를 만듭니다.
local bubbleProperties :BubbleChatMessageProperties = Instance.new("BubbleChatMessageProperties")
-- 낮은 건강 상태를 위한 채팅 버블 속성을 사용자 정의합니다.
bubbleProperties.BackgroundColor3 = Color3.fromRGB(245, 245, 245)
bubbleProperties.TextColor3 = Color3.fromRGB(234, 51, 96)
bubbleProperties.TextSize = 20
bubbleProperties.FontFace = Font.fromEnum(Enum.Font.DenkOne)
-- 그라디언트를 사용자 정의하기 위해 UIGradient를 자식으로 추가합니다.
local uiGradient : UIGradient = Instance.new("UIGradient")
uiGradient.Color = ColorSequence.new(Color3.fromRGB(110, 4, 0), Color3.fromRGB(0, 0, 0))
uiGradient.Rotation = 90
uiGradient.Parent = bubbleProperties
return bubbleProperties
end
end
end
수동으로 버블 표시
플레이어가 메시지를 보내지 않았을 때 채팅 버블을 표시하고 싶을 수도 있습니다. 이를 위해 NPC와 같이 수동으로 채팅 버블을 표시하려면 TextChatService:DisplayBubble() 메서드를 사용합니다.
이 버블의 사용자 정의는 플레이어가 TextChannels를 통해 메시지를 보낼 때 자동으로 표시되는 버블의 사용자 정의와 동일합니다. TextChatService.OnBubbleAdded 콜백을 사용하여 사용자 정의할 수 있습니다.
NPC 버블
비 플레이어 캐릭터(NPC)에 대해 채팅 버블을 표시하려면 TextChatService:DisplayBubble(character, message)를 호출하고 NPC 캐릭터 및 메시지를 매개변수로 사용합니다. 이 버블은 다른 채팅 버블과 마찬가지로 TextChatService.OnBubbleAdded 콜백을 사용하여 사용자 정의할 수 있습니다.
TextChatService:DisplayBubble()은 클라이언트 측 스크립트에서만 작동하므로 RunContext를 Enum.RunContext.Client로 설정한 Script를 사용하거나, StarterPlayerScripts와 같은 적절한 컨테이너 내에서 LocalScript를 사용해야 합니다. NPC에 ProximityPrompt를 부착한 경우, 채팅 버블을 표시하는 스크립트는 다음과 같을 수 있습니다:
local TextChatService = game:GetService("TextChatService")
local Workspace = game:GetService("Workspace")
local prompt = Workspace.SomeNPC.ProximityPrompt
local head = prompt.Parent:WaitForChild("Head")
prompt.Triggered:Connect(function()
TextChatService:DisplayBubble(head, "Hello world!")
end)