Photon Webhooks & IPv6対応の最新情報

Preview:

Citation preview

安心してください!対応してますよ!〜 Webhooks & IPv6 対応の最新情報Photon 運営事務局シニアテクニカルアドバイザー並木 健太郎

はじめに• お伝えしたいことが多くてスライドの量が非常に多いです…• スライド進行はやや早めになるかと思いますが、ご了承ください

アジェンダ• マルチプレイに必要な機能とは• Photon でできること• Web サービスとのつなぎ方 (Webhooks)• Photon Server V3 vs. V4• IPv6 対応• 事例ご紹介

マルチプレイに必要な機能とは

マルチプレイの要件• 複数のプレイヤーがリアルタイムで同じゲーム内で楽しめること– 対戦だったり、協力だったり

• 複数のプレイヤー間 (= アプリ間 ) で通信を行って、リアルタイムでデータのやり取りを行う必要がある

やり取りが必要な情報• 例えば– 衝突判定の結果– キャラクタの位置・状態

• いろいろデータの種類はあれども、基本的にはデータのやりとりができればいい

Player A

Player A

Enemy

AttackPlayer B Player C

通知 通知

Player B

やりたいこと• 右の例は極端ですが…、基本的にはこれができれば大丈夫なはず• 送信側は任意のデータ送信ができ、受信側はそれを受け取れる

Player A (送信側 ) // イベント情報 ev = "event"; // イベント送信 sendEvent(ev);

Player B (受信側 )// イベント受信メソッドOnReceiveEvent(ev){ if (ev == "event") { // 何か処理 }

どう実現する…?• プレイヤー間でのデータやり取りだから、 P2P で直接

Socket で繋げばいい!– ホストの管理は? NAT 越えどうする?

• Socket Server 立てる!– Server のコードはどうする?運用は?

• Node.js 使うぜ!– Server の運用は?メンテナンスは?とにかく面倒くさいです w

面倒くさいことは任せるべき!• 通信とか、ゲームの本質ではない部分は外に任せて、本質であるコンテンツやゲームシステムに集中してほしい• 通信部分は Photon にお任せください!

Photon でできること

これができます!• イベント送受信はほぼこの形でできます!• 送信先の指定や細やかな設定もできます

Player A (送信側 ) // イベント情報 ev = "event"; // イベント送信 sendEvent(ev);

Player B (受信側 )// イベント受信メソッドOnReceiveEvent(ev){ if (ev == "event") { // 何か処理 }

つなぐまでも簡単!• マッチメイキングの要件にもよりますが、シンプルに使うなら数行で接続完了!• ソケット周りのことは一切考えなくて大丈夫です

main() { connect(); // Masterへ接続}onConnectedMaster() { opJoinRandomRoom(); // ランダムマッチ}onFailedJoinRandomRoom() { opCreateRoom(); // Roomがないので作成}onJoinedRoom() { // Roomに入ったので、実際の処理を開始}

こんなこともできます• ゲーム単位 ( ルーム ) で変数を共有することが可能• 例えば、ゲームの進行状態とか、残り時間とか• レイドバトルのような場合は敵キャラの状態とかもここで管理する方法も

Player A

Player B Player C

Player A

Stage: BRemain time: 0:36Boss HP: 89

Player B

Player C

Boss

Photon の主な機能• ロビー– 名前付ロビー– マッチメイキング– プレイヤー検索

• ルーム– 人数制御・表示制御– カスタムプロパティ

• 同期関連– オブジェクト同期– イベント通知– RPC

• Webhooks/WebRPC• Plugin

Photon のしくみ• すべてのクライアント (= プレイヤー ) はサーバーへ接続する• サーバーはクライアント間の通信を仲介する役割• サーバー自身は基本的には処理を行わないが、 Webhooks や Plugin を利用してカスタマイズも可能

Photon

Client Client Client

SDK SDK SDK

SDK 対応プラットフォームUnity Corona Marmalade

Unreal Engine Cocos2d-x Xamarin

Andorid iOS BlackBerry

JavaScript, HTML5 Linux Mac OS X

PlayStation PlayStation Mobile Xbox

dotNet Silverlight Windows (Win32)

Windows8 RT Windows Phone Windows8 Phone

Web サービスとのつなぎ方 (Webhooks)

Webhooks 最新情報• Webhooks が 1.2 となってアップデートされました– 非同期 Join– GameEvent/GameProperties での State 送信指定– カスタム HTTP ヘッダ

• Webhooks/WebRPC が Turnbased だけではなくRealtime, Server でも利用可能に!

大前提として…• Photon はストレージ機能などは一切持っていません• アカウント管理などで何かしらのストレージが必要になる場合が一般的• データ保存に関しては、今まで通り Web サービス & ストレージ (DB など ) で作ってください

Web サービスと Photon• Web サービスと Photon は必ずしもつなげる必要はありません• Web サービスでマルチプレイの準備をして、 Photon でマルチプレイを行い、その結果を

Web サービスに戻せば基本的には OK

ClientClient

Web Service準備

ClientClient

PhotonマルチプレイClientClient

Web Service結果

同時には使えないの…?• Photon 利用中にクライアントから直接 Webサービスを呼び出すことはもちろん可能• 同期などを考えると、クライアントが同時に 2つのサービスと通信するのは現実的ではない

Client Photon Web

イベント送信イベント受信

データ送信要リクエスト

イベント送信レスポンス

レスポンス待ち

Webhooks を使いましょう• Photon から Web サービスを呼び出す仕組みである

Webhooks を使うべき• Photon のイベントと同期して

Web サービスが呼び出されるので、タイミングの心配はなし• クライアントは Photon との通信に集中でき、簡単に実装が可能

ClientA CientB Webイベント送信

イベント送信 /w Webhooks

データ更新要

リクエストイベント送信

レスポンス

Photon

で、何に使うの…?• 基本的に、データの方向は Photon -> Web サービスの片方向です• 一番わかりやすいのはマルチプレイのログ取得• 長いゲームの場合、ルーム情報の保存やプレイヤー情報の保存、プレイヤーの再入室のサポートなども実現できます• Web サービスからデータを取得したい場合は WebRPCを使ってください

どう使うの…?• Photon のダッシュボード上で基底 URL を設定して、各イベントの Path を設定• いろいろな情報が JSON で渡ってくるので、それらを見て問題がなければ ResultCode:0 を返せば OK !• …以上ではありますが、もう少し詳しくお話します w

Web サービス側の実装は…?• パラメータは JSON で渡されます• 戻り値も JSON で渡します• JSON が取扱えれば言語などは一切問いません• github にサンプルもあります• 私は PHP でも作りましたが全く問題なかったです

まずダッシュボードの設定• タイプは Webhooks

1.2b• BaseUrl に URL のベース部分を指定• Path…(Close,Create…)には各イベント毎の

Path を指定

ダッシュボードの設定の続き• HasErrorInfo: Webhooks でのエラー情報をクライアント側で受け取るか否か• IsPersistent: ルームの保存を行えるよう、メモリからルーム情報を消す前に呼び出すか否か• AsyncJoin: ルーム入室時の

Webhooks呼び出しを非同期にするか否か

各イベント (Path) について• 下記の Path があります– GameCreate– GameJoin– GameProperties– GameEvent– GameLeave– GameClose

GameCreate• ルームが作成された時に呼ばれる

(Type: "Create")• 再入室におけるルーム再開の時も呼ばれる

(Type: "Load")• ルーム再開の場合は、保存されている State を戻す必要がある– State を戻さない場合で CreateIfNotExists が true の場合は新規のルームが作られる

GameJoin• プレイヤーが既存のルームに入室・再入室した場合に呼ばれる

(Type: "Join")

GameProperties• ルームやプレイヤーのカスタムプロパティを設定する時に、 HttpForward を true にすると送られる– クライアントがカスタムプロパティを設定する時のパラメータで、呼ぶか呼ばないかを制御可能

• ルームの場合は Type: "Room" 、プレイヤーの場合は Type: "Player" となる

GameEvent• イベント送信時に、 HttpForward が true にすると送られる– クライアントがイベントを送信する際にパラメータで呼ぶか呼ばないかを制御可能– Type: "Event"

GameLeave• プレイヤーがルームから退室 ( 切断 ) する時に呼ばれる• 切断理由別に Type が設定される– ClientDisconnect, ClientTimeoutDisconnect,

ManagedDisconnect, ServerDisconnect, TimeoutDisconnect, LeaveRequest, PlayerTtlTimedOut, PeerLastTouchTimedOut, PluginRequest, PluginFailedJoin

GameClose• ルームの情報が Photon のメモリから消える時に呼ばれる• IsPersistent が true なら、メモリから消す前に

Type: "Save" としてルームの情報 (State) と共に呼ばれる• IsPersistent が false なら、 Type: "Close" として呼ばれる

お伝えしきれなかったこと• ちょいちょい出てきてますが、ルームの情報を外部に保存してセーブ機能を実現できます• パラメータなどはドキュメントをご参照ください• http://doc.photonengine.com/ja/realtime/current/

reference/webhooks– 現在日本語化の準備を進めていますので、今しばらくお待ち下さい

WebRPC とは• Webhooks はイベントをフックして情報を送信するもの• WebRPC は Photon経由で任意のタイミングで Web サービスをパラメータ付きで呼び出し、 Web サービスからデータを返すことができる• WebRPC は Web サービスからデータを返せる

呼び出し方• Photon の API にて– Native SDK

Client::opWebRpc((Path 名 ), ( パラメータ ))– PUN

PhotonNetwork.WebRpc((Path 名 ), ( パラメータ ))• Path 名は Webhooks の Path 名と同じ考え方• 基本的な設定は Webhooks と共通基底 URL は同じです

渡せるデータ型• Photon が扱えて Serialize できる型は JSON に変換されて渡されます• Web サービスからのデータは適宜変換されて戻されます• 詳細はドキュメントを参照してください• http://doc.photonengine.com/ja/realtime/

current/reference/webrpc

Webhooks 最新情報• Webhooks が 1.2 となってアップデートされました– 非同期 Join– GameEvent/GameProperties での State 送信指定– カスタム HTTP ヘッダ

• Webhooks/WebRPC が Turnbased だけではなくRealtime, Server でも利用可能に!

Webhooks まとめ• Photon の中で起こったイベントに対して呼ばれるのが Webhooks• Web サービスのデータのやり取りを行うのは WebRPC• 1.2 へのアップデートや Realtime でも利用可能になり、可能性が広がりました• Web サービスとの連携で Photon の利用用途は広がります

Photon Server V3 vs. V4

Photon Server V4 リリース• Photon Server V4ようやくリリースされました• ダッシュボードからダウンロードできます

Photon Server V3 vs. V4• HTTP(S) サポート• クラウドの新機能も利用可能に• プラグイン対応• カウンタリニューアル• IPv6 対応

ここでお話します第 2 部、第 3 部にて

この後で!

クラウドの (=V4 から使える ) 新機能• Webhooks/WebRPC

– Web サービス連携 ( もう説明不要ですよね… )• カスタム認証

– 接続時のユーザー認証を Web サービス経由で行える• クラウドセーブ

– ルームの情報を一時的に Photon で保持できる• 再入室対応

– ルームに抜けたプレイヤー情報を一時的に保存でき、それを使って再入室時に復元することができる

カスタム認証• Photon への接続時に Username/Token を渡してもらい、さらに Web サービスへ渡して認証を行うことが可能• 個々のプレイヤー認証だけではなく、アプリ認証 (不正クライアント対策 ) に使うことも可能– Username は個別 ID, Token は固定として Token だけチェックするとか

クラウドセーブ• ルーム作成時に RoomTTL を設定することにより、 TTL の期間内はルーム情報を保持することが可能• ボードゲームで一時休止とかが簡単に実現可能• 認証はルーム名だけではなく退室時に渡す

Token で行う

再入室対応• プレイヤーがルームから抜けた後、同じルームに入ることができる機能• ゲームの一時中断はもとより、意図しない切断からの再開などにも使えます• カスタム認証の Username がキーになる• 今のところ PUN は非対応

V3 vs. V4 まとめ• クラウドでの新機能が取り込まれより便利に• 直接のカスタマイズなしでも可能性が大きく• より安定した Photon Server をお試しください

IPv6 対応

なぜ IPv6 対応が必要…?• Apple が iOS 9向けアプリにおいて、 IPv6対応を必須とする発表を行った• 当初は 2015年末から、というスケジュールだったが、延期され 2016年初頭に ( まだ未定 )• Photon も当然ながらネットワークを利用するサービスなので、対応が必須

IPv6 に対応することとは…?• クライアントが IPv6 の接続しか持たない状況でも、問題なく動作できるようにする ということは、• IPv4 でしか使えない API の利用や、 IPv4アドレスを直接扱っていると問題となる

IPv4 でしか使えない API• IPv4 のみに対応したデータ型– uint32_t, in_addr, sockaddr_t

• IPv4 のみに対応した API– inet_aton, gethostbyname

• IPv4 のみでしか使えない使い方をした API– gethostbyname2(hostname, AF_INET);

IPv4 アドレスの扱い• 接続先として、 IPv4 アドレス形式で持っている– "192.168.1.1"– "http://172.16.10.1/api/v1"

• ネットワーク接続の確認として、– IPv4 アドレスを持っているかどうか– "0.0.0.0" に接続できるかどうか

対応策• アドレスファミリに依存しない高レイヤーのフレームワーク、 API を使う– NSURLSession, CFNetwork

• IPv4 アドレスは文字列として処理する– OS が IPv6 アドレスと同様によろしく処理してくれる

サーバー側は…?• クライアント側は IPv6 対応しなきゃいけないのはわかったけど、サーバー側はどうするの?• クライアントのネットワークはキャリアだったりユーザー任せだからいいけど、サーバー側って自分たちの管理だし、それも IPv6 対応するのってものすごく大変では…?

サーバーは大丈夫!• サーバー側は " 基本的には "何もしなくていいです• キャリアが IPv6<-

>IPv4ネットワーク間の変換を行ってくれます (将来 )出典 : iOS Developer Library

DNS64• IPv4 アドレス (=A レコード ) しか持たない場合でも、 IPv4 を内包した IPv6 アドレスを生成する• クライアントは IPv6として見える

出典 : iOS Developer Library

NAT64• DNS64 で生成された

IPv6 アドレスへの接続をアドレス変換して IPv4ネットワーク上で接続• クライアントとサーバーそれぞれは

Gateway と接続する形となる出典 : iOS Developer Library

Photon はどうなの…?• ほぼ対応は完了しています!• Client SDK は Native SDK の対応は完了済– 4.0.5.0 で IPv6 Native に対応– 4.1.0.0 で Bridge(NAT64+DNS64) にも対応

• .NET SDK, PUN は Unity 対応待ち

Unity の対応状況• Unity5 において、 IPv6 での Socket の挙動に問題があり、 .NET SDK と PUN は動作しない• Unity社での問題認識、バグ修正、確認までは完了済• いくつかの修正はまだリリースされていないので、リリース後 Exitgames社にて動作確認して、対応 SDK&PUN をリリース予定

サーバー側は?• 対応は完了しています!• Server SDK は 4.0.28 にて対応済– RC5 にて IPv6 Native に対応– 4.0.28 にて Bridge にも対応

• Public クラウドサービスはすでに対応済• Enterprise Cloud についても準備 OK• そもそもなぜサーバー側の対応が必要なの…?

Photon のサーバーレイヤー• クラウドの場合は 3段

– Name Server (NS)– Master Server (MS)– Game Server (GS)

• Photon Server の場合は 2段– Master Server (MS)– Game Server (GS) 出典 : doc.photonengine.com

次のサーバーへの接続• ルーム作成時は MS よりルームを作るべき GSのアドレスをもらう• 今までの実装では IPv4のアドレスをクライアントに渡していたので、

IPv6ネットワークでは接続できない

Client MS GS

ルーム作成GS アドレス通知

"192.168.1.1"

接続不可!接続

IPv6 への対応法 〜 Native 〜• GS は IPv4 と IPv6 それぞれのアドレスを持ち、それを MS へ通知しておく• MS は Client との接続のアドレスファミリを確認して、アドレスファミリと一致したアドレスを返す

Client MS GS

ルーム作成GS アドレス通知” FE80:xxxx:…"

AF 判定接続

IPv6 への対応法 〜 Bridge 〜• GS は IPv4 と「ホスト名」を持ち、それを MS へ通知しておく• Client は IPv6 接続の場合に

IPv6 フラグを立ててリクエストする• MS はフラグを確認して、フラグ立っている場合はホスト名を返す

Client MS GS

ルーム作成 w/IPv6

GS アドレス通知” gs1.aaa.com"フラグ確認

接続

IPv6 対応まとめ• Unity 対応でお待たせして恐縮ですが、見通しは立っていますので、今しばらくお待ち下さい• サーバー側は準備万端です!• Native SDK をご利用の場合は、最新 SDK へのアップデートをお願いします

最後に

まとめ• 進化した Webhooks で Web サービス連携が使いやすく! Realtime でも利用可能です!• Photon Server V4 もリリースされました!• サーバー側の IPv6 は万全!クライアント側のアップデート準備をお願いします

今後の予定• 第 2 部 : 4/5(月 )-6(火 ) Unite 2016 Tokyoセッション登壇します!

Enterprise Cloud と Plugin で実現している『 FINAL FANTASY GRAND MASTERS』の事例をプロデューサー&開発者が直接お話しますのでお楽しみに!

• 第 3 部 : 5/18(水 ) 第 2回勉強会 (After Unite)カスタマイズに対応した Enterprise Cloud と、簡単カスタマイズの Plugin開発の詳細をお話します!

ヘルプセンター始めました• ナレッジベースや、コミニュティ ( フォーラム ) 機能のあるヘルプセンターを開設しました• コンテンツの充実化を図っていきますので、ぜひご利用ください!• https://support.photonengine.jp/hc/ja

お問い合わせ• メールアドレス– developer@photonengine.jp

• Web もご覧ください– http://photonengine.jp/

• ヘルプセンター– https://support.photonengine.jp/hc/ja

最後に…一緒に働けるエンジニアを大募集中!

( その他営業なども )

ありがとうございました!developer@photonengine.jp

Recommended