UnityのPrefab Variantにおける親子関係とオーバーライドの仕組み
UnityのPrefab Variantは、元のPrefab(親)を継承しながら独自の変更を加えることができる便利な仕組みです。本記事では、Prefab Variantの「継承とオーバーライド」のルールや、親と子の変更が競合した場合の優先順位について詳しく解説します。
1. Prefab Variantの「継承とオーバーライド」の仕組み
Prefab Variantは、元のPrefab(親)を継承しつつ、一部の要素を変更(オーバーライド)できます。基本的な動作ルールは以下の通りです。
📌 基本ルール
操作 | 結果 |
---|---|
親にスクリプトを追加 | 子にも自動的に追加される ✅ |
子にスクリプトを追加 | 親の変更で上書きされない(子のオーバーライド) ✅ |
子で親のスクリプトを削除 | 親が変更しても復活しない(オーバーライドが優先) ✅ |
親でスクリプトを削除 | 子からも削除される ✅ |
🛠 具体例
📌 例 1: 子に新しいスクリプトを追加
1. ParentPrefab には何のスクリプトもなし。
2. VariantPrefab に Enemy スクリプトを追加。
3. ParentPrefab に CollisionHandler を追加。
➡ 結果:VariantPrefab には「Enemy」と「CollisionHandler」が両方つく。
→ 子で追加したスクリプトは親の変更で上書きされない!
📌 例 2: 子で親のスクリプトを削除
1. ParentPrefab に CollisionHandler が最初からついている。
2. VariantPrefab で CollisionHandler を削除。
➡ 結果:VariantPrefab には CollisionHandler がついていない(削除されたまま)。
→ 子で削除したスクリプトは、親が変更しても復活しない!
2. 親と子の変更が競合したときの優先順位
Prefab Variantで子が変更(オーバーライド)した部分に対して、親が同じ箇所を変更すると「競合(コンフリクト)」が発生します。この場合、子の変更(オーバーライド)が優先される のが基本ルールです。
📝 ルールまとめ
ケース | 結果 |
---|---|
親が新しく要素を追加 | 子にも追加される ✅ |
親が既存の要素を変更 | 子でオーバーライドしていた場合は無視される(子の変更が優先) ✅ |
親が既存の要素を削除 | 子が変更していなければ削除されるが、オーバーライドしていた場合は残る ✅ |
🛠 具体例
📌 例 1: スクリプトの値を変更した場合
1. 親Prefab に Rigidbody があり、Mass = 1
2. 子Prefab で Rigidbody の Mass を 10 に変更
3. 親Prefab で Rigidbody の Mass を 5 に変更
➡ 結果:子Prefab の Mass は 10 のまま(子のオーバーライドが優先)
✅ 親の変更は子に適用されず、子のオーバーライドが保持される!
📌 例 2: 親で削除しても子で保持される
1. 親Prefab に Rigidbody を追加
2. 子Prefab に Rigidbody が追加される(親の影響を受ける)
3. 子Prefab で Rigidbody を削除
4. 親Prefab で Rigidbody の Drag を 1 に変更
➡ 結果:子Prefab には Rigidbody がない(子で削除したため)
✅ 子で削除した場合、親の変更は無視される!
📌 例 3: Transform の変更
1. 親Prefab の Position = (0,0,0)
2. 子Prefab で Position を (5,0,0) に変更
3. 親Prefab の Position を (10,0,0) に変更
➡ 結果:子Prefab の Position は (5,0,0) のまま(子のオーバーライドが優先)
✅ Transform の変更も子のオーバーライドが優先!
3. 親の変更を適用する方法:「オーバーライドをリセット」
もし親の変更を適用したい場合、子Prefab のオーバーライドをリセット すれば、親の変更を反映できます。
👀 方法(Unityエディタ上)
- Prefab Variant の Inspector でオーバーライドされた項目を確認
- 変更を「右クリック → Prefab のオーバーライドを Revert」
- 親の変更が適用される!
🎮 まとめ
- Prefab Variant は「親の要素 + 自分のオーバーライド」を持つ
- 子でオーバーライドした箇所は親の変更の影響を受けない
- 親が新しく追加したものは子にも反映される
- 親の変更を適用したい場合は「オーバーライドをリセット」する
この仕組みを理解しておけば、Prefab Variant を活用して柔軟なゲームオブジェクトの管理ができるようになります! 🎮