Bolt 매치메이킹
Photon Bolt는 네트워크 게임 개발용 고수준 SDK이며, 이러한 유형의 주요 기능 중의 하나는 매치메이킹을 하는 능력으로 다른 말로 표현하자면 서로 같이 플레이할 수 있도록 온라인 세션에서 서로 다른 지역과 기기에서 플레이어들을 연결해주는 절차입니다.
Bolt는 다름 아닌 단순하면서도 강력한 API를 제공하여 룸 관리를 처리함으로써 개발자가 게임룸을 유지 관리할 수 있는 게임을 쉽게 작성할 수 있도록 도와줍니다.
매치메이킹을 위한 주요 API 엔트리 포인트는 Photon Bolt
의 능력으로 Bolt.Matchmaking.BoltMatchmaking
클래스를 통해서 사용할 수 있습니다.
Photon Cloud 서비스를 사용하여 볼트 세션의 관리, 게임룸 만들기 및 룸에 참여하는 기능을 담당합니다.
이 문서에서는, BoltMatchmaking
유틸리티 클래스로 시작하는 방법에 대해서 설명합니다.
또한 여기에서 API 레퍼런스를 확인하실 수 있습니다.
BoltMatchmaking API
BoltMatchmaking.CurrentSession
: 연결된 피어에 대한 현재 세션을 얻어옵니다.BoltMatchmaking.CreateSession(string sessionID, IProtocolToken token, string sceneToLoad)
: 현재 실행중인 플랫폼을 사용하여 세션을 생성합니다.BoltMatchmaking.UpdateSession(IProtocolToken token)
: 현재 세션 구성정보를 갱신합니다.BoltMatchmaking.JoinSession(UdpSession session, IProtocolToken token)
: 레퍼런스로써UdpSession
을 사용하여 참여합니다.BoltMatchmaking.JoinSession(string sessionID, IProtocolToken token)
: 이름으로 세션에 참여합니다.BoltMatchmaking.JoinRandomSession(IProtocolToken token)
: 무작위 방식으로 세션에 참여합니다.BoltMatchmaking.JoinRandomSession(UdpSessionFilter sessionFilter, IProtocolToken token)
: 필터링을하여 무작위 방식으로 세션에 참여합니다.
현재 세션 얻어오기
피어가 연결되어 있는 현재 룸을 찾으며 예를들어, 사용자 정의 속성을 찾거나 일부 추가 정보만 찾는 경우 유용한 루틴이 될 수 있습니다.
이 데이터는 BoltMatchmaking.CurrentSession
을 통해 노출되며 세션에 연결한 이후에만 호출되어야 합니다.
이 정보를 얻는 예제가 다음에 나와있습니다:
C#
using Bolt.Matchmaking;
// ...
void Update()
{
if (Input.GetKeyDown(KeyCode.I) && BoltNetwork.IsRunning)
{
var session = BoltMatchmaking.CurrentSession;
BoltLog.Warn(session.HostName);
var photonSession = session as PhotonSession;
if (photonSession != null)
{
BoltLog.Warn("IsOpen: {0}, IsVisible: {1}", photonSession.IsOpen, photonSession.IsVisible);
foreach(var key in photonSession.Properties.Keys)
{
BoltLog.Warn("{0} = {1}", key, photonSession.Properties[key]);
}
}
}
}
// ...
세션을 생성하고 갱신하기
룸 생성은 매치메이킹의 시작 지점입니다. 세션이 없으면 게임도 없습니다.
Photon Bolt에서는 서버가 게임 실행을 관리하고 클라이언트 간에 데이터를 교환하며 세션을 게시하여 다른 플레이어가 참여할 수 있도록 하는 책임이 있는 서버-클라이언트 아키텍쳐 유형을 사용합니다.
세션을 생성하기 위해서는, 아래처럼 BoltMatchmaking.CreateSession
만 호출하면 됩니다:
C#
// ...
void SetupSession(string map, int gameType)
{
if (BoltNetwork.IsServer)
{
string matchName = Guid.NewGuid().ToString();
// If you use Photon custom properties
var customToken = new Bolt.Photon.PhotonRoomProperties();
customToken["m"] = map;
customToken["t"] = gameType;
// Or if you use your own custom IProtocolToken
var customToken = new MyServerToken();
customToken.map = map;
customToken.gameType = gameType;
BoltMatchmaking.CreateSession(
sessionID: matchName,
sceneToLoad: map,
token: customToken
);
}
else
{
BoltLog.Warn("Only the server can create sessions");
}
}
// ...
게임이 플레이 중일 때, 서버는 세션에 관련된 메타데이터를 갱신할 수도 있습니다.
이 기능은 게임을 하는 클라이언트와 게임에 참여하려고 하는 다른 클라이언트에서 정보를 공개할 수 있으므로 현재 게임의 일반 설정을 공유하려는 경우에 유용합니다.
세션을 갱신하기 위해서는, BoltMatchmaking.UpdateSession
만 호출하면 됩니다:
C#
// ...
void UpdateSession(string map, int gameType)
{
if (BoltNetwork.IsRunning && BoltNetwork.IsServer)
{
// If you use Photon custom properties
var updateToken = new PhotonRoomProperties();
updateToken["m"] = map;
updateToken["t"] = gameType;
// Or if you use your own custom IProtocolToken
var updateToken = new MyServerToken();
updateToken.map = map;
updateToken.gameType = gameType;
BoltMatchmaking.UpdateSession(customToken);
}
else
{
BoltLog.Warn("Only the server can update sessions");
}
}
// ...
세션 참여하기
매치메이킹 주요 상대는 게임 클라이언트가 가입할 세션을 찾을 때 발생합니다.
Photon Bolt는 다양한 방법을 제공합니다. 다음에서는 더 많은 플레이어로 게임을 빠르게 즐길 수 있도록 구현한 모든 방법론에 대해 설명합니다.
레퍼런스로써 UdpSession
을 사용하여 참여
또 다른 게임 세션에 연결하는 가장 기본적인 방식입니다. Bolt.GlobalEventListener
를 구현할 때, 참여할 수 있는 세션의 목록이 갱신될 때 마다 SessionListUpdated(Map<Guid, UdpSession> sessionList)
콜백 함수를 접하게 될 것 입니다.
이 방법에서는 세션에서 모든 종류의 필터링을 수행할 수 있으므로 클라이언트에 표시되는 방법을 완전히 자유롭게 관리할 수 있습니다.
UdpSession
레퍼런스를 사용하는 것은, BoltMatchmaking.JoinSession
을 호출하기만 하면되며, 선택적으로 연결하는 동안 사용되는 IProtocolToken
을 전달할 수 있습니다.
C#
public class Menu : Bolt.GlobalEventListener
{
// ...
public override void SessionListUpdated(Map<Guid, UdpSession> sessionList)
{
Debug.LogFormat("Session list updated: {0} total sessions", sessionList.Count);
foreach (var session in sessionList)
{
UdpSession photonSession = session.Value as UdpSession;
// Optional IProtocolToken
var userToken = new UserToken();
userToken.user = "user";
userToken.password = "secret";
BoltMatchmaking.JoinSession(photonSession, userToken);
}
}
// ...
}
세션 이름으로 참여=
또한 Photon Bolt는 클라이언트가 서버에서 세션을 만드는 데 사용된 식별자와 동일한 ID를 사용하여 룸에 참여할 수 있도록 지원합니다.
특정 상황에서는 세션 목록이 채워질 때까지 기다리지 않고 자신이 들어가고자 하는 게임을 찾고자 합니다. 예를 들어, 친구를 초대하는 시스템을 구현했거나 사용 중인 경우 이 방법으로 해결할 수 있습니다.
이러한 방식으로 세션에 연결하는 것은 특정 게임에 참여할 수 있는 가장 빠른 대안 중 하나입니다.
이것은 UdpSession
을 받는대신 룸 식별자로 시작하는 것을 받는 BoltMatchmaking.JoinSession
의 오버로드이며 또한 IProtocolToken
을 받을 수 있습니다.
아래 예제를 확인해보세요:
C#
// ...
void JoinSession(string sessionID, string user, string password)
{
if (BoltNetwork.IsRunning && BoltNetwork.IsClient)
{
var userToken = new UserToken();
userToken.user = user;
userToken.password = password;
BoltMatchmaking.JoinSession(sessionID, userToken);
}
else
{
BoltLog.Warn("Only a started client can join sessions");
}
}
// ...
무작위 세션 참여=
일부 캐주얼 게임에는 게임 플레이가 몇 가지 유형만이 있고 플레이어는 가능한 한 빨리 게임 플레이에 들어가기를 원합니다.
이와 같은 경우에는 랜덤 세션에 참여하는 것이 작업을 수행하는 데 흥미로운 방법이 될 수 있습니다.
BoltMatchmaking.JoinRandomSession
을 사용합니다. Photon Bolt는 항상 가능한 모든 세션에 참여하여 가능한 한 빨리 룸을 채우려고 합니다.
나머지 Join
절차와 동일한 패턴에 따라 IProtocolToken
을 전달할 수작업에 대한 토큰 개체입니다.
C#
void JoinRandomSession(string user, string password)
{
if (BoltNetwork.IsRunning && BoltNetwork.IsClient)
{
var userToken = new UserToken();
userToken.user = user;
userToken.password = password;
BoltMatchmaking.JoinRandomSession(userToken);
}
else
{
BoltLog.Warn("Only a started client can join sessions");
}
}
가입할 수 있는 룸이 없는 경우, 룸 참여 시간 초과
값(Bolt 설정
에서 이 값을 구성할 수 있음) 이후 실패하며 Bolt.GlobalEventListener.SessionConnectFailed()
콜백이 호출 되게 됩니다.
필터링을 통한 무작위 세션 참여
BoltMatchmaking.JoinRandomSession
의 기능 확장은, UdpSessionFilter
클래스의 인스턴스 수신 능력의 메소드 오버로드를 포함하고 있습니다.
이 객체는 사용자가 채움 모드를 선택하는 것을 허용하며 무작위 참여 프로세스 제어에 사용됩니다. (여기를 참고하세요) 그리고 사용자 정의 파라미터를 사용하여 사용할 수 있는 룸을 필터링 할 수 있습니다.
이 메소드를 사용하여 참여할 때 필터링이 올바르게 동작하게 하기 위해서는 토큰으로 Bolt.Photon.PhotonRoomProperties
을 사용하고, 사용자 정의 속성을 사용하여 세션을 생성해야 한다는 점을 명심하세요.
다음은 일부 파라미터 IProtocolToken
으로 클라이언트에서 서버로 데이터를 이동해주는 무작위 세션 참여의 간단한 예제입니다:
C#
void JoinRandomSession(string user, string password, string map, int gameType)
{
if (BoltNetwork.IsRunning && BoltNetwork.IsClient)
{
var userToken = new UserToken();
userToken.user = user;
userToken.password = password;
UdpSessionFilter filter = new UdpSessionFilter();
filter.FillMode = UdpSessionFillMode.Random; // Fill, Random or Serial
filter["m"] = map;
filter["t"] = gameType;
BoltMatchmaking.JoinRandomSession(filter, userToken);
}
else
{
BoltLog.Warn("Only a started client can join sessions");
}
}
Back to top