Unityでネットワーク対応ゲームを作成する際、Network.Instantiate()やPhotonNetwork.Instantiate()で生成したオブジェクトに親を設定したい場合があります。しかし、通常のtransform.parentの設定では”プレハブアセット内に存在するトランスフォームの親を設定することは無効”というエラーが出ることがあります。本記事では、安全に親を設定する方法を解説します。
Network.Instantiate()の基本動作
Network.Instantiate()はネットワーク上で同期されるオブジェクトを生成する関数です。生成されたオブジェクトはプレハブ状態で作られるため、直接transform.parentを変更するとUnityがデータ破損を防ぐために制限をかけています。
そのため、生成直後にparentを設定するだけではエラーが発生します。
SetParent()を使った安全な親設定
親を安全に設定するには、生成後にSetParent()関数を使います。SetParent()の第二引数にfalseを指定すると、ローカル座標を保持したまま親子関係を変更できます。
例: generatedObject.transform.SetParent(parentTransform, false);
座標や同期の注意点
ネットワークオブジェクトを親に追加する場合、座標や同期に注意が必要です。RigidbodyやPhotonViewなどが付いている場合は、親子変更による物理挙動や同期に影響が出ることがあります。
必要に応じて、親オブジェクトに対しても適切なコンポーネント設定を行い、意図した挙動になるように調整しましょう。
具体例コード
public Transform parentTransform;
GameObject obj = PhotonNetwork.Instantiate("PrefabName", Vector3.zero, Quaternion.identity, 0);
obj.transform.SetParent(parentTransform, false);
このコードでは、生成後にSetParentを使用して親を安全に設定し、ローカル座標を保持しています。
まとめ
Network.Instantiate()やPhotonNetwork.Instantiate()で生成したオブジェクトに親を設定する場合、transform.parentではなくSetParent()を使用することが推奨されます。これによりデータ破損のエラーを回避しつつ、安全に親子関係を設定できます。


コメント