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): 필터링을하여 무작위 방식으로 세션에 참여합니다.

Back To Top

현재 세션 얻어오기

피어가 연결되어 있는 현재 룸을 찾으며 예를들어, 사용자 정의 속성을 찾거나 일부 추가 정보만 찾는 경우 유용한 루틴이 될 수 있습니다. 이 데이터는 BoltMatchmaking.CurrentSession을 통해 노출되며 세션에 연결한 이후에만 호출되어야 합니다. 이 정보를 얻는 예제가 다음에 나와있습니다:

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]);
            }
        }
    }
}

// ...

Back To Top

세션을 생성하고 갱신하기

룸 생성은 매치메이킹의 시작 지점입니다. 세션이 없으면 게임도 없습니다. Photon Bolt에서는 서버가 게임 실행을 관리하고 클라이언트 간에 데이터를 교환하며 세션을 게시하여 다른 플레이어가 참여할 수 있도록 하는 책임이 있는 서버-클라이언트 아키텍쳐 유형을 사용합니다. 세션을 생성하기 위해서는, 아래처럼 BoltMatchmaking.CreateSession만 호출하면 됩니다:

// ...
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만 호출하면 됩니다:

// ...
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");
    }
}
// ...

Back To Top

세션 참여하기

매치메이킹 주요 상대는 게임 클라이언트가 가입할 세션을 찾을 때 발생합니다. Photon Bolt는 다양한 방법을 제공합니다. 다음에서는 더 많은 플레이어로 게임을 빠르게 즐길 수 있도록 구현한 모든 방법론에 대해 설명합니다.

Back To Top

레퍼런스로써 UdpSession을 사용하여 참여

또 다른 게임 세션에 연결하는 가장 기본적인 방식입니다. Bolt.GlobalEventListener를 구현할 때, 참여할 수 있는 세션의 목록이 갱신될 때 마다 SessionListUpdated(Map<Guid, UdpSession> sessionList) 콜백 함수를 접하게 될 것 입니다.

이 방법에서는 세션에서 모든 종류의 필터링을 수행할 수 있으므로 클라이언트에 표시되는 방법을 완전히 자유롭게 관리할 수 있습니다. UdpSession 레퍼런스를 사용하는 것은, BoltMatchmaking.JoinSession을 호출하기만 하면되며, 선택적으로 연결하는 동안 사용되는 IProtocolToken을 전달할 수 있습니다.


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);
        }
    }

    // ...
}

Back To Top

세션 이름으로 참여=

또한 Photon Bolt는 클라이언트가 서버에서 세션을 만드는 데 사용된 식별자와 동일한 ID를 사용하여 룸에 참여할 수 있도록 지원합니다. 특정 상황에서는 세션 목록이 채워질 때까지 기다리지 않고 자신이 들어가고자 하는 게임을 찾고자 합니다. 예를 들어, 친구를 초대하는 시스템을 구현했거나 사용 중인 경우 이 방법으로 해결할 수 있습니다. 이러한 방식으로 세션에 연결하는 것은 특정 게임에 참여할 수 있는 가장 빠른 대안 중 하나입니다.

이것은 UdpSession을 받는대신 룸 식별자로 시작하는 것을 받는 BoltMatchmaking.JoinSession의 오버로드이며 또한 IProtocolToken을 받을 수 있습니다. 아래 예제를 확인해보세요:

// ...
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");
    }
}
// ...

Back To Top

무작위 세션 참여=

일부 캐주얼 게임에는 게임 플레이가 몇 가지 유형만이 있고 플레이어는 가능한 한 빨리 게임 플레이에 들어가기를 원합니다. 이와 같은 경우에는 랜덤 세션에 참여하는 것이 작업을 수행하는 데 흥미로운 방법이 될 수 있습니다. BoltMatchmaking.JoinRandomSession 을 사용합니다. Photon Bolt는 항상 가능한 모든 세션에 참여하여 가능한 한 빨리 룸을 채우려고 합니다. 나머지 Join 절차와 동일한 패턴에 따라 IProtocolToken을 전달할 수작업에 대한 토큰 개체입니다.

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() 콜백이 호출 되게 됩니다.

Back To Top

필터링을 통한 무작위 세션 참여

BoltMatchmaking.JoinRandomSession의 기능 확장은, UdpSessionFilter 클래스의 인스턴스 수신 능력의 메소드 오버로드를 포함하고 있습니다. 이 객체는 사용자가 채움 모드를 선택하는 것을 허용하며 무작위 참여 프로세스 제어에 사용됩니다. (여기를 참고하세요) 그리고 사용자 정의 파라미터를 사용하여 사용할 수 있는 룸을 필터링 할 수 있습니다.

이 메소드를 사용하여 참여할 때 필터링이 올바르게 동작하게 하기 위해서는 토큰으로 Bolt.Photon.PhotonRoomProperties을 사용하고, 사용자 정의 속성을 사용하여 세션을 생성해야 한다는 점을 명심하세요. 다음은 일부 파라미터 IProtocolToken 으로 클라이언트에서 서버로 데이터를 이동해주는 무작위 세션 참여의 간단한 예제입니다:

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");
    }
}

기술문서 TOP으로 돌아가기