【UE4】詳細パネルでの編集可・不可を制御する

  • 1
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

外部に公開し詳細パネルから編集出来るパラメータを「ある条件を満たした場合のみ編集可能にする」というような事が出来るらしいのでご紹介します。

はじめに

1_ダメな例.PNG
上の画像のように詳細パネルに公開されたパラメータがあります。
各オフセット値には値が入力されていますが、このパラメータはチェックボックスにチェックを付けない限りは適用されないようになっています。
このような公開の仕方は「値を変更したのに全く適用されてない!」と文句を言われてしまったり、意図しない入力によりバグの原因にもなりかねません。
そこで「チェックボックスにチェックを付けた場合のみオフセット値の入力を可能にする」ようにしてみます。
2_良い例.PNG

パラメータの編集を制御するにはUPROPERTYのmetaを使う

いきなり結論ですが編集を制御出来る変数は以下のようにして定義します。

test.h
    UPROPERTY(Category = Locomotion, EditAnywhere, BlueprintReadWrite)
        uint32 bRightLeftMoving : 1; 

    UPROPERTY(Category = Locomotion, EditAnywhere, BlueprintReadWrite, meta=(EditCondition = "bRightLeftMoving"))
        float RightLeftOffset = 256.f;

現状変数のmetaはC++でしか書けないためC++で書いています。

uint32 bRightLeftMoving : 1;

meta=(EditCondition = "bRightLeftMoving")
が紐付けられている箇所です。
uint32 変数名 : 1;
で真理値(bool)が定義されます。
EditCondition = "変数名"
で「変数名がTRUEの時に変数の編集を可能にする」となります。

後はエディタでコードのコンパイルをしてやればチェックボックスが付いていないRightLeftOffsetは入力が出来なくなっているはずです。

FALSEの時に編集可能にする

test.h
    UPROPERTY(Category = Locomotion, EditAnywhere, BlueprintReadWrite)
        uint32 bHoge : 1;

    UPROPERTY(Category = Locomotion, EditAnywhere, BlueprintReadWrite, meta = (EditCondition = "bHoge"))
        float hoge = 256.f;

    UPROPERTY(Category = Locomotion, EditAnywhere, BlueprintReadWrite, meta = (EditCondition = "!bHoge"))
        float foo = 256.f;

EditCondition = "変数名"
で変数名がTRUEの時編集可能と出来ますが
EditCondition = "!変数名"
というように変数名の前に!をつける事で変数名がFALSE時のみ編集可能と出来ます。
4_びっくりマーク.PNG

式の評価はできないっぽい

EditCondition = "変数名" ですが EditCondition = "変数名 == 1" というような式を評価することは出来ません。
コリジョン設定のコリジョンプリセットのように列挙型による編集の制御は出来るようですが、自分では該当するコードが見つけられませんでした。
https://forums.unrealengine.com/showthread.php?54493-How-do-I-enable-disable-controls-in-my-blueprint-details-panel-via-C
こちらのフォーラムでは「CanEditChange関数」をオーバーライドすることで式による評価が可能だと書いてあるので、こちらで列挙型による編集の制御を行っているのかもしれません。

おわりに

metaのEditConditionを書くことで該当箇所の編集制御が出来るようになりました。
しかし、ブループリントの継承で派生先にのみ存在する変数を定義することで同様のことは可能だと思います。
C++を追加して編集を制御するかクラスを派生させて編集を制御させるかは時と場合によると思いますので、とりあえずこの方法は数あるうちの一つという程度の認識でお願いします。