UnityでPhotonを使ったネットワークゲーム開発において、PhotonNetwork.Instantiate()で生成したオブジェクトの親を設定しようとすると、”プレハブアセット内に存在するトランスフォームの親を設定することは、データ破損を防ぐために無効になっています”というエラーが出ることがあります。本記事では、この問題の原因と安全な回避方法を解説します。
PhotonNetwork.Instantiateの基本動作
PhotonNetwork.Instantiate()は、ネットワーク上で同期されたオブジェクトを生成する関数です。この関数で生成されたオブジェクトは、プレハブの状態で生成されるため、直接親を設定するとデータ破損防止のためUnityが制限をかけています。
つまり、Instantiate直後に.transform.parentを設定するだけではエラーが発生します。
親オブジェクトに子を追加する安全な方法
安全に親を設定する方法は、生成後に親オブジェクトのTransformに対してSetParent()を使うことです。SetParent()の第二引数をfalseにすることで、ローカル座標を保持して親子関係を変更できます。
例: A.transform.SetParent(T,false);
座標や同期を考慮した親設定
ネットワークオブジェクトを親に追加する場合、座標や同期に注意が必要です。ローカル座標でSetParentを使うと、見た目の位置は変わらずに親子関係を設定できます。
また、RigidbodyやPhotonViewが付いている場合、親を変えることで同期に影響が出ることがあります。必要に応じて、親オブジェクトに適切なPhotonViewの設定を行いましょう。
具体例コード
public Transform T;
GameObject A = PhotonNetwork.Instantiate("box", transform.position, Quaternion.identity, 0);
A.transform.SetParent(T, false);
このコードでは、生成直後にSetParentを使用して親を安全に設定しています。ローカル座標を保持しているため、位置も崩れません。
まとめ
PhotonNetwork.Instantiateで生成したオブジェクトに親を設定する場合、transform.parentを直接変更するのではなく、SetParent()を使うことが推奨されます。これにより、データ破損エラーを回避しつつ、ネットワーク同期されたオブジェクトの親子関係を安全に設定できます。


コメント