대부분의 경우, 게임 내 코드가 영향을 미칠 수 있는 서버나 클라이언트는 해당 코드가 실행되는 서버나 클라이언트에 한정되지만, 서로 다른 서버 간에 통신이 필요한 상황이 있을 수 있습니다. 예를 들면:
- 전역 공지 — "사용자가 특별한 아이템을 찾았습니다!"와 같은 공지를 게임의 모든 서버에 전송합니다.
- 실시간 서버 브라우저 — 게임의 모든 서버 목록과 각 서버에 있는 사용자(매 분마다 업데이트됨)를 컴파일하여 최대 20개의 서버에 표시합니다.
MessagingService를 사용하여 게임에서 크로스 서버 메시징을 지원할 수 있습니다. 또한, 텔레포테이션 놀이터 샘플 게임을 사용하여 크로스 서버 메시징이 어떻게 작동하는지 확인한 후 이를 구현할 수 있습니다. 마지막으로, 외부 도구를 사용한 크로스 서버 통신을 탐색하려면 여기를 참고하세요.
크로스 서버 메시징 설정
크로스 서버 메시징을 활성화하려면 여러 서버에서 접근할 수 있는 맞춤형 메시지 채널인 주제를 설정해야 합니다. 주제를 생성한 후, 사용자 구독을 통해 해당 주제의 메시지를 수신하도록 사용자에게 구독할 수 있으며, 메시지 게시를 해당 주제로 활성화할 수 있습니다.
사용자 구독하여 메시지 받기
MessagingService:SubscribeAsync()를 사용하여 사용자를 주제에 구독하고, 해당 주제로 메시지가 게시되었을 때 감지하는 콜백 함수를 지정합니다. 예를 들어, 아래의 코드 샘플은 모든 사용자를 FriendServerEvent 주제에 구독시키고, 사용자가 다른 서버로 텔레포트될 때 메시지를 받습니다.
local MessagingService = game:GetService("MessagingService")
local Players = game:GetService("Players")
local MESSAGING_TOPIC = "FriendServerEvent"
Players.PlayerAdded:Connect(function(player)
-- 주제에 구독
local subscribeSuccess, subscribeConnection = pcall(function()
return MessagingService:SubscribeAsync(MESSAGING_TOPIC, function(message)
print(message.Data)
end)
end)
if subscribeSuccess then
-- 플레이어의 조상 변경 시 주제에서 구독 해제
player.AncestryChanged:Connect(function()
subscribeConnection:Disconnect()
end)
end
end)
메시지 게시
MessagingService:PublishAsync()를 사용하여 특정 주제에 맞춰 메시지를 게시합니다. 예를 들어, 아래의 코드 샘플은 사용자가 새 서버에 가입할 때 모든 사용자에게 알리기 위해 MessagingService:PublishAsync()를 사용하고, Player.Name으로 사용자의 표시 이름과 JobId로 실행 중인 게임 서버 인스턴스의 고유 식별자를 포함합니다.
local MessagingService = game:GetService("MessagingService")
local Players = game:GetService("Players")
local MESSAGING_TOPIC = "FriendServerEvent"
Players.PlayerAdded:Connect(function(player)
-- 주제에 메시지 게시
local publishSuccess, publishResult = pcall(function()
local message = player.Name .. "가 'JobId'가 " .. game.JobId .. "인 서버에 가입했습니다."
MessagingService:PublishAsync(MESSAGING_TOPIC, message)
end)
if not publishSuccess then
print(publishResult)
end
end)