この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:atom
更新日時:2026-06-12 15:49:43

タイトル: C++で編集となっているコンポーネントをブループリントで編集する方法
SEOタイトル: UE5でC++定義コンポーネントをブループリントで編集する方法|UPROPERTY指定子

Unreal Engine 5(UE5)でブループリント(BP)の詳細パネルにコンポーネントが「C++で編集」と表示される場合、そのコンポーネント自体の追加・削除・置き換えはC++側で固定されていますが、各プロパティの値はブループリント側の詳細パネルから変更できます(プロパティに編集を許可する指定子が付いている場合)。本記事では、なぜ編集不可に見えるのか、そしてブループリントで何をどこまで編集できるのかを整理します。

この記事の要点
  • 「C++で編集」表示は、そのコンポーネントがC++のコンストラクタで生成(CreateDefaultSubobject)された継承コンポーネントであることを示します。コンポーネント枠そのもの(追加・削除・差し替え)はBPでは操作できません。
  • 一方で、そのコンポーネントの個々のプロパティ値は、詳細パネルで変更できる場合があります。編集できるかどうかは、C++側で各プロパティに付けたUPROPERTY指定子次第です。
  • プロパティをBPで編集可能にするには、C++側でそのプロパティに EditAnywhereEditDefaultsOnly を付けます。VisibleAnywhere は表示のみで、グレーアウトして編集できません。
  • コンポーネントの参照ポインタ自体は VisibleAnywhere / BlueprintReadOnly にするのが一般的な作法です。これはポインタの差し替えを禁止するだけで、コンポーネント内部のプロパティ編集を妨げるものではありません。
  • BPで完全に制御したい場合は、C++側の指定子を見直すか、コンポーネント構成そのものを再設計します。

1. 「C++で編集」と表示される仕組み

UE5でC++のアクタ(Actor)クラスを継承してブループリントを作成すると、親クラスのコンストラクタで生成されたコンポーネントは、子ブループリントのコンポーネントツリーに継承コンポーネントとして現れます。これらの枠には「C++で編集」といった旨のラベルが付き、ブループリントエディタ上ではコンポーネントの追加・削除・差し替えができない状態になります。

これは、コンポーネントの生成元がC++のコンストラクタにあるためです。典型的には、次のように CreateDefaultSubobject で生成されたコンポーネントがこれに当たります。

// ヘッダ(.h)でのコンポーネント宣言

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Mesh")

UStaticMeshComponent* BodyMesh;

 

// コンストラクタ(.cpp)での生成

BodyMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BodyMesh"));

ここで重要なのは、「枠(コンポーネントそのもの)が固定されていること」と「枠の中のプロパティ値が編集できるかどうか」は別の話だという点です。継承コンポーネントの枠はBPで操作できなくても、その内部プロパティ(メッシュ、マテリアル、トランスフォーム、各種設定値など)は、指定子次第で詳細パネルから変更できます。

2. なぜ編集できないように見えるのか

「C++で編集」と表示されたコンポーネントを選んでも、詳細パネルのプロパティがグレーアウトして変更できないことがあります。多くの場合、理由は次のいずれかです。

  • そのプロパティのUPROPERTY指定子が VisibleAnywhere(または VisibleDefaultsOnly / VisibleInstanceOnly)になっており、表示専用として定義されている。
  • そのプロパティに UPROPERTY 自体が付いておらず、エディタに公開されていない(詳細パネルに項目が出ない)。
  • 編集しようとしている文脈(クラスのデフォルト編集 vs 配置インスタンス編集)と、指定子(EditDefaultsOnly / EditInstanceOnly)が噛み合っていない。

つまり「C++で編集」という表示は、必ずしも「BPでは一切いじれない」という意味ではありません。コンポーネント枠の追加・削除がC++管理であることを示すラベルであり、内部プロパティが編集できるかどうかは、各プロパティの指定子で決まります。

3. ブループリントの詳細パネルでできること

継承コンポーネントを選択した状態で、ブループリント側では主に次のことが行えます。

  • 編集が許可されている(EditAnywhere / EditDefaultsOnly など)プロパティのデフォルト値を変更する。例:スタティックメッシュの差し替え、マテリアルの割り当て、コリジョン設定、相対位置・回転・スケールの調整など。
  • 継承コンポーネントを親(ルート)として、その子に新しいコンポーネントを追加する(追加した子コンポーネントはBP管理になります)。
  • イベントグラフ上で、そのコンポーネントを参照してロジックを組む(ポインタが BlueprintReadOnly でも参照は可能です。差し替えができないだけです)。

一方で、継承コンポーネント枠そのものの削除や、別の型のコンポーネントへの差し替えはBPからは行えません。これらが必要な場合はC++側の構成変更が必要になります。

4. C++側でプロパティをBPに公開する

BPの詳細パネルでプロパティ値を編集できるようにするには、C++側で各プロパティに編集を許可する指定子を付けます。代表的な指定子は次の通りです(公式ドキュメントの定義に基づきます。詳細はバージョンの公式リファレンスで確認してください)。

指定子詳細パネルでの挙動
EditAnywhereBPのクラスデフォルトでも、レベルに配置したインスタンスでも値を編集可能。
EditDefaultsOnlyBPのクラスデフォルトでのみ編集可能。配置インスタンスでは編集不可。
EditInstanceOnly配置インスタンスでのみ編集可能。クラスデフォルトでは編集不可。
VisibleAnywhere表示のみ。BPでもインスタンスでも値は変更できない(グレーアウト)。

例えば、これまで編集できなかった値をBPで調整できるようにするには、次のように VisibleAnywhereEditAnywhere に変更します。

// 変更前:表示のみ(BPで編集不可)

UPROPERTY(VisibleAnywhere, Category = "Settings")

float ExampleValue;

 

// 変更後:BPのデフォルト・インスタンスの両方で編集可能

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Settings")

float ExampleValue;

ここで BlueprintReadWrite は、詳細パネルでの編集可否ではなく、イベントグラフのノードから読み書きできるかを制御する指定子です。詳細パネルでの編集は Edit... 系、グラフからのアクセスは Blueprint... 系と、役割が分かれている点に注意してください。

コンポーネント参照そのものの指定子について

コンポーネントへの参照ポインタ自体は、CreateDefaultSubobject で生成する場合、慣例として VisibleAnywhere / BlueprintReadOnly を用います。これは「ポインタを別のコンポーネントに差し替えられないようにする」ためのもので、コンポーネント内部のプロパティ編集を禁止するものではありません。内部プロパティが編集できるかどうかは、あくまでそれぞれのプロパティに付いた指定子で決まります。

// 参照ポインタは VisibleAnywhere/BlueprintReadOnly が無難

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Mesh")

UStaticMeshComponent* BodyMesh;

5. BPで完全に制御したい場合の見直し

コンポーネントの追加・削除や差し替えまで含めてBP側で管理したい場合は、C++のコンストラクタでコンポーネントを固定生成する方針自体を見直すことを検討します。

  • C++クラスを基底にしてBPで構成する:共通のロジックや必須プロパティだけをC++の基底クラスに持たせ、コンポーネントの組み立ては子ブループリント側で行う設計にすると、コンポーネント構成をBPで自由に変更できます。
  • 編集の必要があるプロパティだけ公開する:すべてを公開する必要はありません。デザイナーが触る値だけ EditAnywhere にし、内部実装用の値は表示専用にすると、誤操作を防げます。
  • カテゴリで整理するCategory = "..." を付けると、詳細パネル上でプロパティがグループ化され、どの値がBPで編集可能かを把握しやすくなります。

6. よくある落とし穴

注意したいポイント
  • 指定子の付け忘れ・選択ミス:BPで編集したいのに VisibleAnywhere になっている、または UPROPERTY 自体が無いと、グレーアウトしたり項目が表示されません。編集したいなら Edit... 系を使います。
  • C++コンストラクタのデフォルト値との関係:コンストラクタで設定した値は「初期デフォルト値」です。BPやインスタンスで上書きした値が優先されますが、上書きしていないプロパティはC++のデフォルトが効きます。意図せずC++側の値が反映されているように見えることがあります。
  • 編集の文脈の取り違え:EditDefaultsOnly はクラスデフォルトのみ、EditInstanceOnly は配置インスタンスのみ編集可能です。「BPエディタでは編集できるのにレベル上では編集できない(またはその逆)」という場合は指定子を確認します。
  • 親子(継承)関係の影響:親C++クラスを変更したのに子BPに反映されない場合、ブループリントの再コンパイルやエディタの再起動が必要なことがあります。それでも更新されない場合は、子BPの再作成が有効なケースも報告されています。
  • ヘッダ変更後の再ビルド忘れ:UPROPERTY指定子を書き換えたら、C++プロジェクトの再コンパイル(再ビルド)が必要です。エディタのリロードだけでは反映されません。

7. よくある質問(FAQ)

Q1. 「C++で編集」と出ているコンポーネントは、ブループリントでは一切いじれないのですか?

いいえ。コンポーネント枠そのもの(追加・削除・型の差し替え)はC++管理のため操作できませんが、内部のプロパティ値は、C++側で編集を許可する指定子(EditAnywhere など)が付いていれば、詳細パネルから変更できます。

Q2. BlueprintReadWrite を付ければ詳細パネルで編集できるようになりますか?

必ずしもそうではありません。詳細パネルでの編集可否を決めるのは Edit... 系の指定子です。BlueprintReadWrite は、イベントグラフのノードからそのプロパティを読み書きできるかを制御するものです。詳細パネルで編集したいなら EditAnywhere などを併せて付けます。

Q3. C++を編集できない(ソースを変えられない)状況で、値をどうにか変えたい場合は?

その値に編集を許可する指定子が付いていれば、詳細パネルで変更できます。付いていない場合、エディタからその値を直接変更する手段はありません。ロジックで上書きできるケース(公開された関数経由など)もありますが、確実な対応はC++側で指定子を見直すことです。自身でソースを変更できない場合は、提供元に指定子の追加を相談するのが現実的です。

8. まとめ

「C++で編集」表示は、コンポーネントがC++のコンストラクタで生成された継承コンポーネントであることを示すもので、枠の追加・削除こそBPではできませんが、内部プロパティの値はBPの詳細パネルから編集できます。編集できるかどうかは、C++側で各プロパティに付けたUPROPERTY指定子(EditAnywhere / EditDefaultsOnly / VisibleAnywhere など)で決まります。BPで触りたい値には編集を許可する指定子を付け、参照ポインタは差し替え防止のため VisibleAnywhere / BlueprintReadOnly にするのが基本です。完全にBPで構成を制御したい場合は、コンポーネントの生成方針そのものを再設計するとよいでしょう。各指定子の正確な挙動はUE5のバージョンによって細部が異なる場合があるため、最終的には利用中バージョンの公式ドキュメントで確認することをおすすめします。