3.

UE5『BlueprintReadOnlyまたはBlueprintReadWriteではありません』エラーの原因と解決方法

編集
この記事の要点
  • このエラーは、C++で定義したプロパティや関数をBlueprint公開せずに、Blueprintのグラフからアクセスしているときに出る警告です。コンパイル自体は通りますが、将来のUE5バージョンで本物のエラーに昇格します。
  • 最短の解決:そのメンバーをBlueprintで使い続けたいなら、C++ヘッダでプロパティにUPROPERTY(BlueprintReadOnly)またはUPROPERTY(BlueprintReadWrite)を、関数にUFUNCTION(BlueprintCallable)を付けてヘッダを再コンパイルします。
  • Blueprintから使う予定が無いなら、逆にBlueprintグラフ側のノード(参照)を削除すれば警告は消えます。
  • BlueprintReadOnly=BPでは読み取り専用、BlueprintReadWrite=BPで読み書き両方。用途に合わせて選びます。
  • private メンバーにそのまま付けるとコンパイルエラーになります。public/protected にするか meta=(AllowPrivateAccess="true") を併用します。

Unreal Engine 5(UE5)でC++クラスをBlueprintから利用していると、出力ログやコンパイル時に「~は表示されるブループリント(BlueprintReadOnlyまたはBlueprintReadWrite)ではありません。これは将来のリリースでエラーとなるため、マークアップを修正するかアクセスを停止してください。」という警告が表示されることがあります。これは英語版UE5の "... is not blueprint visible (BlueprintReadOnly or BlueprintReadWrite). Please fix mark up or cease accessing as this will be made an error in a future release." に対応するメッセージです。

このエラーの意味

このメッセージは、C++側でBlueprintへの公開(公開マークアップ)を一切付けていないメンバー(変数や関数)を、Blueprintのグラフから参照・呼び出ししていることを意味します。

UE5では、C++のメンバーをBlueprintで扱えるようにするには、変数なら UPROPERTYBlueprintReadOnly / BlueprintReadWrite を、関数なら UFUNCTIONBlueprintCallable 等を明示的に指定する必要があります。これらの指定が無いメンバーは「Blueprintからは見えない(blueprint visible でない)」扱いになります。

過去のバージョンでは、公開指定が無くてもBlueprint側がそのメンバーへの参照を保持できてしまうケースがありました。現在のUE5はこれを「不正なアクセス」とみなし、いまは警告に留めているものの、将来のリリースではコンパイルエラーに昇格させると予告しています。つまり放置してよい警告ではなく、いずれビルドが通らなくなる前触れです。メッセージ中の「マークアップを修正する」か「アクセスを停止する」の二択は、まさに後述の解決方針そのものを指しています。

主な原因

  • C++クラスで定義した変数に BlueprintReadOnlyBlueprintReadWrite も付いていないのに、Blueprintのグラフでその変数をGet/Setしている。
  • C++の関数に BlueprintCallable(または BlueprintPure)が付いていないのに、Blueprintからその関数を呼んでいる。
  • もともと公開していた変数・関数から、後で誤って公開指定を外した(または UPROPERTYUFUNCTION 自体を消した)。
  • エンジンや他プラグインの更新で、依存しているC++メンバーの公開マークアップが変わった(サードパーティ製プラグイン更新時によく起こります)。

メッセージ冒頭の「~」の部分には、実際には クラス名.メンバー名(例:VehicleActorFactory.VehiclesParams)が入ります。まずこの名前を確認し、どのC++メンバーが問題なのかを特定するのが第一歩です。

解決方法1:プロパティをBlueprintに公開する

その変数をBlueprintで使い続けたい場合は、C++ヘッダ(.h)の UPROPERTY に公開指定を追加します。読み取りだけで十分なら BlueprintReadOnly、Blueprint側からも値を変更したいなら BlueprintReadWrite を使います。

// 修正前:Blueprint公開指定が無いので警告になる

UPROPERTY()

int32 MyValue;

 

// 修正後(読み取り専用で公開)

UPROPERTY(BlueprintReadOnly, Category = "Stats")

int32 MyValue;

 

// 修正後(読み書き両方を許可し、詳細パネルでも編集可にする例)

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

int32 MyValue;

Category はBlueprintエディタや詳細パネルでの分類名です。必須ではありませんが、指定しておくとノード検索や詳細パネルで見つけやすくなるため推奨されます。

BlueprintReadOnly と BlueprintReadWrite の違い

指定子Blueprintでの読み取り(Get)Blueprintでの書き込み(Set)主な用途
BlueprintReadOnly可能不可(Setノードが作れない)C++側でのみ値を更新し、Blueprintは参照するだけのステータス・計算結果など
BlueprintReadWrite可能可能Blueprintから自由に値を変更したいパラメータ・設定値など

迷ったら、まずは安全側の BlueprintReadOnly から始め、Blueprintで値を書き換える必要が出てきたら BlueprintReadWrite に変更するのが安全です。なお、両方を同時に指定することはできません(どちらか一方を選びます)。

解決方法2:関数をBlueprintに公開する

問題のメンバーが関数の場合は、UFUNCTIONBlueprintCallable を付けます。実行ピン(白い実行線)を持つ通常の呼び出しノードになります。

// 修正前:Blueprintから呼べないのにグラフで呼んでいる

void MyFunction();

 

// 修正後:Blueprintから呼び出し可能にする

UFUNCTION(BlueprintCallable, Category = "Gameplay")

void MyFunction();

 

// 値を返すだけで副作用が無い関数は BlueprintPure が適切

UFUNCTION(BlueprintPure, Category = "Gameplay")

int32 GetScore() const;

状態を変えず値を返すだけの関数(ゲッターなど)は、BlueprintCallable の代わりに BlueprintPure を使うと、実行ピンの無い純粋ノードになりグラフがすっきりします。const を付けた関数に BlueprintCallable を指定した場合も、自動的にPureノードとして扱われます。

解決方法3:アクセスをやめる(公開しない選択)

そのメンバーを本来Blueprintから触る必要が無い場合は、無理に公開せず、メッセージのもう一方の指示どおり「アクセスを停止する」のが正解です。具体的には次のように対応します。

  • 該当するBlueprintのグラフを開き、そのC++メンバーを参照しているGet/Set/呼び出しノードを削除する。
  • 変数や関数をBlueprintのロジックではなく、C++側の処理に置き換える
  • どのBlueprintが参照しているか分からない場合は、エディタの「Reference Viewer」や、対象アセットを右クリックして参照元をたどって特定する。

参照ノードをすべて取り除けば、C++側のマークアップを変更しなくても警告は出なくなります。「使っていないのに警告が出る」ケースは、過去に作って消し忘れたノードが残っていることが多いので、まずグラフを見直しましょう。

よくある落とし穴

落とし穴対処
警告だからと放置する。「将来のリリースでエラーとなる」と明記されているとおり、いずれビルドが通らなくなります。気付いた時点で公開指定の追加か参照削除を行い、後回しにしない。
private メンバーにそのまま公開指定を付けるBlueprintReadOnly/BlueprintReadWrite は private 変数に付けると別のコンパイルエラー("BlueprintReadWrite should not be used on private members")になります。アクセス修飾子を public か protected にする。privateのままにしたい場合は UPROPERTY(BlueprintReadOnly, meta=(AllowPrivateAccess="true")) のように AllowPrivateAccess を併用する。
ヘッダを編集したのに反映されない.hUPROPERTY/UFUNCTION を変更してもエディタを再起動・再コンパイルしないと反映されません。エディタを閉じてIDEからビルド(リコンパイル)するか、ライブコーディングではなく通常ビルドでヘッダの変更を確実に反映させる。
Category を付け忘れてノードが見つからない。公開はできても、Blueprintのコンテキストメニューで探しづらくなります。Category = "適切な分類名" を付け、検索しやすくする。
サードパーティ製プラグイン内のメンバーが原因。自作コードを直しても警告が消えない。警告メッセージのクラス名・メンバー名からプラグインを特定し、プラグイン側の更新を待つか、自分のBlueprintから該当参照を外す。

よくある質問(FAQ)

Q. このまま無視してもゲームは動きますか?
A. 現時点では警告なので動作はします。ただしメッセージのとおり将来のUE5バージョンでコンパイルエラーに昇格する予定のため、エンジンをアップデートした途端にビルドが通らなくなる恐れがあります。早めの対応を強く推奨します。

Q. BlueprintReadOnlyBlueprintReadWrite はどちらを選ぶべきですか?
A. Blueprint側で値を変更する必要が無いなら BlueprintReadOnly を選びます。意図しない書き換えを防げて安全です。Blueprintから値を設定したい場合のみ BlueprintReadWrite を使います。

Q. C++を直せない(コードを触りたくない)場合はどうすればいいですか?
A. C++のマークアップを変更できないなら、Blueprintグラフ側で該当メンバーを参照しているノードをすべて削除してください。「アクセスを停止する」ことでも警告は解消できます。それでも値が必要な場合は、公開済みの別のメンバーや関数経由で取得できないか検討します。

Q. 「~」の部分にはどんな名前が入りますか?
A. 実際の警告では クラス名.メンバー名 の形で、問題となっているC++のプロパティ名または関数名が表示されます。その名前をC++ヘッダ内で検索し、対象の UPROPERTYUFUNCTION を特定してください。

指定子の細かな組み合わせや最新の挙動は、お使いのUE5バージョンによって異なる場合があります。確実を期す場合は公式ドキュメント(UPROPERTY/UFUNCTIONの指定子一覧)の確認を推奨します。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. SetInputMode_UIOnlyは、'PlayerController'ターゲットとして有効なプレイヤーコントローラーを想定しています
  2. 無限ループが検出されました
  3. ~は表示されるブループリント(BlueprintReadOnlyまたはBlueprintReadWrite)ではありません。これは将来のリリースでエラーとなるため、マークアップを修正するかアクセスを停止してください。
  4. 古いHLODアクタを検出、HLODをリビルドする必要があります
  5. ブループリントランタイム エラー: "プロパティ ~ の読み取りを試行するためのアクセスはありません"
  6. 「AI Move To」が「Aborted」で失敗
  7. 「AI Move To」が「Blocked」で失敗

最近更新/作成されたページ