photon webhooks & ipv6対応の最新情報
TRANSCRIPT
安心してください!対応してますよ!〜 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
お問い合わせ• メールアドレス– [email protected]
• Web もご覧ください– http://photonengine.jp/
• ヘルプセンター– https://support.photonengine.jp/hc/ja
最後に…一緒に働けるエンジニアを大募集中!
( その他営業なども )
ありがとうございました![email protected]