今回は、ウェブにビルドしたものをUnityRoomに限定公開して、マルチプレイができる事を確認しました。
すると、エディタ上では確認できなかったエラーを発見してしまい、その対応に一日を費やしてしまいました。
これは、とても貴重な経験になったので、その過程を記しておきます。
それでは、私のデバッグの軌跡を、、、
目次
UnityとPhotonで対面プレイでお互いが見えないバグを発見
まず、気づいた事として、対面に座った時にお互いの山札とカードが見えないという事がたまにありました。
それから、もう一点は、片方のプレイヤAーが着席した時に、もう片方のプレイヤーBのカメラがAと同じ方向に固定される時があるというものでした。
毎回起こる事がバラバラなので、再現性が無く、何がいけないのかの糸口がつかめませんでした。
一つ、気になっていたのは、WebGLにビルドする際に出てたエラーです。
もしかしたら、そのエラーのせいで起こってるのでは?と思いました。
WebGLにswitchplatformした場合に出るStandardAssetのエラー
最初はこのエラーが全ての原因ではないかと思い、エラーログを徹底的にググりました。
解決法はなかなか探すのに苦労しまして、唯一見つかったのは下記の書き込みでした。
しかし、これは、やってみましたが全く結果は変わりませんでした。
そこで、今回のバグ(?)がどの様に起こっているのかを、徹底的に分析することにしました。
バグの再現性がある挙動を把握して徹底的に場合分けする
まず、前提条件をそろえるために、限定的な状況だけを考える事にしました。
プレイヤーは2人に絞り、プレイヤーAが先に入った方、プレイヤーBが後に入った方です。
部屋に入る、着席する、のタイミングと、どちらのプレイヤーが右と左に座るかによって場合分けして考えました。
Case1:
Aが入る、Bが入る
この場合、AとBは互いのアバターが見える。
AがSphere01に着席すると、Bも同じ方向に着席してしまう。
Case2:
Aが入る、Bが入る
この場合、AとBは互いのアバターが見える。
BがSphere01に着席すると、Aも同じ方向に着席してしまう。
Case3:
Aが入る、Bが入る
この場合、AとBは互いのアバターが見える。
BがSphere02に着席すると、Aも同じ方向に着席してしまう。
Case4:
Aが入る、Bが入る
この場合、AとBは互いのアバターが見える。
AがSphere02に着席すると、Bも同じ方向に着席してしまう。
Case5:
Aが入る、AがSphere01に着席する。
Bが入る、BがSphere02に着席する。
対面で正しい挙動となる。
Case6:
Aが入る、AがSphere02に着席する。
Bが入る、BがSphere01に着席する。
対面で正しい挙動となる。
場合分けで起こった再現性のある挙動から共通点を洗い出す
Case1~4の共通点
先に席についたプレイヤーのカメラ取得が、他のプレイヤーにも起きる。
Case5~6の共通点
他のプレイヤーが先に席についている場合には、正しい挙動となる。
この二つの事実から、Aが着席する際に、AとB両方のコライダーが発動している可能性があることが分かりました。
よく考えてみると、AとBが部屋に入り、着席していない状態では、AとB両方のコライダーが空間に存在しています。
その両方のコライダーにプレイヤーが当たれば、確かにカメラが両方取得されてしまう可能性がありました。
よってAのコライダーにはAしか反応せず、BのコライダーにはBしか反応しないような書き方にすべきという事になります。
UnityとPhotonの対面プレイのバグを潰す
そこで、&& PV.IsMineをif文に書き加えてみました。
しかし、問題は解決しませんでした。
よくよく考えてみると、ぶつかってきたプレイヤーのIsMineを取る必要があるということに気付きました。
よって、collision.gameObject.GetComponent<PhotonView>();でぶつかるプレイヤーのPVを取得し、
そのIsMineのbool値を条件に含める事で、AのコライダーにはAプレイヤーしか反応せず、BのコライダーにはBプレイヤーしか反応しないという事になりそうです。
下記のように書き直しました。
これを実行してみると、無事、バグが無事解決しました!
おわりに
原因不明のバグが出た場合には、まず冷静に挙動を整理して分析することが大切だと思いました。
そこで見えた共通点から、どのスクリプトに問題があるか仮説を立て、試行錯誤するという事で今回のバグを潰すことが出来ました。
かなり脇道にそれて時間がかかってしまいましたが、
無事マルチプレイヤー対面プレイが達成できたので、今度は詳細を詰めていこうと思います。
これからも応援よろしくお願い致します。
では、また!