協力・対戦ゲームを支える
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]
© Copyright 2026 ExpyDoc