자료실

Photon 클라우드 - 턴기반 & 비동기적 게임
작성자 | admin 2021-03-01  |    조회수 : 1775  


턴기반 & 비동기적 게임



Photon Realtime 으로 다른 게임들 처럼 비동기적인 게임도 개발 할 수 있습니다. 가장 큰 차이점은 현재 게임을 로드 한 후 다음에도 계속 게임을 할 수 있다는 것입니다.

Photon 에는 몇 분 이내가 아닌 몇 일 또는 몇 주 후에 게임을 진행 할 수 있는 특별한 기능들이 있습니다.

룸의 상태를 자동적으로 보관하기 위해서는 외부 웹서비스가 필요합니다. 플레이어가 언제든 원하는 시점에 게임을 계속 할 수 있으며 비동기적으로도 참여 할 수 있습니다.


시스템 개요


Photon Realtime 에서 어플리케이션은 외부 웹 서비스와 연결 될 수 있습니다. 외부 웹서비스는 webscript.io 또는 원하는 웹 서비스를 연결 할 수 있습니다. 이 서비스는 Photon Server 가 특별한 작업을 위해서 사용되며 감싸져 있으므로 클라이언트는 웹 서비스와 직접적으로 통신 할 필요가 전혀 없습니다.


웹 서비스


데이터의 저장, 로딩, 리스팅은 웹 서비스의 일반적인 기능이기 때문에 Photon 이 데이터 보관을 위하여 웹 서비스를 사용한다는 것은 일리가 있습니다.

웹 서비스가 관리화면의 "Webhooks" 탭에서 설정 되었으며 두 가지 방식으로 사용 할 수 있습니다: "Web hooks"의 이벤트 기반 및 "WebRPC" 와 "Event Forwarding" 의 클라이언트 액션 기반.


Webhooks


Photon Webhooks 는 게임 데이터 저장과 로드를 위한 웹 서비스 인터페이스로 작동 합니다. 필요에 따라 개별 작업들은 Photon 이 자동으로 호출 하기 때문에 클라이언트는 신경을 쓰지 않아도 됩니다.

예제: 룸 상태 저장은 룸에 있는 모든 플레이어의 접속이 해제 되었을 때 처리 됩니다. Photon 은 "\GameClose" 을 호출 하고 상태를 POST 데이터로 전달 합니다.

호스트에서 이벤트를 받기 위해서는 hooks의 경로를 요구한 대로 설정 해야 합니다. 어플리케이션 관리화면의 details 링크에서 Webhooks 를 선택하여 설정을 셋업 합니다.

"Photon Webhooks"에서 상세한 내용을 읽어 보세요


WebRPC


WebRPC는 webhook의 사상과 일반적 이용을 위하여 오픈 되어 있습니다. 내가 오퍼레이션(기본적으로 RCPs)을 구성 할 수 있고 웹 서비스에서 호출 할 수 있습니다. 파라미터들을 전달하고 웹 서비스 스크립트를 구현하는 것은 당신에게 달려 있습니다.

예제: 메모리 데모에서 사용자가 이전에 플레이(저장) 했던 룸 목록을 얻기 위해서는 WebRPC를 사용합니다. 스크립트는 사용자 ID 를 이용하여 데이터베이스에 있는 룸의 목록을 패치 합니다. 자신만의 WebRPC를 구축하기 위해서는 웹 서비스의 스크립트를 구현 해야 합니다. 스크립트의 경로(관리화면에서 설정된 기본-URL 을 뺀것)는 클라이언트내에서 사용되는 WebRPC의 이름을 정의 합니다. 양쪽 방향 에서 전달 되는 파라미터들은 모두 JSON-형태로 전달 되어야 합니다.

"Photon WebRPCs" 에서 상세한 내용을 읽어 보세요.


"비동기" 룸 생성하기


어플리케이션이 관리화면에서 "IsPersistent" 로 설정되어 있으면 다른 룸의 생성과 같은 방식인 "create room"오퍼레이션을 통해 룸이 생성됩니다. 몇가지 설정해야할 옵션들이 있습니다.

"비동기"룸은 모든 플레이어가 접속해제 되었을 때 타임아웃 이후 자동적으로 저장됩니다. 타임아웃은 "room time to live"(room TTL)로 부릅니다. 룸을 생성할 때 클라이언트가 설정 할 수 있습니다.( OpCreateRoom을 보세요) 지금까지 경험으로 볼 때 가장 좋은 값은 12초 입니다.

룸의 저장과 로드에 대하여 상세하게 학습하고 싶으시면 "Room Persistence Guide" 을 참고 하시기 바랍니다.


룸을 떠나고 포기하기


"비동기" 게임에서는 클라이언트가 접속해제되거나 게임을 나가면 플레이어들을 비활성(inactive) 이라고 플래그를 설정 합니다. 비활성으로 표기된 플레이어들은 나중에 다시 복귀 할 수 있습니다. 필요에따라 플레이어들은 게임을 명시적으로 "abandon" 할 수 있습니다. 이렇게 하려면 이에 맞게 파라미터 값을 설정하여 leave operation을 사용하시기 바랍니다.

Photon 은 룸의 모든 활성 플레이어와 비활성 플레이어들을 나열 하지만 게임을 포기한 플레이어는 이 게임 목록에서는 보이지 않습니다. 또한 기본적으로 게임을 포기한 플레이어의 모든 이벤트와 속성들은 사라지게 될 것 입니다.


룸 로딩


룸에서 계속 플레이 하고 싶다면 룸의 이름을 알아야 합니다. 클라이언트에서는 OpJoinRoom(name, -1)을 사용하세요.

클라이언트 관점에서는 룸이 Photon 의 메모리에 여전히 있는지 로드 되었는지의 여부와는 차이가 없습니다. 룸을 찾지 못하거나 액터가 만료된 경우에 이 오퍼레이션은 실패하게 됩니다. .

룸의 저장과 로드에 대한 상세 내용은 "Room Persistence Guide" 를 참고 하세요.


저장된 룸 목록 얻기


데모와 서버 스크립트 샘플은 사용자 ID에 대한 룸의 온라인 리스트를 관리하고 있습니다. 이 사상은 사용자가 로그인 할 때 "커스텀 인증"을 이용하여 사용자의 룸 목록을 가져 옵니다.

GetGameList WebRPC에 대해서 더 읽어 보세요.


게임 상태 보관


플레이어가 룸에 재참여 할 때 플레이어들의 프로퍼티들과(활성 및 비활성) 모든 버퍼화된 이벤트를 받게 됩니다. 이 데이터를 통해서 상태를 재현할 수 있고 플레이를 계속 할 수 있습니다.


프로퍼티


룸과 플레이어의 프로퍼티들을 설정 할 수 있습니다. 프로퍼티들은 상태를 저장할 때 가장 좋긴 하지만 변경 내역은 저장 하지 않습니다. 게임보드의 상태를 쉽게 저장할 수 있고 프로퍼티로써 턴 수를 저장 할 수 있습니다. 플레이어는 룸의 프로퍼티를 설정 할 수 있기 때문에 비동기적으로 턴을 받는 것은 문제가 되지 않습니다. 플레이어 프로퍼티들은 플레이어가 게임을 포기(또는 타임아웃) 했을 때 제거 됩니다.


이벤트 캐시


모든 룸은 필요에 따라 이벤트를 저장하는 캐시를 가지고 있습니다. 이벤트 캐싱은 발생된 순서대로 저장하며 이전의 액션 또는 데이터에 대한 중요한 정보를 저장할 때 필요 합니다.

기본적으로 이벤트들은 캐시되도록 되어 있지 않지만 OpRaiseEvent 는 이벤트 캐싱에 대하여 제어할 수 있는 파라미터를 가지고 있습니다. 이벤트를 평소와 같이 전송하지만 저장하기 위해서는 EventCaching.AddToRoomCache 를 사용 합니다.

또한 이벤트 캐시를 제거 하려면 EventCaching.RemoveFromRoomCache 옵션을 사용 합니다. 이 경우에 ,eventCode, 필터로서 "sender actorNumber" 와 "content" 해시테이블이 사용 됩니다. 특정 액터에 대한 이벤트, 동일 이벤트 코드에 대한 모든 이벤트 또는 특정 내용의 이벤트를 제거 할 수 도 있습니다.

의도적으로 "tag" 를 전송하여 특정한 내용의 이벤트를 삭제 하는 것은 굉장히 막강한 기능 입니다. "MemoryDemo" 에서는 각 이벤트마다 "turn" 을 전송하고 있는데 이것은 이전 턴에 대한 이벤트를 삭제하는데 사용되며 이벤트의 짧은 기록을 유지합니다.(이렇게 하면 장시간 동안 게임을 로드할 수 있도록 유지 되는 것입니다)

"캐시된 이벤트"를 더 읽어 보세요.


이벤트 포워딩


이벤트를 캐싱하는 것과 더불어 별도로 웹서비스로 이벤트를 포워드 할 수 있습니다. OpRaiseEvent(클라이언트에서 정의)는 WebFlags 를 이용하여 웹서버로 GaemEvent webhook 가 포워드 됩니다.

포워드된 이벤트들은 게임으로 다시 되돌아오는 채널은 없지만 게임내 액션과 결과를 추적하는데 유용하게 사용 될 수 있습니다. 이것은 경기의 결과를 계산하는데 사용되거나 사용자 ELO 를 조정하는데 사용 될 수 있습니다.

"MemoryDemo" 에서는 이벤트 포워딩은 사용하지 않습니다.

출처 : Exit Games Photon 사이트