プログラマーの尾関です。今回は UPROPERTY で知っておくと便利なメタデータ指定子についてまとめてみました。
- 動作確認バージョン:UE5.4.2
プロパティメタデータ指定子とは
プロパティメタデータ指定子とは、クラス、関数、プロパティなどを宣言する際に使用するメタデータキーワードのことです。これにより、エンジンやエディタのさまざまな側面での動作を制御できます。
以下、メタデータキーワードの一例とその説明です。
メタデータキーワード | 説明 |
EditAnywhere | レベルエディターやBPでのRead・Writeが可能 |
VisibleAnywhere | レベルエディターやBPでのReadのみ可能 |
BlueprintReadOnly | BPでのみRead可能 |
Category | プロパティのカテゴリを定義 |
こういったメタデータを使うことで、エディタでの編集作業に制限をかけられて、間違ったデータが入力されるのを防ぐことができます。
この記事では、そういったヒューマンエラーを防ぐために知っておいた方が良いメタデータ指定子を紹介したいと思います。
パラメータに日本語を指定する時の注意点
例えばCategoryに日本語 (2byte文字) を指定するときにソースコードが “Shift-JIS” の場合、エディタで文字化けしてしまいます。
その場合はソースコードの文字コードを「UTF-8 BOM付き」で保存すると正しく表示されるようになります。
DisplayName: 表示名の変更
DisplayName はエディタ上での表示名を変更できます。
英語よりも日本語の方が見た目で意味わかるので、可能な限り指定した方が良い項目です。
1 2 |
UPROPERTY(EditAnywhere, meta = (DisplayName = "アイテムドロップ率")) float DropRatio; |
Units: 単位の指定
Units は単位の指定です。単位を表示することでパラメータの意味が明確になります。
1 2 |
UPROPERTY(EditAnywhere, meta = (DisplayName = "アイテムドロップ率", Units="%")) float DropRatio; |
また ForceUnits を指定すると「単位指定」で入力できるようになります。それについては以下のページが詳しいです。
ClampMin/ClampMax: 最小値と最大値の設定
ClampMin/ClampMaxは入力可能な値を制限できます。
1 2 |
UPROPERTY(EditAnywhere, meta = (DisplayName = "アイテムドロップ率", Units="%", ClampMin = 0.00, ClampMax = 100.00)) float DropRatio; |
ClampMin/ClampMax のどちらかを指定すると値をクランプするだけですが、Min/Max両方のメタデータ指定することでスライダーっぽいUIになります。
EditCondition: 編集可能条件の設定
EditConditionには編集可能となる条件を指定します。例えば敵の種類が「ボス」の場合のみアイテムドロップ率が有効、といった指定ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 敵の種類. UENUM() enum class eEnemy: uint8 { NORMAL UMETA(DisplayName = "雑魚"), ELITE UMETA(DisplayName = "中ボス"), BOSS UMETA(DisplayName = "ボス"), }; ... UPROPERTY(EditAnywhere, meta = (DisplayName = "敵の種類")) eEnemy Type; UPROPERTY(EditAnywhere, meta = (DisplayName = "アイテムドロップ率", Units="%", ClampMin = 0.00, ClampMax = 100.00, EditCondition = "Type == eEnemy::BOSS")) float DropRatio; |
なおEditConditionでの UENUM は “==” 以外の演算子の判定はできない印象で、例えば「敵の種類が 中ボス (eEnemy::ELITE)以上」という判定はうまくいきません。(UE 5.4.2 で確認)
ただ int のような数値データであれば判定可能です。例えば HP が 100以上ならば編集可能とするなどです。
1 2 3 4 |
UPROPERTY(EditAnywhere, meta = (DisplayName = "敵のHP")) int Hp; UPROPERTY(EditAnywhere, meta = (DisplayName = "アイテムドロップ率", Units="%", ClampMin = 0.00, ClampMax = 100.00, EditCondition = "Hp >= 100")) float DropRatio; |
さらに EditConditionHides を指定すると、EditCondition が false の場合に非表示にすることが可能です。
1 2 3 4 |
UPROPERTY(EditAnywhere, meta = (DisplayName = "敵の種類")) eEnemy Type; UPROPERTY(EditAnywhere, meta = (DisplayName = "アイテムドロップ率", Units="%", ClampMin = 0.00, ClampMax = 100.00, EditCondition = "Type == eEnemy::BOSS", EditConditionHides)) float DropRatio; |
最後に
表示名をわかりやすく変更したり、入力範囲に制限を設ける設定などは一人でゲームを作っているぶんにはあまり必要ないかもしれません。
ですが、チーム開発の場合は入力データをわかりやすくすることで仕様の共有がしやすくなって良いので、積極的にメタデータを含めるのがおすすめですね。
以上、エディタでの UPROPERTY の値表示をカスタマイズする方法でした。