UE5.5で公式が対応したっぽいよ!
|ω・`)ノ ヤァ
私です
みんな大好き(?)NiagaraだけどNiagaraEditor上だと30FPS固定なの 知ってました?
(UE4.27.2現在)
モジュールの組み合わせとかモジュールによっては可変フレームで表示崩れたりするんだけど
そもそも実際に30FPS以外で動かした時にしかわからんから気づくの遅れるんだよね
30FPS環境をベースに諸々作って さあ60FPSなり120FPSなりのアレに対応すんぞー!
ってなったときに エフェクト変なんだけど!!!! もぅマヂ無理 ってなる(なった
そっちはまぁ追々どうにかするとして
まずはやっぱり エディタ上で30FPS以外の時の見た目を確認し出来るようにしたいじゃん?
なして30FPS固定なん
いやホント なんで30FPSなん?
ってところから
NiagaraEditor上で表示されるNiagaraSystemはSoloモードが有効になっていてAgeUpdateModeがDesiredAgeになってます
この状態のNiagaraSystemは任意のAgeを渡すことが出来ます。
エディタのタイムラインとこのAge同期させて一時停止や巻き戻しなんかが出来るようになってるわけですね 多分
んで そのSoloモードが有効な場合UNiagaraComponent::TickComponentの中で
現在のNiagaraSystemのAgeと更新したいDesiredAgeの差分をみてSeekDeltaを渡す みたいなコトをしているんですが
この値が
, SeekDelta(1 / 30.0f)
で初期化されていて これの影響でNiagaraEditorは30固定なんですね TA BU NN NE !!
改造する
というわけでざっくり改造していきます。
NiagaraEditorで動いているNiagaraSystemのDesiredAgeを更新している場所が
FNiagaraSystemViewModel::SequencerTimeChanged()
です
なので FNiagaraSystemViewModel あたりに SetSeekDelta を仕込んでやれば良いわけですね
今回は任意のFPSを指定出来るようにしたいのですが UI部分まで変更するのは面倒なので
とりあえず飾りにしかなってないタイムラインのFPSを渡すようにしちゃいましょう。
ちょうど FNiagaraSystemViewModel はNiagaraSequencerを持っているのでこの値を取得してやります。
float SeekDelta = (float)Sequencer->GetRootDisplayRate().Denominator / (float)Sequencer->GetRootDisplayRate().Numerator;
さらにさらに
このクラスはプレビュー中のNiagaraComponentも持っているのでそのまま渡せちゃいます
PreviewComponent->SetSeekDelta(SeekDelta);
切り替えたかどうかの判定をするのもめんどくせーので
FNiagaraSystemViewModel::SequencerTimeChanged()
の
EMovieScenePlayerStatus::Type CurrentStatus = Sequencer->GetPlaybackStatus();
の下辺りに書いちゃってください
はい これでタイムラインの表示FPSでNiagaraEditorの更新がされるようになりました
ヤッタネ
おわり
というわけで 30FPS固定だったエディタを他のFPSにも対応することが出来ました
別に少しくらいパーティクルの広がり方変わってもいい って場合はまぁ 気にしないでいいと思う。
シード値で乱数固定してたりしてると FPSによってシード値変わるからマジで気をつけましょう
まじで
まじで
まじで・・・・・
はぁ・・・
UE5になったらデフォで切り替えれるといいなぁ
今回はこんなんで
ノシ