ページ

2015年9月3日木曜日

Unity本に載せきれなかった話

いよいよ明日はUnity本の発売日です。
(結構高いので買おうか悩んでいる方は値下がりしてからで良いと思います。はい。)

イベントなどでは先行販売?されているそうなので、ちょっと早いですが先立って書籍内に載せきれなかった話について、この場でお伝えします。


◆1.iPhoneでトラブルが起きる
基本的に書籍内の検証等はAndroid端末で行っています。
本来であればiPhoneでも検証すべきですが、特に新しい手法を用いているわけでもなし、問題無いだろうと油断していたのが失敗でした。

一つだけ、今まで使ったことのない文がありました。
それは「PhotonNetwork.time」です。
これはサーバーが稼働してからの時間を取得するものですが、書籍中で使用したUnity5.0.2とPUN1.51の組み合わせにおいてはiPhoneだけ異なる値が取得されます。
※各最新版ではiOSでも正しい値がとれるとのことです

とはいえUnityのバージョンを下手に上げるとトラブルの原因になりますので、一般公開版(完成版)では「PhotonNetwork.time」を使わない方法に処理を切り替えています。
具体的にはRPCを使った処理への変更ですが、こちらは一般公開版の「gameManage.cs」内をご覧ください。


◆2.iPhoneでトラブルが起きる②
おそらく私の実装方法が悪いのですが、KiiCloudにおいて書籍中の初期化方法では正しく初期化が行えません。
書籍中の初期化方法とは、
http://documentation.kii.com/ja/guides/unity/quickstart/adding-kii-cloud-sdk-to-your-application/
にあるKiiCloudが公式で用意したリファレンスガイドによるものですので、間違いはないはずですが、すみません、結局根本的な原因は未だ不明です。

回避方法として、上記の初期化方法を使わず、自ら明示的に初期化を行うという手法が有効です。
具体的には一般公開版の「kiiManage.cs」にある

    void Awake(){
        //Kii初期化を手動で行う
        DontDestroyOnLoad(this.gameObject);
        Kii.Initialize("AppID","AppKey",Kii.Site.JP);
    }

内の「Kii.Initialize」が該当します。


◆3.PhotonNetwork.countOfRoomsの罠
 countOfRoomsとは、現在ルームが何部屋あるかを取得するものです。
気をつけなければならないのは、この取得されるルームの数はisOpenやisVisibleの状態を問わず、またルームが定員一杯であったとしてもカウントされることです。

具体的にどういう問題が発生するかというと、
「countOfRooms」の値が0だったら部屋がないので自分で作成する、
これが1だったら”入室可能な”部屋があるので入室処理を行う。

といった処理ができないことにあります。
仮に値が1だとして、その部屋が入室可能かどうかはわからないのです。
 書籍の中にある複数ルームを参照したマッチングについては、思いっきりこの間違いを犯しており、状況によってはしばらく部屋に入れないことが考えられます。

そこで「PhotonNetwork.GetRoomList()」を用いて個別にルーム情報を読み込み、isOpenの状態はどうなっているか、定員に達していないかを判別した上で、入室または新規ルーム作成かを振り分ける必要があります。

こちらについては、「gameManage.cs」の「betterRoomSearch()」をご覧ください。


◆4.standaloneでの書き出し方法
AppCの導入を行うとモバイル環境以外での書き出しができなくなります。
しかしこれはSDKに問題があるわけではなく、AppC独自の構文が使用できないことに起因するものです。
ですので、例えば
「public static AppCCloud appCCloud」や「adsManage.appCCloud.Ad.ShowCutinView()」などをコメントアウトすることで、引き続きwindows,mac用として書き出すことが可能です。
デバッグの際はとても役に立つので、ご活用ください。


◆5.iOS審査対策
iOSにてアプリを審査にかける際、広告用IDの使用の有無について回答する箇所があります。
AppCは広告用IDを使用していませんが、UnityAdsは使用しているとの回答をいただいています。
ですので審査の際の回答は「広告の表示に使用している」となるのですが、
Apple側で広告の表示ができなければ審査で弾かれることになります。
ゲームを起動してすぐに広告がでるようなケースであれば気にすることはないのですが、
書籍内のサンプルのように対戦後に表示されるといった場合、Apple側ではそこまで見ていないことがあります。
(もっとスマートな方法があるかもしれませんが)対戦終了から広告が表示されるまでの過程を動画にし、予め審査の情報として提供すると、リジェクトで足止めを食らう日数が削減できるのでお試しいただければと。


こんなところでしょうか。
何かのお役に立てば幸いです。



3 件のコメント:

  1. 先日書籍を購入し、サンプルゲームを楽しみながら作っています。
    よい本を本当にありがとうございます!一点質問がありコメントさせて頂きます。

    ブログでPhotonNetwork.timeについて書かれていますが、私の場合は0が返ってきしまうことがまれにあります。また、発生条件は特定できていません。
    ゲームはWindows上で動作させており、PUNは1.6.0、Unityは5.2を使用しています。
    私は修正を最小限におさめるため、0が返ってきた際は再取得を行うという対応を行いました。

    一般公開版(完成版)ではPhotonNetwork.timeを使っていないと書かれており、gameManage.csを
    入手して参考に見てみたいのですが、どちらで公開されているのでしょうか?
    探してみたのですが、見つからなかったので質問させていただきました。

    返信削除
    返信
    1. 拙著ではございますが、ご購入いただきありがとうございます!

      >0が返される
      バージョンが異なるため明確な回答は難しいのですが、私の環境では取得のタイミングによって正常ではない値が返されることはありました。
      具体的にはロビー内にいるとき、そしてルームへ入室した直後です。

      >一般公開版
      翔泳社さまのサイト上にて公開されております。
      http://www.shoeisha.co.jp/book/download/9784798140735/detail
      こちらの上から3つ目をご覧ください。

      よろしくお願いいたします。

      削除
    2. お忙しい中、回答してくださりありがとうございます!

      一般公開版について、私がアップされているの見落としていました。
      お手数をおかけして申し訳ありませんでした。

      gameManage.csを拝見させていただいたのですが、私が行ったように再取得をする方法もあるかと思いますが、PhotonNetwork.timeを使わず、RPCで同期を行った方がよりシンプルで確実なのかもしれないと理解がさらに深まりました。

      ありがとうございました!

      削除

状況に応じてご返事できない場合がございます。
予めご了承ください。