Realtime 소개

Photon Realtime은 멀티플레이어 게임과 더 높은 수준의 네트워크 솔루션을 위한 당사의 기본 레이어입니다. 확장 가능한 접근 방식으로 매치메이킹과 빠른 커뮤니케이션과 같은 문제를 해결합니다. 게임 및 보다 구체적인 멀티플레이어 솔루션에 사용됩니다.

유니티 엔진으로 개발하는 경우 게임 상태와 시뮬레이션을 올바르게 동기화하는 데 도움이 되는 Fusion 또는 Quantum을 사용하는 것이 좋습니다.

Photon Realtime이라는 용어는 API, 소프트웨어 도구 및 서비스의 포괄적인 프레임워크를 래핑하고 클라이언트와 서버가 서로 상호 작용하는 방식을 정의합니다.

이 페이지는 주로 클라이언트 측 Realtime API를 위한 매뉴얼이지만 관련 구조에 대한 개요도 제공합니다.

클라이언트 및 서버

Photon Realtime API는 게임과 앱에서 직접 사용할 클라이언트 측 소프트웨어입니다. 예를 들어 Connect, JoinRandomRoomRaiseEvent등입니다.

대부분의 인기 있는 플랫폼과 엔진(SDK 다운로드 페이지)에서 다양한 언어로 제공되며 iOS, Android, 웹, 콘솔 또는 독립 실행형 클라이언트와 상관없이 거의 모든 클라이언트가 상호 작용할 수 있습니다.


모든 Photon Realtime 클라이언트는 다음과 같은 세 가지 작업으로 분할된 일련의 전용 서버에 연결합니다: 인증 및 지역 배포(네임 서버), 매치메이킹(마스터 서버) 및 게임 플레이(게임 서버)입니다. 이 서버들은 Realtime API에 의해 처리되기 때문에 개발자는 이 서버들에 대해 걱정할 필요가 없지만 배경지식이 있는 것이 좋습니다.

Photon Cloud는 완전 관리형 서비스로 Photon Realtime 클라이언트에 대한 전 세계 호스팅을 제공합니다. 무료 Photon 계정은 아무런 제약 없이 접근할 수 있으며 Photon Realtime에 익숙해지는 동안 Photon Cloud를 사용하는 것을 추천합니다. 물론 나중에 Photon 서버를 직접 실행하고 싶다면 다음 단계로 넘어갈 수 있습니다

코드 샘플

다음은 Realtime API가 어떻게 사용되고 있는지에 대한 몇 가지 코드 샘플입니다. 이 가이드는 전체적인 작업 가이드가 아니라 개요입니다.

Photon Cloud를 사용하여 서버 설정을 건너뜁니다. 코드에 AppId를 설정해야 합니다.

무료 가입 후에 Realtime 관리 화면에서 AppId를 받습니다.

시작하기

Photon Realtime은 세계 전역으로 서비스하고 있는Photon on-premises servers의 완전한 매니지드 서비스(SaaS)로 전 세계에서 언제든지 낮은 지연(Low Latency)의 멀티 플레이어 게임을 즐길 수 있도록 해 주는 서비스입니다.

LoadBalancing API를 사용하여 공유된 게임 세션(룸이라고 부름)에서 플레이어의 매칭과, 접속한 플레이어들에게 메시지를 동기적하고 실시간으로 전송을 합니다. 클라이언트가 iOS, Android, 웹, 콘솔 또는 Standalone 여부와 관계없이 클라이언트 SDK를 이용하여 서로 통신을 할 수 있습니다.

접속

Photon Realtime은 접속할 때 구분되는 애플리케이션과 AppId가 필요합니다. AppId는 무료 가입Realtime 관리 화면에서 얻을 수 있습니다.

AppId가 있으면 LoadBalancingClient 인스턴스를 생성할 수 있으며 ConnectToRegionMaster 메소드를 호출할 수 있습니다.

C#


    using ExitGames.Client.Photon.LoadBalancing;
    
    public class MyClient
    {
        private LoadBalancingClient client;

        // this is called when the client loaded and is ready to start
        void Start()
        {
            client = new LoadBalancingClient();
            client.AppId = "<your appid>";  // edit this!

            // "eu" is the European region's token
            bool connectInProcess = client.ConnectToRegionMaster("eu");  // can return false for errors
        }

        void Update()
        {
            client.Service();
        }

        void OnApplicationQuit()
        {
            client.Disconnect();
        }
        // [...]

간단하게 AppId를 설정하고 ConnectToRegionMaster 메소드를 이용하여 연결할 지역을 설정하면 됩니다. 사용할 수 있는 지역 목록은 여기를 클릭하여 확인해 보세요.

LoadBalancingClient 클래스를 확장(상속) 하여 콜백 메소드를 수정하고 서버에서 전달되는 변경 사항을 처리하는 것이 좋습니다. 이 방식은 데모에 나와 있습니다.

서비스 호출

LoadBalancing API는 게임 로직과 잘 통합될 수 있도록 작성된 API입니다. 수신된 메시지를 언제 처리하고 얼마나 자주 전송할 것 인지를 제어할 수 있습니다. 내부적으로 수신과 전송메세지는 LoadBalancingClient.Service() 메소드를 호출 하기 전까지는 버퍼에 있게 됩니다.

Service() 메소드 내부적으로 DispatchIncomingCommands() 에서 false를 리턴 할 때까지 DispatchIncomingCommands()를 계속 호출하여 모든 수신 메시지를 게임 로직으로 전달합니다.
Service() 메소드를 호출하면 OnEvent, OnOperationResponse 등의 콜백이 트리거 됩니다. Service()는 또한 실제로 클라이언트에게 명령을 전송하는 SendOutgoingCommands 를 호출합니다.

게임에서는 변경된 사항을 계산 후 화면을 갱신하는 게임 루프를 자주 사용합니다. Service() 는 초당 10회에서 20회 정도를 호출합니다. Service()를 호출하지 않으면 "네트워크 진행"이 전혀 이루어지지 않습니다.

매치메이킹

게임 생성

새로운 룸, 게임으로도 알려짐 생성은 연결된LoadBalancingClientOpCreateRoom 을 호출합니다.

C#

    void MyCreateRoom(string roomName, byte maxPlayers)
    {
        client.OpCreateRoom(roomName, new RoomOptions() { MaxPlayers = maxPlayers }, TypedLobby.Default);
    }

위 코드는 룸 이름과 룸에 참가할 수 있는 플레이어 수(4)를 설정하고 있습니다. 클라이언트는 새로운 룸에 자동으로 입장하며 룸은 마지막 플레이어가 나가기 전까지 존재 합니다.

룸을 생성할 때 룸 값을 공유하기 위하여 RoomOptions.customRoomProperties 를 정의할 수 있습니다. 커스텀 룸 속성은 지도 이름, 레벨 또는 라운드 시간 등과 같은 값을 저장할 수 있습니다. 커스텀 프로퍼티에 대한 키는 반드시 문자열 이어야 합니다.
물론 커스텀 속성 값은 룸 안에서도 설정하고 변경할 수 있습니다.

RoomOptions.customRoomPropertiesForLobby에 커스텀 프로퍼티들의 이름 배열을 설정하여 로비에서 커스텀 프로퍼티들의 표시 여부를 결정할 수 있습니다.
로비에서 볼 수 있는 프로퍼티들은 매치메이킹과 랜덤 매치에서 필터로 사용될 수 있습니다.

TypedLobby.Default는 새로운 룸이 기본 로비에 나타나는 것을 정의합니다. TypedLobby.Default는 룸을 나열하며 다른 형태의 매치메이킹으로 사용될 수 있습니다.

게임 찾기

클라이언트는 게임 이름을 통해 참여하거나 Photon에게 나에게 맞는 게임을 찾아 달라고 요청하여 참여합니다.

룸 찾기.

  • 무작위: 무작위로 플레이어를 매칭합니다. 마음대로 플레이어들을 룸에 입장시키거나 동등하게 분배 후 입장하게 합니다.
  • 필터: 좀 더 나에게 맞도록 매칭 시키기 위하여 무작위 매칭에 필터를 사용합니다.
  • 리스팅: 플레이어는 로비에 나열된 룸 중에서 하나를 선택 후 입장합니다.
  • 파라미터화: 예측되는 속성 정의를 통한 커스터마이징된 무작위 매칭

C#

    // join random rooms easily, filtering for specific room properties, if needed
    Hashtable expectedCustomRoomProperties = new Hashtable();
    expectedCustomRoomProperties["map"] = 1; // custom props can have any name but the key must be string
    client.OpJoinRandomRoom(expectedCustomRoomProperties, (byte)expectedMaxPlayers);

게임 플레이

이벤트 전송

클라이언트의 변경 사항은 같은 룸 안에 있는 모든 플레이어들이 최신 정보로 갱신할 수 있도록 이벤트로 전송될 수 있습니다.

상태, 위치 또는 현재의 턴 정보를 갱신하세요.
Photon 은 최대한 빨리 정보를 전송해 줄 것입니다(선택적 신뢰도).

  • 메시지/이벤트 전송: 모든 형태의 데이터를 플레이어들에게 전송합니다.
  • 플레이어/룸 속성: Photon 은 나중에 참가한 플레이어까지 플레이어/룸 속성들을 갱신하고 동기화해줍니다.

C#

    byte eventCode = 1; // make up event codes at will
    Hashtable evData = new Hashtable();    // put your data into a key-value hashtable
    bool sendReliable = false; // send something reliable if it has to arrive everywhere
    client.OpRaiseEvent(eventCode, evData, sendReliable, RaiseEventOptions.Default)

이벤트 코드는 1부터 시작하고 200 보다 작아야 합니다. 각 코드는 이벤트의 유형과 동반되는 내용을 정의해야 합니다.

위 예제의 evData는 Hashtable입니다. byte[] 또는 Photon에서 Serialization이 되는(string, float[] 등) 모든 유형의 데이터 타입이 될 수 있습니다.
상세정보는 Photon의 직렬화를 참고하세요.

이벤트 수신

이벤트가 처리될 때마다 OnEvent 핸들러가 호출됩니다.

C#

    IPhotonPeerListener.OnEvent(EventData event);

각 이벤트는 클라이언트가 전송한 이벤트의 EventData.CodeEventData.Parameters 를 가지고 있습니다.
애플리케이션은 Code와 같이 전달되는 EventData(상기 참조)로 어떤 내용인지를 파악합니다.

최신 기본 이벤트 코드 리스트는 SDK 내의 EventCode를 참고하시기 바랍니다.
예. C#에서는 ExitGames.Client.Photon.LoadBalancing.EventCode 를 참조하세요.

커스텀 또는 권한 보유 서버 로직

권한 보유 로직(Authoritative logic, 모든 상태를 기억하는) 없이도 Photon Cloud 제품은 다양한 장르의 게임에 적용할 수 있습니다.

  • 1인칭 슈팅 게임
  • 레이싱 게임
  • 마인크래프트와 같은 유형의 게임
  • 캐주얼 실시간 게임
  • 비동기 및 동기 방식 게임
  • ...

자신만의 커스텀 로직을 구현하시려면 Photon Server 또는 Photon Pluginsㄴ를 이용하세요.

Back to top