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

Post on 05-Dec-2014

13.426 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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 は分かりません ^^;

top related