FreelyApps

個人によるアプリ開発の日記です。アプリの収入だけで生活できるようになるのが目標です。UnityでAndroid向けのゲームアプリを作成しています。


    ブログを
    https://freelyapps.net/
    に移転する予定です。
    リンク切れがある記事はこちらに移動した可能性もあります。

    タグ:ネットワーク

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity5.3から5.4になったときにNetworkMatchつまりマッチメイキングの処理の呼び出し方法が変更されました。5.3以前の処理を書いている場合は多少修正が必要になると思います。
    書き直すのは面倒ですが、修正されているところ(マッチングのフィルタリング)があるのでやってみる価値があります。
    34
    左が5.3で右が5.4のUnityEngine.Networking.Matchのクラスの一覧です。5.3では~Requestと~Responseがたくさんあります。これらはマッチングを行うときのメソッド(NetworkMatch.CreateMatchなど)に渡す情報とマッチング処理を行ったときの結果を返すためのものです。
    5.4ではマッチングを行うときのメソッドに直接値を渡す方式のみになったため、~Requestがなくなったようです。(5.3では~Requestを渡す方法と直接値を渡す方式がありました。値を渡す方式だけ生き残ったということです。)
    ~Responseは元々冗長なクラスでした。~Responseは成功したかどうかとサーバーでのエラーについての情報とそれぞれのマッチング処理の情報という形式です。3つのメンバーしかないので、わざわざクラス化しなくても良いという判断で5.4でなくなったのではないかと思います。5.3のCreateMatchResponseJoinMatchResponseは同じ情報を持つのに違うクラスでしたし、メンバーもわざわざ基本型で書いてありました。5.4では整理されてきれいにまとまった感じです。
    あとはMatchDescMatchInfoSnapshotに変わりました。なぜ……

    5.3でCreateMatchなどを使っていた場合は、5.4のCreateMatchに合わせる必要があります。呼び出し引数が変わっているのでその対応をすれば動くはずです。いくつかのパラメータは空文字や0で無効にして呼ぶことが多いでしょう。
    requestDomainという値が重要でこれが同じ値のものとマッチングするようになっています。この値が違うとマッチングしないようになっているので、通信する内容が変わった場合は値を変えておくと問題が起きません。アプリのバージョンとかと同じように通信のバージョンを管理しておくと良いと思います。

    以前はrequestDomainに対応しているような機能があったのですが、うまく機能してなくて互換性がない状態でマッチングが起こっていました。当然、通信が発生したときに情報が解釈できずエラーになって失敗します。5.4からはこれが動いているというのを確認しました。(Windows、Mac、Android、iOSにて)
    これがあるとUnity Multiplayerに変更のあるアプリのバージョンアップを行うことができます。バージョン違いのものを住み分けることで共存できます。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    ナポレオンというトランプゲームができるアプリ『トランプ・ナポレオン』にはオンラインでの対戦機能があります。当初からあったのではなくバージョン2.0のときに入れた機能です。Unity Multiplayerが導入されオンラインマルチプレイが簡単になったということで対応をしました。

    Unity Multiplayerによりマッチングの対応や同期の実装が非常に簡単になりました。コードを書かなくても位置の同期をするといったことも可能ですごく便利です。
    通信を用いた対戦を実装するのはいくらAPIの呼び出しが楽になっても簡単ではありません。それは切断時の対応やエラーの問題です。これをどう対応するかはアプリによるので大変なのです。オンラインゲームはどう作れば良いのか調べたり、Unityのドキュメント(作ったときは英語だった)を読んだりして試行錯誤があったので40時間近くはかかったと思います。一度経験すればそれ以降は楽になると思います。
    あとはテストが大変です。Unityのプロジェクトをコピーして、複数のプロジェクトを同時に起動すると1つのPCで通信できます。これはウィンドウが多くなるので見づらいですが、Unity Editorでログが見れたり、インスペクターが使えるのでデバッグに向いています。テストを実機で行うとできることはわかっているのですが、 テンションがあがります。独立した端末同士での対戦ができると、世界中でも対戦できることになるというのが実感できて、ちょっと夢が広がります。

    トランプ・ナポレオンに通信対戦機能が完成したときはよくできたと思っていましたが、実際にはあまり遊ばれないようです。2~5人のプレイヤーが集まれば遊べますが、ナポレオンは5人で遊ぶゲームなので足らないとAIと対戦することになります。

    現在のアクティブユーザーがメニューで通常のAI戦とオンライン対戦のどちらのボタンをクリックしているかの統計を見ると20~30倍程度の差があります。更にマッチングが完了し対戦に行くのは、もちろんメニューを選んだよりもかなり少ないです。
    tn-menu-compare-graph

    ただユーザーの数で比べてみると、差は10倍程度になります。
    それなりの数のユーザーが選んでいるにも関わらず通信対戦のメニューをクリックした総数は少ないように思います。通信対戦を選んでみるユーザーはいるが、マッチングせずにそれ以降選ばなくなっているのではないかと考えられます。

    すぐにマッチングするには相当なユーザーが必要です。2人のユーザーがマッチングには必要で、10秒は待てるとしましょう。極端な例として、マッチングが最もしにくくなるには全てのユーザーの待っている時間帯が重ならないことを考えます。1日は86400秒なので、10秒ずつユーザーがずれていれば8640人のユーザーが重ならずに配置できます。8641人目が来れば、それ以前にいるユーザーにぶつかります。全員がマッチングするには8640人に対し、相手が必要で2倍。つまり17280人がいれば、10秒待てば必ずマッチングするでしょう。

    通信対戦があるというのは利点です。これが活かせるためには多くのユーザーがいるのが前提です。アピールするために入れるというのはあるかもしれませんが、労力に見合うのか検討する必要があると思います。
    アップデートでいれるのは相当難しいですが、遊ぶ人数が増えたときに対応するというのが一番良いと考えています。(10万DLとか行ったら、喜んで入れます。)

      このエントリーをはてなブックマークに追加 Clip to Evernote
    以前の記事では、オンラインのゲームではマッチメイキング、同期、切断の3つの対応が必要だと書きました。
    現在、トランプ・ナポレオンをアップデートする予定でソースをちょっと見返しています。以前の記事ではあまり詳細まで解説していなかったので、良い機会だと思いマッチメイキングを解説してみようと思います。

    マッチメイキングにはサーバーが必要になりますが、Unity Multiplayerではそのサーバーが提供されています。そのため、サーバーの用意は不要で個人でもオンラインゲームが作れる環境があります。
    Unity MultiplayerはサービスウィンドウでUnityの各種サービスが使えるように登録をしておきましょう。これを行っておかないとエラーが発生して動きません。

    マッチメイキングにはスクリプトを書いて対応することになります。NetworkMatchを使って簡単に作ることができます。このインスタンスはNetworkManager.singleton.StartMatchMaker();のようにしてやると作られ、NetworkManagerのプロパティmatchMakerに参照が渡されます。(matchMakerははじめnullになっています。)
    NetworkMatchクラスのインスタンスが得られたら、後はそれに対して命令することでマッチする場所(ルームと呼ぶことにします。)の作成、ルームの削除、ルームへの参加、ルームからの退出、ルーム一覧の取得が可能です。
    それぞれ
    • CreateMatch
    • DestroyMatch
    • JoinMatch
    • DropConnection
    • ListMatches
    が対応します。いずれの処理も簡単に使えるものと詳細に設定ができるものが用意されています。
    CreateMatchで言うと、ルームの名前、ルームに入れる最大数、ルームの宣伝フラグ(たぶん検索に出すかということ?trueにしておけば良いらしいです。)、ルームのパスワードの4つの設定とコールバックです。CreateMatchなどの処理はすぐに終わらない非同期処理(コルーチン)なので、処理が終わったときに指定したコールバックが呼ばれる仕組みです。コールバックに処理の結果が渡されるので、それを見て適切に処理します。コールバックで特に何もしなくてもマッチングは行えます。
    詳細に設定する方では、matchAttributesというルームに対して属性をあたえることができます。この属性をListMatchesの方で指定することでルームのフィルタリングができる機能のようなのですが、残念ながら現時点では機能していません。質問したところバグだということなので、いずれ直るかと思いますが結構先のことだと思います。
    詳細版の方が良いのは設定を細かくできるためですが、面倒であれば簡易版でも十分です。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    新しいサイトの方へ引っ越しました。

    このページのトップヘ