iphoneでリアルタイムマルチプレイを実現!photon network engine

82
iPhoneリアルタイムマルチプレイを実現! ~ Photon Network Engine ~ AppBankGames Inc.

Upload: gmo-cloud-kk

Post on 05-Dec-2014

13.426 views

Category:

Documents


0 download

DESCRIPTION

AppBankGAMESさまよりご紹介いただきました。

TRANSCRIPT

Page 1: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

iPhoneでリアルタイムマルチプレイを実現!

~ Photon Network Engine ~

AppBankGames Inc.

Page 2: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine
Page 3: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

ユニークな環境

初期メンバーのほぼ全員がゲームを作ったことがないゲーム会社!!

オフィスがユニーク!和室!アーロンチェア!全員MacBookPro!!

Page 4: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine
Page 5: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine
Page 6: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

アジェンダ

小野将司 (Game Creator)

Page 7: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

アジェンダ

本日は「Photon Network Engine」をUnityで使用してリアルタイムマルチプレイを実現させるお話をします

現在稼働中のサービスを実際に作った開発者達が良かった点・苦労した点などをお話しします

Page 8: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

アジェンダPhoton Network Engineとは?Photon Network Engineを採用した理由サーバーサイドの実装Unityクライアントサイドの実装まとめ

1.

2.

3.

4.

5.

Page 9: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photon Network Engineとは?1.

小野将司 (Game Creator)

Page 10: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

そもそも「マルチプレイ」って何?

Page 11: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

格闘ゲームの通信対戦

モンハンとかぶつ森とか

MMORPG

ソーシャルカードゲーム

3DSのすれちがい通信

チェスなどのターン制ゲーム

リアルタイム

非同期

Page 12: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

非同期は比較的カンタン

広くインターネットを支えているHTTPとWeb系技術で大体の非同期なマルチプレイは作れる

性能要求が低め(1~2秒遅延しても誰も気にしない)

オープンソースの製品が多く費用が抑えられる

••

Page 13: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

リアルタイムは難しい

TCP / UDPを生で扱ったり、NAT Holepunchingしたり、自前で効率的な通信プロトコルを作らなければならない

性能要求が極めて高い(1~2秒遅延したらクソゲー)

オープンソースの製品はほぼ皆無、費用がかかる

••

Page 14: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

そんな難しいリアルタイムマルチプレイをお手軽に

Page 15: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

そこでネットワークエンジン

Page 16: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photon Network Engine

Page 17: iPhoneでリアルタイムマルチプレイを実現!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より)

要するにすごいらしい

Page 18: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

.NET CLR (C#)

Photon Network Engineの概要

Photon Core (C/C++)

Reliable UDP Websockets Binary TCP

ServerApplication

ServerApplication

ServerApplication

サーバー クライアント

Photon SDK(for each platforms)

ClientApplication

Page 19: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

サーバー

Windows Server向け製品として提供

通信はReliable UDPとTCPを使用高速で安定(らしい)

••

Page 20: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

クライアント

主要なプラットフォーム向けにSDKが提供されている

もちろんUnityもサポート

••

Page 21: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

採用実績

2013年4月現在ではiOS/Android向けの実績も続々登場!•

Page 22: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photon Network Engineを採用した理由

2.

小野将司 (Game Creator)

Page 23: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

と、その前に

Page 24: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

ダンゴル2012/12/3 リリース

ファンタジー本格ゴルフ!

無料!

Page 25: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

ダンゴル2012/12/3 リリース

ファンタジー本格ゴルフ!

無料!

Page 26: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

ダンゴル2012/12/3 リリース

ファンタジー本格ゴルフ!

無料!

Page 27: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

マルチプレイリアルタイム同期型マルチプレイ(ゴーストではありません)

つまり自分も相手も同じホールを現在プレイしている

3G回線でもマルチプレイ可能

オフライン時はシームレスにソロプレイに移行する

Page 28: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

そんな夢みたいなゲームを作りたい

Page 29: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

が、しかし・・・

ネットワークゲームの作成経験者がほぼゼロ

予算も期間も限られている

スマートフォンでリアルタイムマルチプレイという未知

•••

Page 30: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

これらの困難にどう立ち向かうか

Page 31: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

リアルタイムマルチプレイの実現手法を考える

UnityのNetworkクラスを使用する既存のネットワークゲーム用エンジンをプラグインで自前でSystem.Net.Socketを使って実装する

A.

B.

C.

Page 32: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

UnityのNetworkクラスを使用する既存のネットワークゲーム用エンジンをプラグインで自前でSystem.Net.Socketを使って実装する

A.

B.

C.

リアルタイムマルチプレイの実現手法を考える

Page 33: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

UnityのNetworkクラス

便利なAPIが揃っている (Synchronization, RPC call, etc...)

ネットワークゲームの経験がなくても組めそう

実験してみたところiPhone実機でも問題なく動作!

一見これでよさそうに見えるのだが・・・

••••

Page 34: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

うまくいかない

最大の問題点はクライアントのうち1台がホストにされてしまうという仕様

要するにDedicated Serverが存在しないためスマートフォンにホストをやらせなければならない

Page 35: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

何がまずいかダンゴルのようなスマートフォンでリリースされているゲームの場合、ユーザーさんが3G回線で遊んでいるケースも考慮しなければならない

SBMの3G上りは実測最高10KB/s程度 = 1KB/Frame(10FPS)しかもブツブツ切れるとてもじゃないがホストにはなれない

Page 36: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

どうする?

3G回線でもマルチプレイをするために、Dedicated Serverが絶対に欲しい

でもUnityのNetworkクラスの利便性は捨てがたい(特にネットワークゲームの経験のないチームには)

Page 37: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

調べてみる

Page 38: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

ありました

Page 39: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photon 採用の決め手Dedicated Serverが立てられる (Windowsだけど)

UnityのNetworkクラスとAPIがほぼ一致している

小規模デベロッパーでも手が出るほど安い ($3,500)

という選択肢がPhoton以外にUnity界隈に無い文句なしに素敵(・・・に見える)

••••

Page 40: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

実績も一応あるようだ

Page 41: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

実績も一応あるようだ

Page 42: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

これはもう使わない手がない!ということで、ここからは実際の開発者の話

Page 43: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

サーバーサイドの実装3.

江口達郎 (Game Creator)

Page 44: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photonサーバー概要

クラウドサービス申し込めば即利用可能

サーバーSDKを提供自分でサーバーを用意す

る必要がある

Page 45: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photonサーバー概要

サーバー実装を修正できない

SDKのソースが公開されているので、独自の実装を追加することが出来る

Page 46: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photonサーバー概要

月額課金同時接続1000人で$69/月

買い切り無制限接続で$3,500

Page 47: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photonサーバー概要

サーバーを用意したくない、手軽に始めたい

デベロッパーにオススメ

サーバーに独自の処理を組み込みたい、同時接続が多い

デベロッパーにオススメ

Page 48: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photonサーバー概要・Windows環境で動作

Windowsサーバーをたてる必要あり

・用意されているアプリケーションが豊富LoadBalancer, MMO, Lobby, Chat,

etc...

Page 49: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photon Server SDKで最初から用意されているサーバーアプリ

ロードバランサを実装している

MasterサーバーとGameサーバーをたてる必要がある

••

LoadBalancing Server

ゲームルームで実際にクライアントと通信

Masterサーバー:

Gameサーバー:

Gameサーバーの管理、負荷分散、ゲームルームの管理など

Page 50: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

LoadBalancing ServerMasterサーバーは常にGameサーバーを監視しており、あとから動的にゲームサーバーを組み込むことが出来る

Photon Server(Master Server)

Photon Server(Game Server)

Photon Server(Game Server)

Photon Server(Game Server)

登録

Page 51: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

LoadBalancing ServerMasterサーバーは常にGameサーバーを監視しており、あとから動的にゲームサーバーを組み込むことが出来る

Photon Server(Master Server)

Photon Server(Game Server)

Photon Server(Game Server)

Photon Server(Game Server)

監視・負荷分散

Page 52: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photon Server(Master Server)

Photon Server(Game Server)

Photon Server(Game Server)

Photon Server(Game Server)

ダンゴル Client

ダンゴル Client

ダンゴルのPhotonサーバー構成

ダンゴルクライアントからはまずはMaster Serverに接続されるマスターサーバーが負荷状況によりどのGame Serverを使うか判断する

Page 53: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photon Server(Master Server)

Photon Server(Game Server)

Photon Server(Game Server)

Photon Server(Game Server)

ダンゴル Client

ダンゴル Client

ダンゴルのPhotonサーバー構成

Game Serverが決まったら、クライアント同士の通信はGame Serverを介して行われる

Page 54: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photon Server(Master Server)

Photon Server(Game Server)

Photon Server(Game Server)

Photon Server(Game Server)

ダンゴルClient

ダンゴルAPIサーバー

ダンゴルのPhotonサーバー構成

ダンゴルではユーザーマッチング時に外部サーバーと連携する必要があり、一部SDKに手が入っています

Page 55: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

手を入れた箇所

Page 56: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

手を入れた箇所

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); }}

ゲームルームを作る箇所と参加する箇所

追加

追加

Page 57: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

手を入れた箇所

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); }}

ゲームルームから抜ける箇所

追加

Page 58: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

苦労した点(サーバーサイド)

1. 情報が少ない国内ではほとんど事例がないため、情報源はもっぱら英語

海外でもそこまで情報が多くないので、公式のフォーラムが唯一の情報源

••

GMOクラウドのPhoton情報日本語化に期待!

Page 59: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

苦労した点(サーバーサイド)

Photon Cloudを使えば設定は考慮不要

2. Windowsでしか動作しない

サーバーと言えばLinux、ですよね、、?

Linuxでのサーバー運用経験者しかいないため最初の設定に苦労

••

Photon Serverは結構イバラの道です。。

Page 60: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

まとめ(サーバーサイド)

サーバー持ちたくなかったり、Photon Server SDKを改造する必要が無ければ、Photon Cloudはとても良い選択肢

Photon Serverに手を出すと多少苦労することになると思う

今のところトラブル無くサーバーは動き続けています!!

••

Page 61: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Unityクライアントサイドの実装

4.

松本一輝 (Game Creator)

Page 62: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

1) 入室処理2) RPCの実装3) オフラインモードへの移行4) マルチプレイのテスト

Unityクライアントサイドの実装

Page 63: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

入室処理

Page 64: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

ダンゴル Client(Unity)

Photon Network EngineServerクラスタ

ダンゴルAPI ServerクラスタLB

ダンゴルデータベース

Page 65: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

ダンゴル Client(Unity)

Photon Network EngineServerクラスタ

ダンゴルAPI ServerクラスタLB

ダンゴルデータベース

API Server から部屋名を受け取る

Page 66: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

ダンゴル Client(Unity)

Photon Network EngineServerクラスタ

ダンゴルAPI ServerクラスタLB

ダンゴルデータベース

指定した部屋名の部屋に入る / 作る

Page 67: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

入室処理APIサーバに部屋名を要求Photon サーバに接続部屋名を指定して Join

Join に失敗したら部屋作成入室処理完了したら PhotonNetwork.Instantiate でキャラ生成

1.

2.

3.

4.

5.

Page 68: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

入室処理function Start(){ PhotonNetwork.ConnectUsingSettings("v1.0");}

function OnConnectedToPhoton(){ PhotonNetwork.JoinRoom(roomName);}

function OnJoinedRoom(){ InstantiateLocalPlayer();}

function OnPhotonJoinRoomFailed(){ PhotonNetwork.CreateRoom(roomName, true, true, 4);}

Page 69: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

入室処理

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);}

Page 70: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine
Page 71: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

RPCの実装

Page 72: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Photon のデータ送信方法はふたつState Synchronization と RPC(Remote Procedure Calls)

ダンゴルでは RPCのみ使用※モバイル通信で State Synchronization はちょっとキビシイかも ^^;

RPCの実装

Page 73: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

1) Photon.MonoBehaviour を継承したクラスにRPCを実装2) PhotonView と実装したクラスをキャラのプレハブにアタッチ3) あとはひたすらテスト

RPCの実装

Page 74: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

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の実装

Page 75: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

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の実装

Page 76: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

送信側は送信先を指定する(基本はPhotonTargets.Others)送信側と受信側でパラメータを一致させるオブジェクトをそのまま送りたいときはJSONを使う

JSON にすることで通信量は増えるが、変更が簡単 JSON パーサはLitJSON を使用より高速化したい場合は PhotonPeer.RegisterType というのがあるらしいが、ダンゴルでは使ってない

••••

RPCの実装

Page 77: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

オフラインモードへの移行

Page 78: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

モバイルのマルチプレイではオフラインモードは必須Photon には標準でオフラインモードが実装されているネットワークが切断されると自動的にオフラインモードに移行

PhotonNetwork.offlineMode = true; //Enable offline mode.

オフラインモードへの移行オフラインモード = シングルプレイモード

Page 79: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

マルチプレイのテスト

Page 80: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

受信側をシミュレートするためのデバッグの仕組みを作る

マルチプレイのテスト

Page 81: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

Demo

Page 82: iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine

open -na /Applications/Unity/Unity.app

Unity をたくさん開く

※Mac のみ。Windows は分かりません ^^;