
本記事の結論
メタデータ指定子
FrameTimeEditorを使うと、float値をフレーム単位で設定可能にUPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(FrameTimeEditor)) float TimeFloat;ただし、
Chooserプラグインを有効化する必要あり- 30fpsベースでの計算なことに注意
- 現状は60fpsベースにするにはエンジン改造 or 自作する必要あり
FFrameTimeCustomization参照
検証環境:UE5.6.0
はじめに
UE5では、基本的に時間に関する制御・管理は秒(Second)単位で行います。

この仕様によりフレームレートが(多少)変動しても(基本的に)動作は変わらないため、PCのようにユーザ毎にスペックが異なる場合でも(比較的)問題なく遊ぶことができます。
ただ厳密なタイミング調整をするために、フレーム単位での調整が必要になる場合もあります。といった場合に、UE標準の秒単位での管理は少し面倒なことになります。

例えば「6フレーム後に当たり判定を出す」を実装するとします。
この「フレーム単位での調整」における 1フレームは 1/60 秒 = 0.016秒を指すため、下図におけるTimeの値は 0.016 * 6 = 0.096になります。…慣れてないと暗算しづらいですし、話したり書いたりするにはちょっと面倒な数字です。シンプルに 「6」と設定したい所です。

これなら調整用パラメータである Frameには 「6」と設定できます!が…毎回フレームから秒への計算処理をするのはあまり好ましくないですし、何よりノードがあまり美しくありません!(個人の感想)

変換部分をマクロにすると少しノードが美しくなりますが、計算処理が毎回走る問題は残ってしまいます…

といった問題を解決するのが、メタデータ指定子「FrameTimeEditor」です!
メタデータ指定子「FrameTimeEditor」
使い方
これを使うことで、float値をフレーム単位または秒単位で設定可能になります!
UPROPERTY(EditAnywhere, BlueprintReadWrite, **meta=(FrameTimeEditor)**) float TimeFloat;

あくまで設定するUI表示での話であり、内部的には秒単位でデータを持っています。そのため、プロパティのGetノードが返す値は秒単位のものです。つまり、フレーム単位での設定を行った場合でも、プロジェクト側で秒単位への変換処理を用意する必要はありません!
めちゃ便利!…ただし、いくつか注意点があります。
注意点について
まず、Chooserプラグインを有効にしないとFrameTimeEditorは機能しません。これは後述のコードがこのプラグインに含まれるためです。

次に、FrameTimeEditorは30fpsベースでの計算を行います。つまり、6フレームと設定した場合は内部データは 0.2になります…
残念ながら60fpsベースでの計算に変更するには、現状はエンジン改造 or 既存コードを元に自作の2択になります。前者の場合は、FFrameTimeCustomizationの以下の箇所に手を入れればOKです。
// Engine/Plugins/Chooser/Source/ChooserEditor/Private/FrameTimeCustomization.cpp namespace UE::ChooserEditor { static const float SecondsToFrames = 30.0f; static const float FramesToSeconds = 1.0f/30.0f; static ETimeFloatFormat GTimeFloatDisplayFormat = ETimeFloatFormat::Frames; void FFrameTimeCustomization::CustomizeHeader(TSharedRef<IPropertyHandle> PropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& CustomizationUtils) { ...
自作する際は、FFrameTimeCustomizationをほぼ丸コピし、60fpsベースの計算への変更 & ↓を弄ってFrameTimeEditor60fpsなどに変えて区別するようにすればOKです。たぶん
class FFrameTimePropertyTypeIdentifier : public IPropertyTypeIdentifier { public: virtual bool IsPropertyTypeCustomized(const IPropertyHandle& PropertyHandle) const override { return PropertyHandle.HasMetaData(TEXT("FrameTimeEditor")); } };
どうじで…CVarなりで変更できるようにしてくれなかったのか…(´;ω;`)
最新コードも見てみましたが、2025/8/13時点では対応は入ってないようです
さいごに
かゆい所に少し届かない感はありますが、フレーム単位での調整が求められるプロジェクトではFrameTimeEditorは便利な機能だと思います!
また、FFrameTimeCustomization自体はシンプルな実装なので改造しやすいですし、エディタ拡張する際の程よいサンプルになるかなと思うので、興味のある方は是非一度コードを見てみてください!
おしまい!