자료실

[Photon엔진강좌] Photon Server Plugin — WebHooks (1)
작성자 | admin 2020-08-10  |    조회수 : 3616  
이곳에서 소개하는 WebHooks는 Photon Plugins를 통한 방식을 가리키며, 외부나 제3자와의 서버 플랫폼은 WebServices 유형의 서비스처럼 Http Post 방식을 이용해 연결 소통합니다. 주요 목적은 사용자의 재가입 허용 및 사용자/게임 데이터 기록 등과 같은 게임/룸 기능을 쉽게 확장하는 데 있습니다.

비록 우리가 Photon Server 4.x 버전인 플러그인으로 동일한 작업을 할 수 있으나, 이미 SDK에서 제공했던 방식이기 때문에 Photon Cloud에서조차도 자신의 계정 내 웹페이지에서 설정할 수 있습니다. 이렇게 우리는 관련 기능을 재구축할 필요도 없고, 심지어 자신의 서버에 플러그인 작성 없이도, 기록이나 연산의 확장 기능을 실행할 수 있습니다. 아주 편리하죠!

지금부터, 우선 WebHooks의 기본 설정과 프로세스에 대해 이해한 후, 게임에서 서버 측 가입 방법과 제3자 서비스 플랫폼과 연결해 미니형 게임 랭킹(LeaderBoard) 기능을 테스트해보겠습니다~

설정

Photon Webhooks 운영 과정은 이벤트 구동형으로, 클라이언트에서 GameCreate, GameEventsk, GameClose와 같은 이벤트를 발송하거나 WebRPC를 호출해, Photon Server에서 이러한 이벤트를 수신하고 나면, 이미 설정한 지정 사이트(URL)로 HTTP POST 조건을 전송합니다. Photon Server에서 제3자 서버의 반환값을 수신한 후, 다시 클라이언트로 전송해 관련 콜백 등 후속 처리를 용이하게 합니다.

Photon Server SDK 아래 경로에서 설정을 찾을 수 있습니다.
{PhotonServerSDK_Path}/deploy/Loadbalancing/GameServer/bin/Photon.LoadBalancing.dll.config

< PluginSettings Enabled="true">
< Plugins>
< Plugin
< ! -- 이하, 플러그인에 필요한 정의 -- >
Name="WebHooksPlugin1.2"
Version=""
AssemblyName="PhotonHive.WebhooksPlugin1.2.dll"
Type="Photon.Hive.Plugin.WebHooks.PluginFactory"
< ! -- 이하, Webhooks 대상의 정의 -- >
...
/>
< / Plugin>
< / PluginSettings>

Webhooks는 사실상 Photon Plugin이기 때문에, XML 설정 파일에서 우리가 주목해야 할 곳은 앞에서 살펴본 계열 문서 소개에서처럼 최소한 Name, AssemblyName, Type 같은 매개 변수값이 필요합니다.

플러그인 노드 내 기타 다른 설정은 webhook마다 모두 해당 촉발자, 데이터 및 목표 경로로 구분해 정의했기 때문에 사용할 수 있는 매개 변수에는 하단의 기본 설정과 경로 설정이 필요합니다. Photon Server만이 우리가 관련된 일을 정확하게 연결할 수 있도록 도와줄 것 입니다.

기본 설정

•BaseUrl(필수): 연결하고자 하는 서비스 사이트(URL) 및WebRPC 호출 시 사용하는 Method를 입력합니다. 관련된 클라이언트 쪽 프로그램 콜백(Callbacks)은 아래 경로설명에서 관련 설정을 입력하게 됩니다.
•CustomHttpHeaders(선택 기입): 이곳에서 JSON 객체 정의 가능, 내부에는 주로 Key:Value 페이링값이 입력되며, Photon Server에서 내보내는 HTTP headers는 자체 정의한 JSON 객체를 함께 패킷화해 외부 서비스로 전송하게 됩니다.

경로 설정

아래 경로값마다 각각 관련된 제3자 사이트 URI를 입력합니다.
만약에 입력할 값이 없다면 관련 이벤트는 전달되지 않고, 반환값도 존재하지 않아, 클라이언트에 이미 설정된 WebRPC가 있다 해도 콜백(Callbacks) 호출을 수신하지 않습니다.

•PathCreate
룸을 새로 만들거나 룸 상태를 업데이트할 때 호출하게 되는 서비스입니다.

•PathClose
룸이 Photon Server에서 삭제될 때 호출됩니다.

•PathJoin
플레이어가 Photon Server 내 룸에 들어올 때 호출됩니다.

•PathLeave
플레이어가 룸에서 벗어날 때 호출됩니다.

•PathEvent
클라이언트가 룸에서 이벤트를 발송할 때 호출됩니다.

•PathGameProperties
클라이언트에서 룸/플레이어 매개 변수 설정 시 호출됩니다.

여기까지 보고 나니 눈이 침침해졌나요? 하하하, 괜찮습니다. 잠시 휴식시간을 가진 후, 이어서 실제 예시를 살펴볼 텐데, 비교적 쉽게 이해할 수 있을 겁니다!

Photon Server 설정

위에서 한 설명대로, Photon.LoadBalancing.dll.config에 설정한 예시:

< PluginSettings Enabled="true">
< Plugins>
< Plugin
Name="WebHooksPlugin1.2"
Version=""
AssemblyName="PhotonHive.WebhooksPlugin1.2.dll"
Type="Photon.Hive.Plugin.WebHooks.PluginFactory"

BaseUrl="http://photontaiwan.webscript.io"
IsPersistent="true"
HasErrorInfo="true"

PathClose="GameClose"
PathCreate="GameCreate"
PathEvent="GameEvent"
PathGameProperties=""
PathJoin=""
PathLeave=""
PathLoad="GameCreate"
/>
< / Plugins>
< / PluginSettings>

< WebRpcSettings Enabled="true">
< BaseUrl Value="http://photontaiwan.webscript.io" />
< /WebRpcSettings>

WebScript.io

우리는 Photon Cloud WebHooks에 대한 이해를 단순화하기 위해 이번에 사용하는 제3자 네트워크 서비스를 WebScript.io라 부르고, 이것은 Lua를 이용해 만든 프로그램 스크립트입니다. 우리가 해당 웹페이지에서 자체 지정한 서브 도메인 URL에 맞추어바로 호출할 수 있는 간이 WebService입니다. 스스로 서버를 조립하지 않아도 되고, 프로그램을 설치할 필요도 없어 미니 프로그램 테스트에 매우 편리합니다!

webscript — scripting on the web
Just choose a URL and type in a script. No servers, no deployment, no hassle.www.webscript.io

해당 온라인 상에서 URL을 선택하기만 하면 바로 Lua 프로그램으로 구성된 우리의 서비스를 이용할 수 있고, 구성 후 바로 실행해 테스트해볼 수 있습니다!

Webscript.io에 PhotonTaiwan의 subdomain을 자체 정의하고, 네 개의 서브사이트-GameCreate, GameEvent, GameClose, webhook 추가합니다. 그 후에, WebRPC에서 호출한 method도 원하는 명칭으로 스스로 정의할 수 있습니다.

서브사이트의 주소는 다음과 같습니다.
http://photontaiwan.webscript.io/GameCreate
http://photontaiwan.webscript.io/GameEvent
http://photontaiwan.webscript.io/GameClose
http://photontaiwan.webscript.io/webhook

webscript.io 내의 Lua Script 는 다음과 같습니다:

unction insertscore(leaderboard, player, score)

-- find index

local index = #leaderboard+1

for i,v in ipairs(leaderboard) do

if v.score <= score then

index = i

break

end

end

-- insert new score

table.insert(leaderboard, index, {player=player,score=score})

-- truncate list

while #leaderboard > 10 do table.remove(leaderboard) end

end

-- ensure that only one process modifies the data at a time

lease.acquire('PhotonGameData')

local jsonRequest = json.parse(request.body)

local _name = jsonRequest.name

local _score = jsonRequest.score

local scores = json.parse(storage.PhotonGameData or '[] ' )

insertscore( scores, _name, tonumber( _score));

storage.PhotonGameData = json.stringify( scores)

lease.release('PhotonGameData')

-- return scores

return {

ResultCode = 0,

Message = "",

Data = {

leaderboard = storage.PhotonGameData,

CustomMSG = "OK"

}}

해당 Lua Script 프로그램 출처는 주로 Photon Server에서 전송해온 매개 변수(사용자 이름, 점수 등)로, 해당 값을 랭킹에 입력해 넣은 후, 다시 JSON 객체 형식으로 랭킹의 모든값을 백패스합니다. InsertScore는 주로 사용자의 점수를 우리 랭킹에 삽입합니다.

지금까지의 부분은 Photon Server 및 Http 서버 간의 모든 설정에 속합니다. 계속해서 클라이언트 내 구현 부분의 연결 작동 방법에 대해 알아보겠습니다!

자리를 지켜주세요, 다음 파트 내용이 곧 시작됩니다!

★더 많은 글은Photon HelpCenter
https://support.photonengine.jp/hc/ko/categories/204651467 에서 확인하세요!
★Photon 공식 홈페이지
https://www.photonengine.com/ko-kr/Photon