😸

Photon Transform Viewでの位置同期が正常に動作しない

2022/08/19に公開

環境

  • VRの開発を行っていますが、VRに限定されないと思われます。
  • Unity 2021.3.7f1
  • PUN2 2.41

問題

  • Photon Transform Viewをアタッチしたオブジェクトの位置同期が正常に行われない。
    • 持っている側(Owner側)では正しい位置にあるように見える
    • 持っていない側(Ownerではない側)では、持つ側が持つ前は正常な位置にあり、持った瞬間に別の位置に移動し、また話したら元の位置に戻る

原因

  • 持つ対象のGameObject(Photon Transform Viewがアタッチしてあるオブジェクト)が、1つ以上のGameObjectの子となっている
  • 親のGameObjectの中に、Position(0, 0, 0), Rotation(0, 0, 0)から外れたものがある
  • Photon Transform Viewの"Use Local"にチェックが入っている

実験

実験条件

Parent1: Position(0, 0, 0)
├ Parent2: Position(-1, 0.3, -2)
|   ├ Parent3: Position(-1, 0.3, -2)
|      ├ TargetGameObject: Position(-1, 0.3, -2)

で、TargetGameObjectにPhoton Transform Viewをアタッチし、Use Localにチェックをつける。

結果

  • 持った瞬間、TargetGameObjectは大きく移動した。TargetGameObjectのTransformコンポーネントは以下のようになっていた。
  • Positionはおおむね(-3, 0.9, -6)ととらえることができる(VRで持っているため、手の揺れの誤差が入る)
  • これは、自身と親のPositionのそれぞれの座標の和となっている

考察

  • Photon Transform ViewのUse Localにチェックを入れた際に、持つ側で取得する座標がグローバルの座標(-3, 0.9, -6)であると仮定する。
  • 持つ側で取得した座標(-3, 0.9, -6)が、持っていない側ではローカルの座標として使われる。
  • 結果、持っていない側では大きく位置がずれる(たしかに画面上ではグローバル座標で(-5, 1.5, -10)に近い位置にあった気もする...)

まとめ

  • 自身の親がPosition(0, 0, 0) , Rotation(0, 0, 0)を両方満たさない場合は、"Use Local"にチェックをいれてPhoton Transform Viewを使うのは危険

捕捉

  • Photon Transform Viewの"Use Local"のチェックを外せば問題ない
  • すべて"Use Local"外せばよいのでは?と思ってしまうが、そうではない理由があるのか?調べても見つけられなかったので、知っている人いたらコメントおねがいします。

Discussion