【第09日目】UnityとPUN2の一人目のプレイヤーが見えないバグを修正する

今回は、ウェブにビルドしたものを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プレイヤーしか反応しないという事になりそうです。

下記のように書き直しました。

 

これを実行してみると、無事、バグが無事解決しました!

おわりに

原因不明のバグが出た場合には、まず冷静に挙動を整理して分析することが大切だと思いました。

そこで見えた共通点から、どのスクリプトに問題があるか仮説を立て、試行錯誤するという事で今回のバグを潰すことが出来ました。

 

かなり脇道にそれて時間がかかってしまいましたが、

無事マルチプレイヤー対面プレイが達成できたので、今度は詳細を詰めていこうと思います。

 

これからも応援よろしくお願い致します。

では、また!

 

おすすめの記事