chronote

ゲーム創作活動の備忘録、日々の雑記など。

制作進捗10 ~光子に導かれ~


Photon のドキュメントを翻訳してると、ちょくちょく「光子」がでてくるのでつい・・・

今回は、PhotonUnityNetwork(以下PUN)の全体像を把握しつつ、
実際にマッチングしてバトルを開始するまで、を作ってみました。


ドキュメント

ざっくりと全体像を把握するのであれば、Photon Realtime の Reference 項目を
順に眺めるとよさげです。doc.exitgames.com


PUN 用のまともなリファレンスがぱっと見当たらなかったのですが、
検索すると PUN 日本語版のリファレンスが置いてあったので、
細かい使い方はこちらでなんとか把握できるかと思います。

photoncloud.jpphotoncloud.jp

http://photoncloud.jp/pdf/PhotonNetwork-Documentation_ja.pdf

例えば、特定のメソッドを使った結果のコールバックはこれ、
といった関連性を調べるには、日本語の正確な情報はここから得られます。
各種プロパティの説明もあるので、ここを検索するのが早いですね。


ランダムマッチングしてみる

Photon サーバに接続する方法の1つとして、簡単なやり方。

PhotonNetwork.ConnectUsingSettings("v0.1");

これを呼ぶだけ。接続完了/失敗のコールバックは次のとおり。

// [Callback] Photonサーバに接続完了
void OnConnectedToMaster();
// [Callback] Photonサーバに接続失敗
void OnFailedToConnectToPhoton(DisconnectCause cause);

コールバックは Photon.MonoBehaviour を継承した GameObject にて実装しました。

続いて、接続が完了している状態で何らかのボタンを押したら
マッチングを開始する、という流れを作りました。

//-------------------------------------------------------------------------
// ランダムマッチルームへの参加を試みる
PhotonNetwork.JoinRandomRoom();    // 何らかのトリガで呼ぶ

//-------------------------------------------------------------------------
// [Callback] ルームへの参加に失敗
public virtual void OnPhotonRandomJoinFailed()
{
     // 新たなルーム作成を試みる
     PhotonNetwork.CreateRoom(null, new RoomOptions() { maxPlayers = 2 }, null);
}

//-------------------------------------------------------------------------
// [Callback] ルーム作成に失敗
public virtual void OnPhotonCreateRoomFailed();

//-------------------------------------------------------------------------
// [Callback] ルームへの参加に成功
public virtual void OnJoinedRoom();

まずは、すでにルームがあることを想定して JoinRandomRoom() を行います。
そのまま参加できれば、OnJoinedRoom() が呼ばれて準備完了です。
あとはどこかの Update() などで対戦相手が揃っているか人数確認を行い、バトルへ移ります。

ルームへ参加できなかった場合、自らがマスターとなるルームを作成するために、
CreateRoom() を呼びます。
成功すれば同じく OnJoinedRoom() が呼ばれ、失敗すれば
OnPhotonCreateRoomFailed() が呼ばれるようです。(失敗動作は未検証)

例外処理など省いていますが、これだけでランダムマッチングができてしまいました。


条件マッチングもあるよ

完全ランダムではなく、ある程度の条件マッチングがしたい場合もありますが、
ちゃんと方法が用意されています。

CreateRoom()JoinRandomRoom() にプロパティを渡すことで、条件指定が可能です。
例えば、"map" : "3" で遊ぶ人を募集、といった"キー" : "値"が一致する相手、といった雰囲気です。

他にも、自分で条件演算子をカスタムできる SQLロビー という指定方法があります。
まだ必要ではないので触っていませんが、これを使えば、レベルがX以上Y以下の人を募集、
といった階級マッチングができますね。

さらに、フレンド検索をして、オンラインで見つかった相手だけが見えるルームを作り、
フレンドマッチングを行う、といったこともできるようですが、詳細は必要になってから調べます。


あとがき

あぁ、もうゴールデンウィークも残り2日。せめてこの期間中に対戦実装は終わらせたい。。
というわけで、次はオブジェクトの同期周りを対応していきます。

制作進捗9 ~通信対戦の検討~

 

今回は、UNET について追いかけているうちに、それほど情報が出てこなくて、

あらためて他の通信手段を検討したらそちらの方が都合がよかった、

という備忘録です。。

 

 

UnityNetwork - MasterServer

まずは Unity オリジナルの通信機能をおさらい。


ここでいう MasterServer というのは、

Client/Server 通信における、マッチング用のロビーのことです。

Server 役となるホスト端末はこのロビーに接続し、部屋を作ります。

クライアント端末は、ロビー内の空き部屋を検索し、

その部屋のホストである Server に接続します。


Unity がデフォルトで用意しているロビー接続先はテスト用途に使えます。

(製品版で使ってはいけないのかは不明)

(テストでどの程度の負荷に耐えられるのか、なんてスペックも不明)

アドレス指定により自分で用意したサーバが使えるので、

最終的にはこちらの方法を利用することになりますかね。

・・・つまり、Unity の Network 機能をそのまま使うとなると、

自前でサーバを立てる必要があるため、当然ですが費用と手間がかかるわけですね。

参考

 

 

UNET

日本語の文献が無くて正確な意図がわかりませんが、

旧 UnityNetwork をラッピングして使いやすくしたもの?


登場経緯も覚えていませんが、ホスティング需要がたくさんあるし、

サービスとして内包したら会社の柱になるんじゃ?という空気なのかなと。

実際、オフラインゲームでできることが限られていたり、

チープなゲームでも、対戦できれば意外と熱かったり。

オンライン要素導入の壁が低くなることは良いことです。


6月の Unity5.1 リリースで公開予定(現在β中)ということで、期待は膨らむ一方、

使い方の詳細がわからず、時間が過ぎていく・・・

一応、ドキュメントは Pro βフォーラムにて公開されています。

forum.unity3d.com

 

ドキュメント内にサンプルの項目がいくつかあるので、

それが公開されれば勢いよく実装例が出てきそうな気がします。

しかし今回は時間の都合で UNET 対応を見送り、

PhotonUnityNetwork(以下PUN)を採用することにしました。

(6月にはゲームが完成していないといけない・・・!)


といっても、Unity5.x で旧Network 機能を削除する予定、と書いてあるので、

いずれは 通信系アセットは、仕様変更をせざるを得ないことになるでしょう。

(例えば、新しい iOS に対応するには Unity5.x ビルドが必須で、

 そのバージョンでは UNET しか使えない、といった状況が今後あり得るのでは?)

 

 

Photon Unity Network(PUN)

今となっては採用事例が多く、有名なこちら。

 

自前サーバーを用意しなくて済み、自前実装すべき仕組みも内包されているので、

(技術研究が目的でなければ)使わない手はないサービスです。

個人用途なら雰囲気的に

  1. 導入テストはフリー版で始める
  2. サービス開始前に「15500円で買い切り」購入(PUN+)
  3. 運用中、サーバアクセスが一定数を超えたら月額15300円」プランにのりかえ

となります。


とりあえず買い切りで気楽に初められるのはいいですね。

3段階目になった時点で、運用経費を捻出する仕組みが必須となります。

このアプリはアクセス数これくらいで、こんな風にスケールアップした、

といった具体例があると、さらにいいですね~。

スライドシェアなんかに紹介事例が多々ありますので、

そちらもチェックすると参考になります。

 

参考

doc.exitgames.com

 

 

まとめ

 

  1. 今すぐオンラインゲーム作りたいなら、迷わず PUN オススメ。
  2. 6月の Unity5.1、9月の Unity5.2(予定)まで待てるなら、UNET も視野に。
  3. 全部自作しないと気がすまない!という方は、UnityNetwork+自前サーバ。

 

自分の場合、手が空いてる期限が6月中旬までなので、ちょっと待てませんでした。

ようやく方針が決まったので、今後は PUN を使った通信対戦を、実装していく予定です。

制作進捗8 ~煩悩をふり払え~

 

ひさびさに、まったりした週末でした。

自宅にこもって合宿したおかげで一気に作業が進みました。

 

プログラムは偉大である

いわゆるトランプカードを使ったボードゲーム風、にするつもりなので、

カード・山札・手札・場 といったオブジェクトを作り、

カードのドロー、ドラッグで場に配置、カード配置位置にスナップして召喚、

ターン進行にて1マスずつ進軍、といったロジックを組み上げました。

 

コンポーネント(機能)単位で細かくスクリプトを作って、

オブジェクトに機能をアタッチ(割り当て)してモノを組み上げる、

というのがUnityでの基本概念ですが、

アナログゲームやオールドゲームのように「決まった動きを繰り返す」ロジックは、

プログラムで解決する必要がありますね。(アセット購入で補うのもアリ)

 

ゲームエンジンの登場でプログラマーは要らなくなる、

なんてことにはならないわけですが、コンポーネントを汎用的に作れば作るほど、

「進んでゲームを組み上げてくれる人」が増えるのかもしれません。

そこは他のゲームエンジンも同じで、プログラマーの腕しだい、なことは確かです。

 

ネットワークサービスの検討中

話が脱線しましたが、今後は対戦要素のための、ライバルの実装を行う予定です。

その先は、P2Pによるマッチングと通信対戦、になります。

 

これを見越して、どんな通信サービスがあるのか、を調べてみましたが、

マッチング系のリアルタイム通信は PhotonUnityNetwork が独占状態で、

サーバーバックエンド系(ランキング/実績/メール/プッシュ通知/データ管理など)は

競合がひしめいているようですね。

個人的には、マッチングで使える Photon の運用で月額費が結構かかりそうなので、

ランキングなどコミュニティ要素は、費用が抑えられそうな LobiSDK を検討中です。

 

基本無料でアプリをばらまいた場合、確かにユーザー数は増えると思うのですが、

サーバーへのアクセスが増えると契約費用が跳ね上がりますので、

個人レベルだとむしろ、ユーザー数を絞って適正値を保つ仕組みにしないと、

一瞬でサービス停止せざるを得なくなったり、経費を上回る課金要素を・・・

なんてことになりかねません。とはいえ、

個人で人様のお金を扱うアプリは作りません。(サポート保証できないので)

 

今回は1VS1のオンライン対戦を実現するために作っているので、

すでに構想はできていますが、ここはある程度工夫しないといけませんね。

 

UNET について

Unite2015 Tokyo にて、Unity の新ネットワークシステムの続報がありました。

http://japan.unity3d.com/unite/unite2015/files/DAY2_1700_room1_Sean.pdf

  • Unity5.1β にて公開開始(2015/4/18~ 公開中)
  • まずは P2P の MO 通信のしくみから整備していく?
  • 旧ネットワーク機能はいずれ廃止予定

 

スライドの英単語は、機械翻訳してもまともな日本語にならないので意訳ですが;

それとホビーユーザーに需要が無いのか、

UNET に関するレポートはどこにも見当たらず・・・

5.1β はもうダウンロードできるので(Proユーザーのみ)、

先行してドキュメント周りだけでも読んでおこうかと思います。

これでマッチングなどが作れそうなら UNET を採用してもよし、

ダメそうなら Photon に逃げられます。

 

なお、噂によると Unity 5.1 正式リリースは6月、

5.2 リリースは9月予定らしいので、

Pro ユーザーは2ヶ月ほど早く触れられることになります!