タイトル: ブループリントで途中から親クラスを指定する方法
SEOタイトル: Unreal Engine Blueprint 親クラス変更 (Reparent) 完全ガイド(互換性 / 罠 / 復旧)
| この記事の要点 |
|
Reparent Blueprint とは
Reparent Blueprint は、既に存在する Blueprint クラスの継承元(親クラス)を後から変更する機能です。例えば:
- 既に Actor として作ってしまった Blueprint を、後から Character 派生に変えたい
- 仮の C++ クラスから派生していた Blueprint を、本実装の C++ クラス派生に切り替える
- サブクラスをまとめるための中間 C++ 親クラスを途中で追加したい
通常はBlueprint 作成時に親クラスを選ぶものですが、開発が進むにつれて「やっぱり親を変えたい」というケースは頻繁にあります。Reparent はそのための機能ですが、慎重に扱わないと参照切れが多発する注意点も多いです。
基本手順
- Content Browser で対象の Blueprint をダブルクリックして開く
- 上部メニュー File > Reparent Blueprint を選択
- 新しい親クラスをダイアログで選択
- 確認ダイアログで Reparent をクリック
- 変数や関数の引き継ぎ状況をログで確認
- Compile + Save
互換性のあるクラスのみ選択可
Reparent ダイアログには互換性のあるクラスのみが表示されます。基本ルール:
| 元の親 | 変更可能な新親 |
|---|---|
| Actor | Actor 派生(Pawn / Character / 自作 AActor 派生 C++ 等) |
| Pawn | Pawn 派生 / Character / 任意 APawn 派生 |
| Character | Character 派生 / Character の親も可 |
| UserWidget | UserWidget 派生 |
| Object | UObject 派生 |
| ActorComponent | ActorComponent 派生 |
異なる継承ツリー間(例: Actor → UserWidget)への変更は不可です。コンポーネント体系が根本的に違うため。
変数と関数の引き継ぎ
Reparent 時、Unreal Engine は以下のルールで変数・関数を引き継ぎます:
| 条件 | 結果 |
|---|---|
| 同名・同型の変数が新親にある | 新親のものを使い、Blueprint 側の宣言は削除 |
| 同名だが型違い | 新親のものを優先、値は失われる |
| 新親には存在しない | Blueprint の独自変数として残る |
| Override 関数で新親にも存在 | そのままオーバーライド継続 |
| Override 関数だが新親に存在しない | 関数定義は残るが何も呼ばれなくなる |
典型的な使用例
例1: 仮の Blueprint Actor から C++ ベースに昇格
[元]
BP_MyEnemy (parent: AActor)
- 変数: Health, Speed, AttackDamage
- 関数: Attack, TakeDamage
[望ましい姿]
新規 C++: AEnemyBase : public AActor
- C++: Health, Speed, AttackDamage (UPROPERTY)
- C++: Attack(), TakeDamage() (UFUNCTION)
手順:
1. C++ クラス AEnemyBase を作成
2. BP_MyEnemy を開いて File > Reparent Blueprint
3. AEnemyBase を選択
4. 重複していた Health/Speed/AttackDamage は C++ 側に統一
5. Compile + Save
例2: Character 派生に格上げ
Actor として作ってしまった敵キャラを、移動ロジックを共通化するために Character 派生に変えたい場合:
- BP_Enemy を開く
- File > Reparent Blueprint → Character を選択
- CharacterMovementComponent が自動追加される
- SkeletalMeshComponent も追加 → 既存のメッシュ参照を移し替え
- 独自に作っていた移動ロジックを CharacterMovement に置き換え
Reparent の罠と対策
罠1: 他 Blueprint からの参照切れ
BP_Enemy を参照していた他の Blueprint や Cast ノードが Missing になります。コンパイルエラーから一つずつ修正:
変更前: Cast to BP_Enemy
変更後: Cast to AEnemyBase (新しい親)
→ Cast の右クリックメニュー: Refresh All Nodes
→ コンパイル後の "Compiler Results" タブからジャンプ
罠2: 配列要素型の不整合
TArray<BP_Enemy> という配列が他で使われていた場合、Reparent 後にエレメント型が壊れます。型を更新するか、より上位の共通親型に変えるのが安全:
TArray<BP_Enemy> EnemyList; ← 型を再選択する必要あり
✅ 推奨: 上位の共通型で持つ
TArray<AActor*> EnemyList;
// もしくは
TArray<AEnemyBase*> EnemyList;
罠3: シーン配置済みインスタンスのコンポーネント欠落
Reparent で消えたコンポーネントがあると、シーンに配置済みのインスタンスから値が失われます。Outliner からインスタンスを選んで「Sync Components」または手動で再アタッチ。
罠4: Default 値のリセット
新しい親クラスにある同名変数は、Reparent によって新親の Default 値で上書きされる可能性があります。重要な初期値はメモしておきましょう。
リダイレクタとリファレンス整合
クラス自体の名前を変えた場合は Class Redirects を DefaultEngine.ini に書くと、古い名前で参照していた箇所が自動で解決されます:
; DefaultEngine.ini
[CoreRedirects]
+ClassRedirects=(OldName="/Game/Old/BP_Enemy.BP_Enemy_C",NewName="/Game/New/BP_EnemyBase.BP_EnemyBase_C")
+ClassRedirects=(OldName="BP_Enemy",NewName="BP_EnemyBase")
Reparent 前の安全策
- Git / Perforce にコミット(万一の取り戻し用)
- Content Browser で右クリック → Duplicate でバックアップ用 BP 作成
- Reparent 元の使われている箇所をリストアップ(Right click → Reference Viewer)
- テスト用シーンを作って動作確認してから本番シーンに適用
復旧: Reparent でおかしくなったら
- Source Control から Revert する(最も確実)
- もう一度 Reparent して元の親に戻す
- Compile 時のエラーログから Missing 参照を一つずつ追跡
- Reference Viewer(右クリック → Reference Viewer)で依存関係を可視化
Native C++ 親クラスへの Reparent
Blueprint だけだったクラスをC++ ベースに上げるパターン。手順:
- Editor > Tools > New C++ Class → 既存 Actor 等を継承する空クラス作成
- Blueprint を Reparent でその C++ クラスに変更
- Blueprint 側で実装していたロジックを徐々に C++ に移動
- Blueprint には Editor 設定や Override 中心、性能要件高い部分は C++ という分業
FAQ
Q: Reparent しても変数 / 関数のサインアウトが効かない
A: Reparent 後 Compile + Save しないと変更が反映されません。エラー一覧から該当箇所を全部直してから保存。
Q: Reparent で消えた Componentを復活させたい
A: バックアップから設定値をコピーして再追加するしかありません。Reparent 前のスクショや BP 複製を残しておくのが鉄則。
Q: Reparent 後にエディタがクラッシュする
A: 致命的な参照不整合の可能性。Source Control から Revert して、より慎重な Reparent 戦略を検討してください。Project Saved/Logs にスタックトレースが残っているので、Anti-Crash でクラッシュ箇所を特定できます。