cedec2013 photon network engine

Post on 10-Jun-2015

1.693 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

~ Photon Network Engineを簡単に活用する方法 ~

AppBankGames Inc.

1

アジェンダ

2

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

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

• 「Photon Network Engine」を簡単に活用できる「Photon Cloud」についてご紹介いたします

3

アジェンダ

1. Photon Network Engineを採用した理由

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

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

4. Photon Cloud

4

Photon Network Engineを採用した理由

1.

5

今回我々が作りたかったゲームダンジョンズアンドゴルフ

6

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

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

無料!

7

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

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

無料!

8

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

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

無料!

9

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

• つまり自分も相手も同じホールを同時にプレイしたい

• 3G回線でもマルチプレイ可能にしたい

• オフライン時にはシームレスにソロプレイに移行したい

10

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

11

が、しかし・・・

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

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

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

12

これらの困難にどう立ち向かうか※クライアントサイドはUnityを使用する

13

3択―ひとつだけ選びなさい

(1) ハンサムな我々は自前で実装する

(2) Unity組込のネットワークエンジンが助けてくれる

(3) 実現できない。現実は非情である。

14

(1)ハンサムな我々は自前で実装する

(2) Unity組込のネットワークエンジンが助けてくれる

(3) 実現できない。現実は非情である。

15

リアルタイムマルチプレイを自前実装するには・・・

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

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

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

• 今回はモバイル、3G回線で動作させなければならない

16

無理

17

(1)ハンサムな我々は自前で実装する

(2) Unity組込のネットワークエンジンが助けてくれる

(3) 実現できない。現実は非情である。

18

(1) ハンサムな我々は自前で実装する

(2)Unity組込のネットワークエンジンが助けてくれる

(3) 実現できない。現実は非情である。

19

UnityのNetworkクラス• 便利なAPIが揃っている

• 自動オブジェクト同期やRPC呼び出しをサポート

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

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

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

20

うまくいかない

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

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

21

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

• SBMの3G上りは実測最高10KB/s程度 = 1KB/Frame (10FPS)

しかもブツブツ切れるとてもじゃないがホストにはなれない

22

(1) ハンサムな我々は自前で実装する

(2)Unity組込のネットワークエンジンが助けてくれる

(3) 実現できない。現実は非情である。

23

(1) ハンサムな我々は自前で実装する

(2) Unity組込のネットワークエンジンが助けてくれる

(3)実現できない。現実は非情である。

答え-③ 答え③ 答え③24

どうする?

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

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

25

これらを満たすソリューションはないか?

26

そこでPhoton Network Engine27

Photon Network Engineの概要• Exit Gamesが開発した高速でスケーラブルなネットワークエンジン

• Photon Server is the fastest and easiest to use on-premise Network Engine to build scalable MMOGs, FPS or any other multiplayer game and application for PC, Mac, Browser, Mobile, Console and Cross-Platform. (公式Webより)

• 要するにすごいらしい

28

.NET CLR (C#)

Photon Network Engineの概要

Photon Core (C/C++)

Reliable UDP Websockets Binary TCP

Server Application

Server Application

Server Application

サーバー クライアント

Photon SDK(for each platforms)

ClientApplication

29

サーバー

• Windows Server向け製品として提供

• 通信はReliable UDPとTCPを使用、高速で安定

• ロードバランサー、ロビーマスターサーバー、NATホールパンチングを標準装備

30

クライアント

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

• コンソール・モバイル・Unityもサポート

31

料金体系

• 買い切りのPhoton Server

• 同接100人まで無料、無制限プラン$3,500

• SaaS型のPhoton Cloud

• 同接20人まで無料、同接1000人で$69/月

32

採用実績

• 2013年8月現在ではモバイル向けの実績も続々登場

33

ゴルフゲームの実績もある34

モバイルでの実績もある35

Photon 採用の決め手• Dedicated Serverが立てられる

• UnityのNetworkクラスのAPIがそのまま使用可能

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

• という選択肢がPhoton以外にUnity界隈に無い文句なしに素敵

36

これなら大丈夫そう!

ということで、ここからは実際の開発の話

37

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

38

Photonサーバーを構築

• 先述の通りWindows環境が必要

• 今回は某社のクラウドサービス上に構築

• Photon ServerをインストールしてXML形式の設定ファイルを用意する(主にロードバランサの設定)

• 最後にWindowsサービスとしてPhoton Serverが動作するように設定

39

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

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

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

LoadBalancing Server

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

Masterサーバー:

Gameサーバー:

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

40

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

Photon Server(Master Server)

Photon Server(Game Server)

Photon Server(Game Server)

Photon Server(Game Server)

登録

41

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

Photon Server(Master Server)

Photon Server(Game Server)

Photon Server(Game Server)

Photon Server(Game Server)

監視・負荷分散

42

Photon Server(Master Server)

1台

Photon Server(Game Server)

1~2台ダンゴル Client

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

43

Photon Server(Master Server)

1台

Photon Server(Game Server)

1~2台ダンゴル Client

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

Game Server台数は負荷状況に応じて手動で増減

3G回線上でだいたい300ms ~ 1000ms程度

WiFiだと100ms ~ 200ms程度

44

Photon Server(Master Server)

Photon Server(Game Server)

Photon Server(Game Server)

Photon Server(Game Server)

ダンゴル Client

ダンゴル Client

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

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

45

Photon Server(Master Server)

Photon Server(Game Server)

Photon Server(Game Server)

Photon Server(Game Server)

ダンゴル Client

ダンゴル Client

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

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

46

Photon Server(Master Server)

Photon Server(Game Server)

Photon Server(Game Server)

Photon Server(Game Server)

ダンゴルClient

ダンゴルAPIサーバー

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

ダンゴルではユーザーマッチング時に外部サーバーと連携する必要があり、一部サーバ実装がカスタマイズされています

47

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

1. 情報が少ない

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

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

※2013年8月現在、かなり改善してきている

48

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

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

2. Windowsでしか動作しない

• Linuxサーバーと比較すると、どうしても費用がかかる

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

49

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

3.

50

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

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

51

入室処理

52

ダンゴル Client

(Unity)

Photon Serverクラスタ

ダンゴルAPI ServerクラスタLB

ダンゴルデータベース

53

ダンゴル Client

(Unity)

Photon Serverクラスタ

ダンゴルAPI ServerクラスタLB

ダンゴルデータベース

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

54

ダンゴル Client

(Unity)

Photon Serverクラスタ

ダンゴルAPI ServerクラスタLB

ダンゴルデータベース

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

55

入室処理

1.APIサーバーに部屋名を要求

2.Photon サーバーに接続

3.部屋名を指定して Join

• Join に失敗したら新しい部屋を作成して再度 Joinを試みる

4.入室処理完了したら PhotonNetwork.Instantiate でキャラ生成

56

57

RPCの実装

58

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

ダンゴルでは RPCのみ使用※3G回線上で State Synchronization はちょっと無理がある

RPCの実装

59

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

RPCの実装

60

RPCの引数としてオブジェクトを送りたいときどうするか?

↓今回はJSONを採用

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

RPCの実装

61

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

62

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

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

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

63

マルチプレイのテスト

64

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

マルチプレイのテスト

65

66

open -na /Applications/Unity/Unity.app

Unity をたくさん開く (Mac OS Xの場合)

マルチプレイのテスト

これで1台のマシンでマルチプレイのテストが可能になる

67

68

Good Unity の Network クラスとの差異が少ないので実装が楽。

Badまだまだ Photonの情報が少ない。オフラインモード突入時の挙動がお行儀悪いので注意。※結局Photonクライアントのコードを書き換えて対応

クライアントまとめ

69

Photon Cloud

4.

70

サービスの比較

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

サーバーSDKが提供される自前でサーバーを用意する

必要がある

71

サービスの比較

サーバーサイドの実装は最初から用意されているものを使用する

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

72

サービスの比較

サーバー構築・維持管理が不要料金も大抵の場合は割安

カスタマイズ不可、提供機能のみ

サーバーに独自処理を追加できるインフラのカスタマイズも可能

サーバの維持管理と費用が必要

73

まとめ• Photon Network Engine + Unityの組み合わせは強力ですうまくやれば素人集団でも比較的お手軽に立派なリアルタイムマルチプレイゲームを作ることができます

• Unityでリアルタイムマルチプレイを実現したい人には大変オススメです!

74

Thank you for watching.

75

top related