レポート一覧
- ここが変わる!Unity 5のスマホ開発 ~アセットバンドル、ビルド、プラグイン~
- コロプラUnity 5プロジェクト ~白猫プロジェクトにおけるUnity 4からUnity 5への移行事例~
- Unity 5グラフィックス機能使いこなしガイド
- Rederer Massive Amount of Objects in Unity
- 協力・対戦ゲームを支えるPhotonの最新情報、Mecanimにネイティブ対応したPUNの実力協力・対戦ゲームの市場感
- ゲーム開発の始め方、育て方、終わらせ方~「Game Dev Heroes」における生産性チャレンジ~
講演ファイル
アジェンダ
- マルチプレイのゲームを作るには
- Photonのご紹介
- PUNのご紹介
- PUN1.5xを使ったMecanim同期デモ
- Photon最新情報
マルチプレイについて
協力・対戦ゲームの市場感
- マルチプレイゲームの数
- 単純にマルチプレイかどうかの判断で見ると両プラットフォームで増加傾向
- 直近では半数以上になっている
協力・対決の割合
- どちらのプラットフォームも協力プレイだけのゲームというのは少ない
- 日本においても対戦ゲームは増えてきてる
##まとめ
- 市場は盛り上がっている
- 協力はもちろん、対戦も増えている
- マルチプレイという要素はスタンダードに
マルチプレイのゲームを作るには
マルチプレイって?
- 複数のプレイヤーが同時に同じゲームを楽しむこと
- プレイヤー同士をつないでデータのやり取りが必要
同期すべきデータ
- 各キャラクタの位置、状態
- イベント情報
- ゲーム全体の状態
- etc.
キャラクタの位置・状態
- 全プレイヤー内のキャラクタの位置や状態は同期していないとダメ
- Unity的な言い方をすれば各インスタンスのtransform,animatorのステータスを同期させる
- イベント情報
- ゲームの重要な要素
- よくあるのは衝突判定の結果とか
- イベントをだれが発生させるのかとか
- ゲーム全体の状態
- 同じゲームをしている人すべてが共有すべき情報
- たとえば、ゲームの進行状態とか、残り時間とか
- レイドバトルのような場合は敵キャラの状態とかもここで管理する方法も
どこで処理を実装するか
- 日本のディベロッパーは、ソーシャルゲームの癖でついサーバー側でと考えがちですが
なるべくクライアント側で実装を勧めます - サーバー側で何でもやると、通信のタイムラグやサーバーの負荷を気にしたりとか、
結構大変だったりします
マルチプレイゲームのまとめ
- 肝はデータの同期
- 同期させる対象、事象を整理しておく
- ゲームを始めるまでのロビーやマッチメイキングのお話もありますが、別の機会に
Photonのご紹介
Photonとは
- マルチプレイを実現するために必要な機能を一通り持っているツール
- サーバーとクライアントSDKをセットで提供
- クライアント間の通信を簡単に実現するためのシステム
- サーバーは安全性?を確保するためのもので、基本的に処理を行うのはクライアント
Photonでできること
- リアルタイム通信
- ストレージとかリーダーボードとかそういう機能は持っていません
- 主な機能
- ロビー
- 名前付きロビー
- マッチメイキング
- プレイヤー検索
- ルーム
- 人数制御・表示制御
- カスタムプロパティ
- 同期関連
- オブジェクト同期
- イベント通知
- RPC(PUN)
- WebHooks/WebRPC
- オフラインモード
- ロビー
特徴
- サーバー経由の接続なので接続性が高い
- 独自技術による信頼性と低レイテンシーの両方を確保
- クロスプラットフォーム対応で異なるプラットフォーム間でも利用可能
- UnityからはAssetStoreからダウンロードするだけでSDKの利用が可能
PUNのご紹介
- PhotonのNative SDK
- クロスプラットフォームでどのプラットフォームでも基本的には同じ形のAPI
- Photonのすべての機能を使えます
- Photon Unity Networkingの略
- Native SDKをベースにPhotonをUnityで使いやすい形にしたAPI
- Unity Networking互換で移行も容易
- サーバーはRealtimeと全く同等
- Asset Storeからインポートするだけで利用可能
PUNならではの特徴
- 簡単なクラス構造
- SDKのクラスを派生させて、そこに必要なコードを追加して、
メインクラスから呼び出す、という構造
- SDKのクラスを派生させて、そこに必要なコードを追加して、
- 簡単オブジェクト同期
- Native SDKではオブジェクト同期もイベント発生・受信で処理するので
簡単ながらコードが必要 - PUNではインスタンスにクラスをアタッチするだけで
Transform/Rigidbodyを同期させることが可能 - 同期のタイミングはPUNが面倒を見るので勝手にやってくれます
- RPCによる簡単なイベント通知
- RPCなら[RPC]属性を付けたメソッドを作成して、
そのオブジェクトに対してRPCメソッドでメソッド名を名前で指定するだけ
- RPCなら[RPC]属性を付けたメソッドを作成して、
- Native SDKではオブジェクト同期もイベント発生・受信で処理するので
PUNで簡単にオンラインゲーム
- キャラクタの位置・状態:オブジェクト同期
- イベント情報:イベント通知、RPC
- ゲーム全体の状態:ルームのカスタムプロパティ
PUN1.5xを使ったMecanim同期
- Mecanimにもネイティブ対応
- 接続処理部分以外はほとんどコーディングなしでできています
- 実際に10分程度のコーディングで動作するデモを見せていただきました
まとめ
- 接続処理はさすがにコーディングが必要ですが、
スクリプトがほとんどなくても同期できる