😸
Photon Transform Viewでの位置同期が正常に動作しない
環境
- 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