協力・対戦ゲームを支える Photonの最新情報、 Mecanimに

協力・対戦ゲームを支える
Photonの最新情報、
Mecanimにネイティブ対応した
PUNの実力
Photon 運営事務局
シニアテクニカルアドバイザー 並木 健太郎
テクニカルアドバイザー
山本 昇平
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
自己紹介:並木
•  Photon運営事務局の「並木」です •  ゲーム業界に関わり始めたのは ここ数年です… •  ずーっと通信、ネットワークと 関わってきました –  最初は組込み開発者として携帯電話や Bluetoothプロトコルスタックを作ってました –  GMOクラウドに入社してからは、主に専用サーバーのホ
スティングサービス開発に従事 自己紹介:山本
•  Photon運営事務局 山本昇平 •  Photonのエンジニアとして、 サポート業務から営業・イベント まで幅広く活動中 •  Oculus Ri3・Gear VRに傾倒中 •  趣味はアニメ鑑賞 アジェンダ
• 
• 
• 
• 
• 
• 
協力・対戦ゲームの市場感 マルチプレイのゲームを作るには Photonのご紹介 PUNのご紹介 PUN 1.5xを使ったMecanim同期デモ Photonの最新情報 協力・対戦ゲームの市場感
マルチプレイゲームの数
2013/8
2014/2
2015/2
• 
• 
iOS
21
40
59
Android •  単純にマルチプレイか
45
どうかの判断で見ると、
両プラットフォームで増
45
加傾向 62
日本の週間ランキング上位100位の
アプリをマルチプレイゲームかどうか
カウント 弊社調査による •  直近では半数以上に
なっている 協力・対戦の割合
iOS
協力 対戦 両方 •  どちらのプラットフォー
2014/2
1
6
33
ムも、協力プレイだけの
2015/2
ゲームというのは少な
5
24
30
Android
2014/2
2015/2
い •  日本においても対戦
協力 対戦 両方
ゲームは増えてきてい
1
19
25
る 6
27
29
簡単に市場感のまとめ
•  もう言う間でもないですが… 協力・対戦ゲームの市場は盛り上がってます •  協力はもちろん、対戦も増えてます •  マルチプレイという要素はスタンダードに マルチプレイのゲームを作るには
マルチプレイって…?
•  複数のプレイヤーが同時に同じゲームを楽し
むこと •  プレイヤー同士を繋いでデータのやりとりが
必要なので、リアルタイムに情報の同期を行
う必要がある 同期すべきデータ
•  ゲームの内容にはよりますが… –  各キャラクタの位置・状態 •  プレイヤー、敵、その他いろいろ… –  イベント情報 •  キャラクタ同士の衝突、攻撃とか… –  ゲーム全体の状態 •  ゲームの進行状態、残り時間、ボスキャラの状態… キャラクタの位置・状態
•  全プレイヤー内のキャラク
タの位置や状態は同期して
いないとだめ •  Unity的な言い方をすれば、
各インスタンスのTransform、
Animatorのステータスを同
期させる •  あまり意識せず、自分のイ
ンスタンスと同様に同期し
ているのが理想 Player A
Player B
Player A
同期
同期
Player A
Player B
Player B
イベント情報
•  ゲームの重要な要素 •  よくあるのは衝突判定
の結果とか •  イベントを誰が発生さ
せるのかとか、何を送
るのかとかをよく整理し
ておく必要がある 通知
Player A
通知
AJack
Player B
Enemy
Player A
Player C
ゲーム全体の状態
•  同じゲームをしている人
すべてが共有すべき情
報 •  例えば、ゲームの進行状
態とか、残り時間とか •  レイドバトルのような場合
は敵キャラの状態とかも
ここで管理する方法も Stage: B Remain Pme: 0:36 Boss HP: 89 Boss
Player B
Player A
Player B
Player C
Player C
Player A
どこで処理を実装するか
•  日本のディベロッパーは、ソーシャルゲーム
の癖?でついサーバー側で…と考えがちです
が、なるべくクライアント側で実装を勧めます •  サーバー側でなんでもやると、通信のタイム
ラグやサーバーの負荷を気にしたりとか、結
構大変だったりします マルチプレイゲームのまとめ
•  肝はデータの同期 •  同期させる対象、事象を整理しておく •  送信元や送信先、内容、頻度などを考えて、そ
れぞれに適した同期の方法を決める •  ゲームを始めるまでのロビーやマッチメイキング
のお話もありますが、それは別の機会に…
Photonのご紹介
Photonとは
•  先ほどお話したマルチプレイ
を実現するために必要な機能
を一通り持っているツール •  サーバーとクライアントSDKを
セットで提供 •  クライアント(=プレイヤー)間の
通信を簡単に実現するための
システム •  サーバーは接続性を確保す
るためのもので、基本的に処
理を行うのはクライアント Photon
SDK
SDK
SDK
Client
Client
Client
Photonでできること
•  いっぱいあるんですが…ポイントは リアルタイム通信 に必要な機能に絞っている •  ストレージとかリーダーボードとかそういう機
能は持っていません Photonの主な機能
•  ロビー –  名前付ロビー –  マッチメイキング –  プレイヤー検索 •  ルーム –  人数制御・表示制御 –  カスタムプロパティ •  同期関連 –  オブジェクト同期 –  イベント通知 –  RPC (PUN) •  WebHooks/WebRPC •  オフラインモード Photonの特徴
•  サーバー経由なので接続性が高い –  P2Pにありがちな問題は発生しない •  独自技術による信頼性と低レイテンシーの両方を確
保 •  クロスプラットフォーム対応で異なるプラットフォーム
間でも利用可能 •  UnityからはAsset Storeからダウンロードするだけで
SDKの利用が可能 –  詳細は後ほどご案内します Photonの開発メンバー
•  開発元はドイツ・ハンブルクの Exitgames社
•  トップもエンジニアのエンジニア集団
•  World Golf Tourの ノウハウを Photonに活用
Photonのラインナップ
サーバー構築・運用が不要なクラウドサービス
クラウド系基本サービス、迷ったらまずはこれ
ターンベース、低トラフィック向け
Unity向け、サーバー・機能はRealPmeと全く同等
チャットに特化
サーバーにインストールして使うミドルウェアサービス
PUNのご紹介
PhotonのNaPve SDK
•  クロスプラットフォームでどのプラットフォーム
でも基本的には同じ形のAPI •  Photonのすべての機能を使えます –  ロビー、マッチメイキング、ルーム作成・入室 –  イベント発生、受信処理 PUNとは
•  Photon Unity Networkingの略 •  NaPve SDKをベースにPhotonをUnityで使いやす
い形にしたAPI (NaPve SDKの上位API) •  Unity Networking互換で移行も容易 •  サーバーはRealPmeと全く同等(というかそのも
の) •  Asset Storeからインポートするだけで利用可能 PUNならではの特徴
•  簡単なクラス構造 •  簡単なオブジェクト同期 •  RPCによる簡単なイベント同期 簡単なクラス構造
•  NaPve SDKではSDKのクラスを派生させて、そ
こに必要なコードを追加して、メインクラスか
ら呼び出す、という構造 •  PUNでは接続処理とかはStaPcなクラスのメ
ソッドを呼び出すだけで簡単にできます •  後のデモで簡単にお見せします 簡単なオブジェクト同期
•  NaPve SDKではオブジェクト同期もイベント発生・受信
で処理するので、簡単ながらコードが必要 •  PUNではインスタンスにクラスをアタッチするだけで
Transform/RigidBodyを同期させることが可能 –  コーディングなしでクラスの設定だけでできます –  シリアライズのコードを書けばそれ以外のデータの同期も
簡単にできます •  同期のタイミングはPUNが面倒を見るので勝手にやっ
てくれます
RPCによる簡単なイベント通知
•  通常のイベント通知でも難しくなく利用できま
すが、RPCならより簡単に利用可能 •  RPCなら、[RPC]属性を付けたメソッドを作成し
て、そのオブジェクトに対してRPCメソッドでメ
ソッド名を名前で渡して呼び出すだけ PUNで簡単にオンラインゲーム
•  最初にご説明したオンラインゲームに必要な
機能はすべてそろってます –  キャラクタの位置・状態 : オブジェクト同期 –  イベント情報 : イベント通知、RPC –  ゲーム全体の状態 : ルームのカスタムプロパティ •  ロビーやマッチメイキングもあります PUN 1.5xを使ったMecanim同期デモ PUN 1.5x
•  2014年12月にPUNが1.50として大きくバージョ
ンアップ •  Mecanimにもネイティブ対応! –  同期するComponent別にクラスが分割 –  MecanimのAnimatorにも対応して、コーディング
なしでステータス遷移に対応 実際に利用したプロジェクトのデモ
•  PUN 1.5xとユニティちゃんを使ってキャラクタ
の動き・状態を複数台で同期させるデモ •  接続処理部分以外はほとんどコーディングな
しでできていています •  本日はあまりお時間がないため、出来上がっ
たプロジェクトをベースにご説明します Assetのインポート
•  ユニティちゃんとPUNの
Assetをインポート •  PUNは無償のFree版を
使ってください フォルダ準備・スクリプトコピー
•  自前で作るものを置く
フォルダを作成 –  Demos •  Resources (Prefab置き場) •  Scene (シーン置き場) •  Scripts (スクリプト置き場) •  PUNのデモを削除 シーン準備・Prefab化
•  ベースとなるシーンを開く –  UnityChan/Scenes/
LocomoPon •  ユニティちゃんをPrefab化 –  Hierarchyのunitychanを
Demos/Resourcesフォルダ
へ持っていってPrefab化 •  Hierarchyのunitychanは
削除 Photon Viewなどの追加・設定
•  Prefab化したunitychanに
Photonのスクリプトを追加 –  Photon View –  Photon Transform View –  Photon Animator View •  Photon ViewのObserved Componentsに下記2つを追
加 –  Photon Transform View –  Photon Animator View Photon Transform Viewの設定
•  下記2つをチェック入れる –  Synchronized PosiPon –  Synchronized RotaPon •  Synchronized PosiPon設定 –  Interpolate OpPon: Lerp –  Lerp Speed: 3 •  Synchronized RotaPon設定 –  Interpolate OpPon: Lerp Photon Animator Viewの設定
•  Animatorのパラメータが自
動的に表示されます •  パラメータの同期を継続的
に行うか不連続で行うか設
定できる •  基本的に数値的なものは
ConPnuous、Bool型は
Discreteで •  ここのパラメータは画面で
PUNの接続設定
•  PUN Wizardを開いて、
接続設定を行う •  今回はPhoton RealPme
を利用、取得したAppID
を設定 •  リージョンはjpを設定 接続スクリプトの作成
•  接続スクリプトをつける
オブジェクトを作成 –  PhotonController •  接続用スクリプトを新規
に作成 –  RandomMatchmaker.cs •  エディタで開く 接続スクリプト:冒頭部分
•  StaPcなPhotonNetwork
クラスで接続制御 •  ConnectUsingSefngs()
メソッドでPUN Wizardで
設定した情報で接続 public class RandomMatchmaker : MonoBehavior {
public GameObject photonObject;
void start()
{
}
PhotonNetwork.
ConnectingUsingSettings("0.1");
接続スクリプト:ルーム入室・作成
•  Photonへの接続が完了すると
OnJoinedLobby()が呼ばれる •  JoinRandomRoom()で入室 –  既存のルームにランダムに入
室 •  OnPhotonRandomJoinFailed()
は入室失敗時のコールバック •  入室に失敗=ルームがない、
ということになるので、
CreateRoom()でルームを作成 void OnJoinedLobby()
{
PhotonNetwork.JoinRandomRoom();
}
Void OnPhotonRandomJoinFailed()
{
PhotonNetwork.CreateRoom(null);
}
接続スクリプト:ゲーム開始
•  unitychanのPrefabを
Photonを使ってインスタ
ンス化 •  自分のインスタンスだ
けカメラのスクリプトを
有効化 void OnJoinedRoom()
{
PhotonNetwork.Instantiate(
photonObject.name,
new Vector3(0f, 1f, 0f),
Quaternion.identity, 0
);
GameObject mainCamera = GetObject.FindWithTag("MainCamera");
mainCamera.GetComponent<ThirdPersonCamera>()
.enabled = true;
}
接続スクリプト:設定
•  接続のためのオブジェ
クトに作成したスクリプ
トを追加 •  スクリプトのPhoton Objectにunitychan Prefabを設定 ユニティちゃんスクリプト変更
•  ユニティちゃんのスクリ
プト UnityChanControlscript
WithRigidBody.cs を編集 ユニティちゃんスクリプト変更
•  継承元を Photon.MonoBehavior
に変更 •  FixedUpdate()メソッドを
変更 –  自分自身のインスタンス
でない場合は何もしない Public class UnityChanControlscriptWithRigidBody : Photon.MonoBehavior {
...
void FixedUpdate()
{
if (!(photonView.isMine)) {
return;
}
...
}
メインカメラの調整
•  メインカメラのThird Person Cameraスクリプ
トを最初の段階では無
効化する •  自分のインスタンスに
合わせて動かすために
スクリプトで有効化する シーンを保存して完成!
•  完成したシーンを自分
で作ったフォルダ内に
保存 •  これで完成! 実行してみましょう! デモまとめ
•  Mecanimを使ったキャラクタの同期が、スクリプト
なしでできます! •  接続処理はさすがにコーディングが必要ですが、
PUN内のデモにも接続処理のサンプルはいっぱ
いあるので、そちらも参考にしてください –  今回のベースは Demos/MarcoPolo-­‐Tutorial/RandomMatchmaker.cs Photonの最新情報
今年のアップデートは…
•  Photon Serverメジャー
バージョンアップ! –  V3 -­‐> V4 VOICE
•  Photon Voice リリース! Photon Server V4
• 
• 
• 
• 
HTTP(S)サポート Turnbasedの新機能をServerでも実装 アプリ構造をリニューアル カウンタ関連リニューアル HTTP(S)サポート
•  トランスポートとしてHTTP(S)が利用可能に •  HTTP(S)しか通らないような厳しいネットワーク環
境でも利用する事が可能 •  もちろん従来からのUDP/TCP/Websocketもサ
ポート •  HTTP(S)しか通らない環境向けにご利用ください Turnbasedの新機能実装
•  Turnbasedで実装されていた新機能 –  Webhooks/WebRPC •  イベント発生時に外部のWebサービスを呼び出す •  これによりPhoton Serverに手を入れることなしにサーバー
側のロジックカスタマイズも可能 –  クラウドセーブ •  ルームの情報をサーバーに一時的に保存する機能 •  ルーム全員が抜けてもゲームの状態をキープできる
アプリ構造のリニューアル
•  Lite/LoadBalancingの2つから、 MMO/LoadBalaningの2つに •  Pluginサポート –  今まではカスタマイズする際にはアプリ全体をカスタ
マイズする必要があったが、Pluginの開発だけでカス
タマイズの対応も可能に –  PluginならPrivate Cloudへの移行も容易 –  今まで通り全体のカスタマイズもできます カウンタ関連リニューアル
•  いままでは独自のカウンタとWindowsのパ
フォーマンスカウンタを併用 •  V4よりパフォーマンスカウンタに集約 •  Windows標準機能を柔軟に利用することが
可能 •  いままでのDashboardは廃止 Photon Voice
• 
• 
• 
• 
• 
• 
クラウド系の新サービス RealPmeをベースに音声通信の機能を搭載 ルームベース、APIもRealPmeに準拠 1対1のほか、グループでの通話も対応 プッシュトーク、継続的な通話のいずれにも対応 CODECにはTeamSpeakを採用 VOICE
リリーススケジュール
•  Photon Server V4 –  RC(Release Candidate)1が近日リリース予定 –  正式版は夏前〜夏頃リリース予定 •  Photon Voice –  5月にEarly Access開始予定 –  正式版は夏前リリース予定 •  テスト版へのアクセスに興味がある方はお問い
合わせください 国内利用事例紹介
聖剣伝説 RISE of MANA
• 
• 
• 
• 
ゲームの種類 3DアクションRPG 同時プレイヤー 最大30名 対応デバイス iOS,Android リリース元
SQUARE ENIX •  聖剣伝説RISE of MANAのレイドバ
トルにて、Photon Serverが利用さ
れています! •  リアルタイム通信の部分について
は非常に簡単に実装できました!
とコメントいただいています イメージを表示できません。メモリ不足のためにイメージを開くことができないか、イメージが破損している可能性があります。コン
ピューターを再起動して再度ファイルを開いてください。それでも赤い x が表示される場合は、イメージを削除して挿入してくださ
い。
©2014 SQUARE ENIX CO., LTD. All rights reserved.
62
ファミスタ ドリームマッチ
• 
• 
• 
• 
ゲームの種類 対戦野球ゲーム 同時プレイヤー 2名 対応デバイス iOS, Android リリース元 Bandai Namco Entertainment •  あのファミスタがスマホになって、
ネットワーク対戦に対応! •  リアルタイム対戦の部分で
Photon Serverを利用されていま
す リトルノア
• 
• 
• 
• 
ゲームの種類
同時プレイヤー
対応デバイス リリース元 RTS 最大5名 iOS,Android BlazeGames •  クライアント間通信部分にPhoton Serverを利用されています クロススピリッツ
• 
• 
• 
• 
ゲームの種類
同時プレイヤー
対応デバイス リリース元 RTS 最大5名 iOS,Android Trifort •  クライアント間通信部分にPhoton Serverを利用されています トゥモローアイランド
• 
ゲームの種類 無人島体験アドベンチャーゲーム •  同時プレイヤー 最大5名 •  対応デバイス iOS,Android •  リリース元 Trifort •  無人島を体験できる、MMO •  クライアント間通信部分にPhoton Serverを利用されています テラバトル
• 
• 
• 
• 
ゲームの種類
同時プレイヤー
対応デバイス リリース元 パズルRPG 最大3名 iOS,Android MISTWALKER •  協力プレイの部分において、
Photon RealPmeを利用されてい
ます 最後に
今後のイベント予定
•  4/23(木)、4/27(月)にワークショップ開催 –  弊社(渋谷・セルリアンタワー)にて –  今後も定期的に開催します •  5/19(火)にPhoton勉強会開催予定 –  LT登壇者も募集しております •  6/中旬に企業向けセミナーも開催予定 –  詳細は決まり次第お知らせします お問い合わせ
•  ブース出展(Room1前)しておりますので、 お気軽にお立ち寄りください •  メールアドレス –  [email protected] まとめ
•  マルチプレイのゲームは難しくありません! •  Photonを使えばより簡単に作れます •  すべて無料からお使いいただけるので、ぜひ
お試しください! ありがとうございました!
[email protected]