FreelyApps

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


    アプリ『トランプ・ジン・ラミー』を公開しました。
    Android/iOS https://goo.gl/PYKFYG

    タグ:ネットワーク

      このエントリーをはてなブックマークに追加 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
    Unity MultiplayerはUnity 5.1から追加されたオンラインマルチプレイヤーなゲームを簡単に作るための仕組みです。これによって楽になったことは間違いないのですが、まだまだ発展途上という感じで実際に使われていることは多くない気がします。
    その原因の一つとしては、日本語ドキュメントの準備に時間がかかったことがあると思います。はじめはUnityの公式ドキュメント上で英語版しかなくそれを読むしかないという状況だったのです。今は「マルチプレーヤーとネットワーキング」という日本語の公式ドキュメントが公開されています。


    いくつかのブログでUnity Multiplayerについて解説されているのでリンクを載せておこうと思います。

    テラシュールブログより
    【Unit 5】Unityでマルチプレイヤーなゲームを作る入門(1)」 
    Unityについて解説している超有名なブログです。キャラクターの移動を同期するサンプルを説明されています。ちょっと試してみたい人向けの解説です。

    凹みTipsより
    Unity 5.1 から導入された新しいネットワーク機能の UNET について詳しく調べてみた」 
    公式ドキュメントの内容を日本語でわかりやすくまとめられています。Unity Multiplayerを使って作られた3D空間を歩き回れるチャットのアプリケーションを公開されていて、Unity Multiplayerを使ったデモをすぐに体験することができます。このデモのような使われ方が最もUnity Multiplayerに向いていると思います。(リアルタイムに同期して、プレイヤーは自由に出たり入ったりする)
    日本語ですが公式マニュアルの説明が元で少しレベルは高めです。

    ひよこのたまごより
    【Unity9】UNETでマルチプレイヤーなオンラインゲーム開発【UNET1】」 
    こちらの解説動画を日本語で記事に起こしたもののようです。1つの記事だけでなく色々なトピックを上げられています。位置の同期のやり方から始まり、ゲームオブジェクトの生成・破棄の同期、マッチメイクといった内容が解説されています。
    動画が英語なのが最大の障害ですが、それ以外は丁寧に段階を追って進んでいくため習得しやすいと思います。手を動かしつつゆっくりと習っていく感じです。


    上記の記事の気にいったものでもUnity Multiplayerのさわりを試すことができますが、ここでも説明しようと思います。
    キャラクター(Cube)の移動を同期するというサンプルを作ってみました。キャラクターを動かすスクリプトも作りましたが、これはなくても試すことが可能です。

    必要なものは
    • Network Manager
    • Network Manager HUD
    • Network Transform
    • Network Identity
    の4つです。これだけあればキャラクターの移動を異なる端末間で同期することができます。
    実際に異なる端末間で通信を行うためには相手を見つけなければなりません。IPアドレスがわかればできますが、IPアドレスは一定でなかったりして特定は結構難しい問題だったりします。ここらへんの話はマッチングやマッチメイクといった内容になるので今回は省きます。
    同じPC上で複数のプログラムを動かして通信を行うことにします。ひとつのPCしかなくてもPC内で通信ができるのでテストが簡単です。

    まず最も重要なNetwork Managerを用意します。Network ManagerコンポーネントとNetwork Manager HUDコンポーネントを同じゲームオブジェクトにアタッチするだけです。
    Add ComponentのNetworkというカテゴリーにまとまっているようです。
    networkcomp

    アタッチするところはどこでも良いのですが、今回はMain Cameraにくっつけました。特に設定は行わずアタッチだけしてください。
    networkmanager

    Network Managerの設定はプレイヤーをセットするところが残っていますが、まずはプレイヤーを作ります。ドキュメントではプレイヤーオブジェクトと呼ばれているもので重要なものです。
    今のところは通信が確立するたびに作られるゲームを遊ぶ人を表すものと考えて良いと思います。自分で制御できない他人のゲームオブジェクトがシーン上に現れます。

    プレイヤーの制作はプレハブを作るだけです。目に見える方がわかりやすいのでCubeを使います。Cubeをプレハブ化して、Network IdentityとNetwork Transformコンポーネントをアタッチします。
    Network IdentityにあるプロパティにLocal Player Authorityというものがあるのでそれをtrue(下の画像のようにチェックを入れる)にします。Network Transformコンポーネントがこの値を見て同期を行うべきか決めているのでチェックしないと位置の同期がされなくなります。
    他の設定は変更しないでそのままにしてください。
    networkplayer
     
    プレイヤーのプレハブができたら、 Network Managerに設定を行います。
    Spawn Infoを開いて、Player Prefabという項目があるのでさっき作ったプレイヤープレハブ(ここではCubeという名前)をセットします。これによりプレイヤーがNetwork Managerに認識されます。
    nmplayer
     
    以上で手順は完了です。これで通信してCubeの位置が同期されることを試してみます。Editor上での実行とexeを作ってそれを実行して通信を行っています。

    左側の2画面の上がシーンビューで下がゲームビューです。右側のウィンドウがexeの実行画面です。
    どちらも起動してからウィンドウにGUIでボタンが表示されています。 
    まず片方でLAN Hostを押し、その後にLAN Clientを押します。こうするとPC上で通信が行えます。左の
    Editor上では自分のプレイヤーをシーンビュー上で動かしています。ゲームビューでも動くのは当然ですが、右のexeの方でも位置の変化が反映されているのがわかります。これは通信をして位置の同期を行われていることを表しています。
    networkdemo

    最後にキャラクター(Cube)を動かすスクリプトを載せておきます。このスクリプトをキャラクターにアタッチすれば方向キーで移動させることができます。
    isLocalPlayerというプロパティで自分のものかどうか判定しているので、全部が動くのではなく自分のプレイヤーだけが動きます。

    using UnityEngine;
    using UnityEngine.Networking;
    using System.Collections;

    public class Move : NetworkBehaviour
    {
        public float fSpeed = 0.1f;

        void Update()
        {
            if (isLocalPlayer)
            {
                float vert = Input.GetAxis("Vertical");
                float hori = Input.GetAxis("Horizontal");

                transform.Translate(new Vector3(hori, 0, vert) * fSpeed);
            }
        }
    }
     

      このエントリーをはてなブックマークに追加 Clip to Evernote
    『トランプ・ナポレオン』の通信対戦を動画で説明してみました。

    Unityを同時に5つ起動して対戦しているところを撮影しています。
    1回のゲームを通して全て入れたので、6分とかなり長めの動画になってしまいました。 動画の後半には切断時にもゲームが進行している様子もいれてみました。

    「Unity Multiplayerを使って作ったオンラインゲームってどんな感じだろう?」 ということを疑問に思っている人は参考になるかもしれません。Unity Multiplayerの解説については今後ブログに載せていくつもりですが、 字を読むよりは動画の方が気楽に見れると思います。(音楽がついていないので、そこは退屈ですが)

    アップした動画には次回のアップデートで入れる予定の新機能チャットのボタンが出ていたりします。

    YouTube版
     

    ニコニコ動画版
     

      このエントリーをはてなブックマークに追加 Clip to Evernote
    『トランプ・ナポレオン』で通信対戦を作成したときに必要だったことを書いておきます。オンラインマルチプレイヤーのゲームに必要なことは大抵同じであるので、他のものを作るときにも参考になると思います。

    大きく分けて3つに分類できるでしょう。
    通信を開始するところ、つなげてから切断するまでと切断時で分けています。一般的にオンラインゲームを作るといった場合はつなげてから切断するまでに注目されていると思います。オンラインゲームというのは通信しているときだけなので当然ですが、接続をするところと切断するところはゲームの面白さとかには関係ないですが重要です。この部分はどのように作るかが作成者の考えによって大きく変わるようなので、正解がなく難しいです。
    以下の1と3が接続をするところと切断するところであり、2が通信中のところです。
    1. マッチメイキング 
    2. 同期
    3. 切断
    マッチメイキングはオンラインで一緒に遊ぶプレイヤーを見つけるための処理です。通信を確立する段階です。他のユーザーが知り合いの場合は別として、基本的には知らない人と遊びます。
    ユーザー同士が一緒に遊ぶにはまず相手を探さなければなりません。インターネットの仕組みではIPアドレスがわかると通信ができるようになります。このIPアドレスを相手に伝えれば良いのですが、どうやって伝えるかが問題になります。

    マッチメイキングでは特定の場所(固定されている)に自分の情報を登録し相手に見つけてもらうか、その逆を行います。自分と相手が同じところにアクセスして仲介してもらうことでIPアドレスを教えあうことになるわけです。
    固定されている場所というのはサーバーになるわけですが、自前で用意しなくてもUnity Multiplayerではサービスとして提供されます。(今後有料になるかもしれませんが、まだわかりません。) 


    2つ目に同期ということを行いました。 これは複数の端末間でのゲームの進行状況の足並みをそろえるための処理です。通信自体は確立してからの話になります。
    すべての状況を一致させるということは不可能ですが、大事な情報は一致させるということで同期が必要になります。リアルタイムで刻一刻と一致させる必要な場合もあれば、特定のタイミングで全員をそろえるという場合もあります。

    『トランプ・ナポレオン』 のようなトランプゲームでは特定のタイミングで同期すれば良いです。誰が何のカードを出したかというのをカードが出されるたびに情報の共有を行い、進行させていけばうまく行きます。ランダム要素がないなら、カードの情報だけ揃えればゲームの状況は一致します。(このようなときはゲームの処理は誰が行っても同じ結果になるので、端末ごとに処理を行う分散型の設計が可能です。)
    全員の進行状況をそろえる方法は単純です。先に処理が終わったユーザーは他のユーザーが終わるのを待っていて、全員の状況が同じであると判定されたら次に進むというようにしました。


    最後に切断です。おそらく一番面倒なことです。どういったやり方が良いのかというのは自分で決めなければいけません。
    切断が起こるタイミングはわからないので、起こる可能性のある箇所には対処を入れていく必要があります。変なタイミングで切断すると、アプリが動かなくなったりすることが結構起こります。頑張ってデバッグしましょう。

    『トランプ・ナポレオン』 の対処については以前に記事にしました。切断されてもゲームが続くというように設計されています。このようなことを行うにはゲームを途中から行えるような再現機能かオンラインとオフラインの処理が融合しているような作りが必要です。
    規模が大きい場合は切断時に一旦ゲームを終了して、その後同じ状況に復帰させるという作りが安全だと思います。(切り替えに時間がかかりますが、オンラインとオフラインの処理が完全に切り離せるので問題が置きにくいはずです。) 
    オンラインとオフラインの処理が融合しているというのは同期の部分をif文で分岐しているというだけです。 各ユーザーが処理すべきところもコンピュータで処理するように置き換えるようになっていれば問題ありません。コードがわかりにくくなるデメリットが大きいですが、即座に切り替わるというのはメリットです。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    10/28に「トランプ・ナポレオン」を2.0にアップデートしました。

    今回のバージョンアップは通信対戦の追加です。 その名の通りインターネットを使ったオンラインゲームを行えるようになりました。ナポレオンをすることに変わりはないので、対戦する人数は2~5人になります。

    ナポレオンは元々トランプゲームであり、対人戦が面白いものです。アプリを作ったことで手軽に遊べることは良かったのですが、やはり対戦したいという気持ちがありました。今回はそれを実現できたと思うので非常に良いアップデートだと思っています。
    後はどれくらいのユーザーが使って対戦できるかというところです。現在だとユーザーが少ないので対戦できるだろうかという心配があります。ダウンロードが増えてくれればいいのですがそう簡単ではないので、このアプリを遊んでくれた人が一緒に遊ぼうというように広まってくれることを期待しています。(各レビューサイトにレビューの申請とかできることはしていきます。)

    Screenshot_2015-10-25-19-19-27
     上のように通信対戦を行う人がルーム(待ち合わせ場所)に入ってくるとリストに追加されていきます。2人以上が参加すると開始ボタンが押せるようになり、ゲームを始めることができます。2人の場合は3人がAIにより処理されます。
    ここに表示されている名前は設定の中に「名前変更」 を用意したので、そこで設定した名前が表示されています。(レイアウトの関係で6文字まで、全角にするとレイアウトがそろいます。)

    トランプ・ナポレオンではUnity Multiplayerを使って通信対戦を実装しています。Unity5.1から入った機能ですが、まだ試験的というか使っている人も少ないと思います。クライアントサーバーモデルのゲームを作れるように設計されたり、マッチングサーバーが用意されたりしています。
    ドキュメントだけしかない状況で資料が少ないため、このアプリが参考になるかもしれません。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    アプリ『トランプ・ナポレオン』の通信対戦の説明です。

    1. 概要
    2. ルーム検索
    3. ルーム参加
    4. ルーム作成
    5. 備考

    1.概要
    通信対戦とは、インターネットを介して他のプレイヤーと対戦することができるものです。2~5人のプレイヤーが参加することでゲームを開始することができます。通常の対戦と異なり操作には時間制限があります。
    通信対戦を行うにはルームが必要です。ルームとはプレイヤーがゲームに参加するための待ち合わせ場所のことです。プレイヤーはルームを作るか、ルームに参加するのが基本になります。
    ルームを作る場合は他のプレイヤーが参加してくるのを待ちます。後述の4.ルーム作成をお読みください。
    既にルームが存在している場合は、ルームに参加することができます。後述の3.ルーム参加をお読みください。
    ルームに2人以上のプレイヤーが集まったらゲームを開始することができるようになります。
    ルームを作った人をホスト、ルームに参加する人をクライアントと呼びます。ホストがいなくなるとルームがなくなるので、ホストのプレイヤーは通信がなるべく途切れないようお願いします。
    アプリが中断してしまうと通信が切れるので、アプリが中断しないよう定期的に画面をタップしてください。
    通信が切れた場合は通信対戦を続けることはできませんが、そのまま通常の対戦に移行して遊び続けることができます。通信対戦が行われているときは画面左上に紫色のアンテナのアイコンが表示されています。
    Screenshot_2015-10-25-19-17-03

    2.ルーム検索
    ルームの名前を指定して検索することができます。特定の人と遊ぶためにあらかじめルーム名を決めておいて一緒に遊ぶといった使い方が可能です。
    ルーム名を入力し、「ルーム検索」ボタンを押すとそのルーム名でルームがあるか検索をします。ルームの一覧は定期的に更新されます。
    ルームが見つかった場合は、ルーム名と参加人数が表示されるボタンが現れるのでそれを押してルームに参加することができます。
    Screenshot_2015-10-25-19-17-47 Screenshot_2015-10-25-19-18-09 Screenshot_2015-10-25-19-20-07

    3.ルーム参加
    存在しているルームを見つけて表示します。ルームの一覧は定期的に更新されます。
    ルームが見つかった場合は、ルーム名と参加人数が表示されるボタンが現れるのでそれを押してルームに参加することができます。
    Screenshot_2015-10-25-19-18-15 Screenshot_2015-10-25-19-20-16

    4.ルーム作成
    ルーム名を指定してルームを作ることができます。ルーム名はなくても問題ありませんが、他の人と違う名前をつけることで区別しやすくなるためつけることをお勧めします。
    ルーム作成後はホストとして他のプレイヤー(クライアント)が参加してくるのを待ちます。真ん中の画像のようにはじめ自分の名前だけが表示されていて、このときは戻るを押して通信対戦をやめることができます。
    クライアントが1人でも参加すると、開始ボタンが表示され戻ることはできなくなります。誰かが開始を押すことでゲームが開始されます。5人まで参加可能です。
    Screenshot_2015-10-25-19-17-53 Screenshot_2015-10-25-19-19-08 Screenshot_2015-10-25-19-19-27
     
    5.備考
    プレイヤーの名前は設定から行えます。初期設定では「ユーザー」になっていますので、お好きなものに変更をしてください。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    『トランプ・ナポレオン』に通信対戦機能を作っていると以前の記事で書きました。

    現在は通信対戦の機能を作り終え、テストを行っているところです。早ければ来週か11月の初旬にリリースできるかと思います。はじめは試験版と銘打っておこうと思っています。
    マッチングをルームの作成、参加で通信対戦を行っているので、少し面倒かもしれないと感じています。全自動で通信対戦を行う機能を追加すると自分の参加したいルームに参加できなくなってしまいます。これだと誰かと遊ぶということが難しくなります。ユーザーの意見があれば対応というところですが、まずはルームの作成・参加という方式でリリースします。

    通信対戦を作っていてわかったことは、進行不能になることや通信の切断への対処が難しいということです。どのような対応をするのが良いかはアプリによるので、以降の話は『トランプ・ナポレオン』についてということになります。

    トランプゲームでは誰かが札を出さなくするだけで進行不能になります。通信対戦ではこれが起こると遊ぶのが苦痛になります。
    対処としては時間制限をかけることで解決します。一定時間が経ったら、自動でカードを出すようにしてしまえば良いのです。
    『トランプ・ナポレオン』では全員の進行を止めるような判断を行うところでは必ずそのように作ることにしました。
    宣言、副官指定、カード交換、トリックでのカード選択のときには時間制限を設けています。時間制限が来たら、AIで勝手に処理を行うことにしています。

    切断の対処は、注意をダイアログで表示して「なるべく切らないようにしてね」とお願いしています。これだけで済めば良いのですが、おそらくそうはいきません。

    お願いしても切断されるでしょうから、その時はなんとかゲームを続けられるようにしています。ホスト(サーバーの役割があるクライアント)がいなくならなければ、クライアントが抜けても通信対戦が継続されます。ホストがいなくなった場合はどうしようもないので、クライアントが個々にゲームを続けられるようにしてあります。

    まとめると、以下のような対応をしています。

    <通信を切った人(アプリの中断も含む)>
    • 通信対戦は終了し、そのままオフラインでゲームを継続する。

    <通信を切られた人>
    • ホストがいなくなった場合は通信対戦が終了し、そのままオフラインでゲームを継続する。
    • クライアントがいなくなった場合はそのプレイヤーはAIで処理されるようになるが、通信対戦は継続する。ただしホストだけになってしまった場合は通信対戦は終了し、そのままオフラインでゲームを継続する。
    書くとそんなに処理が多くないように思います。しかしながら実際にこれを対応するのはかなり骨が折れます。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    『トランプ・ナポレオン』に通信対戦機能を入れようとしています。

    元々トランプゲームなので、人が集まらないとできないゲームです。しかもナポレオンは5人で遊ぶのが一番バランスが良く面白いので、5人専用といっても良いです。ナポレオンのルール自体が複雑で分かっている人は少ないでしょうから、同じくらいの力量の人を5人集めるというのはかなり難しいです。
    トランプ自体は人と遊ぶのが当然楽しいですが、実際に人を集めて遊ぶというのは簡単なことではありません。

    そんなわけでインターネットを介して通信対戦するというのが手軽になります。通信の遅延とか切断などの問題も起こってしまいますが、自分がどこかへ行く必要はないので手軽です。(現在の通信の問題はどうしようもないです。)

    この通信対戦機能というのは作るのが難しいものになります。離れた場所で実行されているアプリケーション同士が通信して整合性を保ちながら、実行されていかなければならないからです。うまく作らないと、あるプレイヤーだけが進行しすぎてしまいおかしくなるようなことは簡単に起こります。
    トランプゲームの場合は誰が何のカードを持っていて、今誰が番なのか、何を出したのかということが重要になります。このタイミングがずれてしまうと全員が進行できなくなってしまったりするバグが生まれます。

    ナポレオンではプレイヤーが操作するタイミングが4つあります。
    宣言、副官指定、カード交換、トリックでの手札決定です。これらを全て行えるようになると一応ゲームができるようになります。
    少し前に宣言部分の動作をツイッター上にあげたので以下に載せておきます。

    現在は全ての操作ができるところまできていますが、ゲームに参加するという部分がありません。これはオンライゲームでいうルームを作る、ルームに参加するといったものになります。当然、これがないとオンラインでのゲームが始まらないので作る必要があります。
    アプリのバージョンが違えば、一緒に遊ぶとおかしくなることが普通なので、バージョン違いで接続ができないようにした方が良いです。
    UnityのNetworkMatch.CreateMatchでルームを作る時にCreateMatchRequestのmatchAttributesにバージョンの情報を入れておき、NetworkMatch.ListMatchesでルームを取得するときにListMatchRequestのmatchAttributeFilterEqualToにバージョン情報をいれ比較するようにすれば実現できそうです。

    人が集まらないと対戦できないので、人が集まってくれることを期待したいです。できれば記事の拡散やアプリ『トランプ・ナポレオン』の拡散をお願いしたいです。

    このページのトップヘ