Realtime 소개

시작하기

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

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

접속

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

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

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

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

서비스 호출

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

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

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

매치메이킹

게임 생성

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

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

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

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

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

게임 찾기

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

룸 찾기.

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

게임플레이

이벤트 전송

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

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

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

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

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

이벤트 수신

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

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

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

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

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

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

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

지원 받기

우리 Photon 팀(때로 포토니안이라고도 합니다 :)은 귀하를 도와드리려고 존재 합니다. 질문사항, 의문사항, ... 또는 잘 동작하지 않는 앱을 동작시키고 싶으신 경우 아래 형태를 선택하여 연락 주세요.

더 빠른 지원 받기

재현 단계를 포함하여 아래사항을 같이 주시면 빠른 지원을 받으 실 수 있습니다:

  • Photon 클라이언트 SDK 버전
    • SDK 압축 파일명의 부분입니다.
    • PUN의 경우는 PhotonNetwork.versionPun 값을 전달하여 주세요.
  • Photon Cloud
    • AppId Connect*() 호출할 때 설정되고 있는 게임 버전을 적어 주세요.
    • 룸에서 어려움을 겪고 있다면 RoomName과 룸의 서버 주소를 보내주세요. C# 에서 룸에 있을 동안 client.CurrentServerAddress를 로그에 기록해 주세요.
    • 지역서버 주소를 알려주세요.
  • Photon Server
    • 서버를 호스팅하시나요? 서버 SDK 버전을 알려주세요. 다시 말씀드리지만 SDK 압축 파일명에 있습니다.
    • log 를 추가해주세요.

연락 하기

문서에 추가적인 데모, 더 상세한 문서, FAQ 또는 예제 어플리케이션등 추가 및 보완해야 하는 사항이 있으면 알려주세요. 귀하의 의견은 developer@photonengine.kr 로 제안하여 주시면 감사하겠습니다.

Photon 에 대해서 더 많이 학습을 원하시나요?

시작하려면 무료 플랜을 시도 해 보세요

우리가 어떤 이벤트 행사에 참가하는지 알아보세요

미팅 요청을 하세요.

 To Document Top