iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine
-
Upload
gmo-cloud-kk -
Category
Documents
-
view
13.431 -
download
0
description
Transcript of iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine
iPhoneでリアルタイムマルチプレイを実現!
~ Photon Network Engine ~
AppBankGames Inc.
ユニークな環境
初期メンバーのほぼ全員がゲームを作ったことがないゲーム会社!!
オフィスがユニーク!和室!アーロンチェア!全員MacBookPro!!
•
•
アジェンダ
小野将司 (Game Creator)
アジェンダ
本日は「Photon Network Engine」をUnityで使用してリアルタイムマルチプレイを実現させるお話をします
現在稼働中のサービスを実際に作った開発者達が良かった点・苦労した点などをお話しします
•
•
アジェンダPhoton Network Engineとは?Photon Network Engineを採用した理由サーバーサイドの実装Unityクライアントサイドの実装まとめ
1.
2.
3.
4.
5.
Photon Network Engineとは?1.
小野将司 (Game Creator)
そもそも「マルチプレイ」って何?
格闘ゲームの通信対戦
モンハンとかぶつ森とか
MMORPG
•
•
•
ソーシャルカードゲーム
3DSのすれちがい通信
チェスなどのターン制ゲーム
•
•
•
リアルタイム
非同期
非同期は比較的カンタン
広くインターネットを支えているHTTPとWeb系技術で大体の非同期なマルチプレイは作れる
性能要求が低め(1~2秒遅延しても誰も気にしない)
オープンソースの製品が多く費用が抑えられる
•
••
リアルタイムは難しい
TCP / UDPを生で扱ったり、NAT Holepunchingしたり、自前で効率的な通信プロトコルを作らなければならない
性能要求が極めて高い(1~2秒遅延したらクソゲー)
オープンソースの製品はほぼ皆無、費用がかかる
•
••
そんな難しいリアルタイムマルチプレイをお手軽に
そこでネットワークエンジン
Photon Network Engine
Photon Network Engineの概要Exit Gamesが開発した高速でスケーラブルなネットワークエンジン
Photon Server is the fastest and easiest to use on-premiseNetwork Engine to build scalable MMOGs, FPS or any othermultiplayer game and application for PC, Mac, Browser,Mobile, Console and Cross-Platform. (公式Webより)
要するにすごいらしい
•
•
•
.NET CLR (C#)
Photon Network Engineの概要
Photon Core (C/C++)
Reliable UDP Websockets Binary TCP
ServerApplication
ServerApplication
ServerApplication
サーバー クライアント
Photon SDK(for each platforms)
ClientApplication
サーバー
Windows Server向け製品として提供
通信はReliable UDPとTCPを使用高速で安定(らしい)
••
クライアント
主要なプラットフォーム向けにSDKが提供されている
もちろんUnityもサポート
••
採用実績
2013年4月現在ではiOS/Android向けの実績も続々登場!•
Photon Network Engineを採用した理由
2.
小野将司 (Game Creator)
と、その前に
ダンゴル2012/12/3 リリース
ファンタジー本格ゴルフ!
無料!
ダンゴル2012/12/3 リリース
ファンタジー本格ゴルフ!
無料!
ダンゴル2012/12/3 リリース
ファンタジー本格ゴルフ!
無料!
マルチプレイリアルタイム同期型マルチプレイ(ゴーストではありません)
つまり自分も相手も同じホールを現在プレイしている
3G回線でもマルチプレイ可能
オフライン時はシームレスにソロプレイに移行する
•
•
•
•
そんな夢みたいなゲームを作りたい
が、しかし・・・
ネットワークゲームの作成経験者がほぼゼロ
予算も期間も限られている
スマートフォンでリアルタイムマルチプレイという未知
•••
これらの困難にどう立ち向かうか
リアルタイムマルチプレイの実現手法を考える
UnityのNetworkクラスを使用する既存のネットワークゲーム用エンジンをプラグインで自前でSystem.Net.Socketを使って実装する
A.
B.
C.
UnityのNetworkクラスを使用する既存のネットワークゲーム用エンジンをプラグインで自前でSystem.Net.Socketを使って実装する
A.
B.
C.
リアルタイムマルチプレイの実現手法を考える
UnityのNetworkクラス
便利なAPIが揃っている (Synchronization, RPC call, etc...)
ネットワークゲームの経験がなくても組めそう
実験してみたところiPhone実機でも問題なく動作!
一見これでよさそうに見えるのだが・・・
••••
うまくいかない
最大の問題点はクライアントのうち1台がホストにされてしまうという仕様
要するにDedicated Serverが存在しないためスマートフォンにホストをやらせなければならない
•
•
何がまずいかダンゴルのようなスマートフォンでリリースされているゲームの場合、ユーザーさんが3G回線で遊んでいるケースも考慮しなければならない
SBMの3G上りは実測最高10KB/s程度 = 1KB/Frame(10FPS)しかもブツブツ切れるとてもじゃないがホストにはなれない
•
•
どうする?
3G回線でもマルチプレイをするために、Dedicated Serverが絶対に欲しい
でもUnityのNetworkクラスの利便性は捨てがたい(特にネットワークゲームの経験のないチームには)
•
•
調べてみる
ありました
Photon 採用の決め手Dedicated Serverが立てられる (Windowsだけど)
UnityのNetworkクラスとAPIがほぼ一致している
小規模デベロッパーでも手が出るほど安い ($3,500)
という選択肢がPhoton以外にUnity界隈に無い文句なしに素敵(・・・に見える)
••••
実績も一応あるようだ
実績も一応あるようだ
これはもう使わない手がない!ということで、ここからは実際の開発者の話
サーバーサイドの実装3.
江口達郎 (Game Creator)
Photonサーバー概要
クラウドサービス申し込めば即利用可能
サーバーSDKを提供自分でサーバーを用意す
る必要がある
Photonサーバー概要
サーバー実装を修正できない
SDKのソースが公開されているので、独自の実装を追加することが出来る
Photonサーバー概要
月額課金同時接続1000人で$69/月
買い切り無制限接続で$3,500
Photonサーバー概要
サーバーを用意したくない、手軽に始めたい
デベロッパーにオススメ
サーバーに独自の処理を組み込みたい、同時接続が多い
デベロッパーにオススメ
Photonサーバー概要・Windows環境で動作
Windowsサーバーをたてる必要あり
・用意されているアプリケーションが豊富LoadBalancer, MMO, Lobby, Chat,
etc...
Photon Server SDKで最初から用意されているサーバーアプリ
ロードバランサを実装している
MasterサーバーとGameサーバーをたてる必要がある
•
••
LoadBalancing Server
ゲームルームで実際にクライアントと通信
Masterサーバー:
Gameサーバー:
Gameサーバーの管理、負荷分散、ゲームルームの管理など
LoadBalancing ServerMasterサーバーは常にGameサーバーを監視しており、あとから動的にゲームサーバーを組み込むことが出来る
Photon Server(Master Server)
Photon Server(Game Server)
Photon Server(Game Server)
Photon Server(Game Server)
登録
LoadBalancing ServerMasterサーバーは常にGameサーバーを監視しており、あとから動的にゲームサーバーを組み込むことが出来る
Photon Server(Master Server)
Photon Server(Game Server)
Photon Server(Game Server)
Photon Server(Game Server)
監視・負荷分散
Photon Server(Master Server)
Photon Server(Game Server)
Photon Server(Game Server)
Photon Server(Game Server)
ダンゴル Client
ダンゴル Client
ダンゴルのPhotonサーバー構成
ダンゴルクライアントからはまずはMaster Serverに接続されるマスターサーバーが負荷状況によりどのGame Serverを使うか判断する
Photon Server(Master Server)
Photon Server(Game Server)
Photon Server(Game Server)
Photon Server(Game Server)
ダンゴル Client
ダンゴル Client
ダンゴルのPhotonサーバー構成
Game Serverが決まったら、クライアント同士の通信はGame Serverを介して行われる
Photon Server(Master Server)
Photon Server(Game Server)
Photon Server(Game Server)
Photon Server(Game Server)
ダンゴルClient
ダンゴルAPIサーバー
ダンゴルのPhotonサーバー構成
ダンゴルではユーザーマッチング時に外部サーバーと連携する必要があり、一部SDKに手が入っています
手を入れた箇所
手を入れた箇所
protected override void ExecuteOperation(LitePeer peer, OperationRequest operationRequest,SendParameters sendParameters) { switch (operationRequest.OperationCode) { case (byte)OperationCode.CreateGame: this.HandleCreateGameOperation(peer, createGameRequest, sendParameters); System.Net.WebClient wc = new System.Net.WebClient(); ... byte[] resData = wc.UploadValues(url, ps); ... case (byte)OperationCode.JoinGame: this.HandleJoinGameOperation(peer, joinGameRequest, sendParameters); System.Net.WebClient wc = new System.Net.WebClient(); ... byte[] resData = wc.UploadValues(url, ps); }}
ゲームルームを作る箇所と参加する箇所
追加
追加
手を入れた箇所
protected override int RemovePeerFromGame(LitePeer peer, LeaveRequestleaveRequest) { if (this.IsDisposed) { // Send room member count to API server. System.Net.WebClient wc = new System.Net.WebClient(); ... byte[] resData = wc.UploadValues(url, ps); }}
ゲームルームから抜ける箇所
追加
苦労した点(サーバーサイド)
1. 情報が少ない国内ではほとんど事例がないため、情報源はもっぱら英語
海外でもそこまで情報が多くないので、公式のフォーラムが唯一の情報源
••
GMOクラウドのPhoton情報日本語化に期待!
苦労した点(サーバーサイド)
Photon Cloudを使えば設定は考慮不要
2. Windowsでしか動作しない
サーバーと言えばLinux、ですよね、、?
Linuxでのサーバー運用経験者しかいないため最初の設定に苦労
••
Photon Serverは結構イバラの道です。。
まとめ(サーバーサイド)
サーバー持ちたくなかったり、Photon Server SDKを改造する必要が無ければ、Photon Cloudはとても良い選択肢
Photon Serverに手を出すと多少苦労することになると思う
今のところトラブル無くサーバーは動き続けています!!
•
••
Unityクライアントサイドの実装
4.
松本一輝 (Game Creator)
1) 入室処理2) RPCの実装3) オフラインモードへの移行4) マルチプレイのテスト
Unityクライアントサイドの実装
入室処理
ダンゴル Client(Unity)
Photon Network EngineServerクラスタ
ダンゴルAPI ServerクラスタLB
ダンゴルデータベース
ダンゴル Client(Unity)
Photon Network EngineServerクラスタ
ダンゴルAPI ServerクラスタLB
ダンゴルデータベース
API Server から部屋名を受け取る
ダンゴル Client(Unity)
Photon Network EngineServerクラスタ
ダンゴルAPI ServerクラスタLB
ダンゴルデータベース
指定した部屋名の部屋に入る / 作る
入室処理APIサーバに部屋名を要求Photon サーバに接続部屋名を指定して Join
Join に失敗したら部屋作成入室処理完了したら PhotonNetwork.Instantiate でキャラ生成
1.
2.
3.
4.
5.
入室処理function Start(){ PhotonNetwork.ConnectUsingSettings("v1.0");}
function OnConnectedToPhoton(){ PhotonNetwork.JoinRoom(roomName);}
function OnJoinedRoom(){ InstantiateLocalPlayer();}
function OnPhotonJoinRoomFailed(){ PhotonNetwork.CreateRoom(roomName, true, true, 4);}
入室処理
function InstantiateLocalPlayer(){ var prefabName : String = “Birdie”; //prefab name in Resource Folder. var position : Vector3 = Vector3.zero; var rotation : Quaternion = Quaternion.identity;
PhotonNetwork.Instantiate(prefabName, position, rotation, 0);}
RPCの実装
Photon のデータ送信方法はふたつState Synchronization と RPC(Remote Procedure Calls)
ダンゴルでは RPCのみ使用※モバイル通信で State Synchronization はちょっとキビシイかも ^^;
RPCの実装
1) Photon.MonoBehaviour を継承したクラスにRPCを実装2) PhotonView と実装したクラスをキャラのプレハブにアタッチ3) あとはひたすらテスト
RPCの実装
namespace Photon{ public class MonoBehaviour : UnityEngine.MonoBehaviour { public PhotonView photonView { get { return PhotonView.Get(this); } } new public PhotonView networkView { get { return PhotonView.Get(this); } } }}
RPCの実装
public function OnShot(status : ShotStatus){ var json : String = JsonMapper.ToJson(status); photonView.RPC("RpcPlayerShot", PhotonTargets.Others, json);}
@RPCfunction RpcPlayerShot(json : String){ var shotStatus : ShotStatus = JsonMapper.ToObject.<ShotStatus>(json); var player : PlayerController = GetComponent.<PlayerController>(); player.Shot(shotStatus);}
RPCの実装
送信側は送信先を指定する(基本はPhotonTargets.Others)送信側と受信側でパラメータを一致させるオブジェクトをそのまま送りたいときはJSONを使う
JSON にすることで通信量は増えるが、変更が簡単 JSON パーサはLitJSON を使用より高速化したい場合は PhotonPeer.RegisterType というのがあるらしいが、ダンゴルでは使ってない
•
•
••••
RPCの実装
オフラインモードへの移行
モバイルのマルチプレイではオフラインモードは必須Photon には標準でオフラインモードが実装されているネットワークが切断されると自動的にオフラインモードに移行
PhotonNetwork.offlineMode = true; //Enable offline mode.
オフラインモードへの移行オフラインモード = シングルプレイモード
マルチプレイのテスト
受信側をシミュレートするためのデバッグの仕組みを作る
マルチプレイのテスト
Demo
open -na /Applications/Unity/Unity.app
Unity をたくさん開く
※Mac のみ。Windows は分かりません ^^;