お世話になっております。
レベルシーケンスのカスタムトラックでFMovieSceneChannelProxyを使ってFMovieSceneBoolChannelのキーを表示しています。
キーとキーの間に線が表示されているのですが、Visibilityトラックと同じようにBoolの値によって、表示(色)を変更することはできますか?
添付画像の Param A の赤枠で囲んだ線の色を変更したいです。
[Image Removed]
FMovieSceneChannelMetaData ChannelMetaData(TEXT("Param A"), FText::FromString(TEXT("Param A"))); Channels.Add(Channel, ChannelMetaData, TMovieSceneExternalValue<bool>()); ChannelProxy = MakeShared<FMovieSceneChannelProxy>(MoveTemp(Channels));
以上、よろしくお願い致します。
お世話になっております。
VisibilityTrack の場合は FBoolPropertySection::OnPaintSection 関数内で
const FColor Color = ValueAtTime ? FColor(0, 255, 0, 125) : FColor(255, 0, 0, 125);
のようにして色を分けています。
このセクションが使用されることは以下のように指定されています。
TSharedRef<ISequencerSection> FVisibilityPropertyTrackEditor::MakeSectionInterface(UMovieSceneSection& SectionObject, UMovieSceneTrack& Track, FGuid ObjectBinding) { return MakeShared<FBoolPropertySection>(SectionObject); }
そちらでどのような実装をされているかは分かりかねるのですが、
上記を参考にトラックエディタまたはセクション(エディタ側の、ISequencerSection を継承したもの)での実装をしていただく形にはなるかと思います。
よろしくお願いいたします。
ご回答ありがとうございます。
説明不足で申し訳ございません。
VisibilityTrack の実装は確認しておりまして、同様の実装にしても添付画像の赤枠で囲んだ部分の線の表示に影響はなく、変わらず表示されていました。
この線はFSequencerSectionPainter::PaintSectionBackground()の内部で表示されているようです。
FMovieSceneChannelMetaDataやFMovieSceneChannelProxyを利用することで、添付画像のとおり1つのトラックに対して任意のプロパティのトラックを追加で表示させることができますが、この追加した各々のトラック(セクション)では OnPaintSection() を使うことはできないと考えており、この場合に VisibilityTrack と同様のことができるのか確認したいです。
以上、よろしくお願い致します
>VisibilityTrack の実装は確認しておりまして、同様の実装にしても添付画像の赤枠で囲んだ部分の線の表示に影響はなく、変わらず表示されていました。
通常は OnPaintSection() 関数を用いてセクション内全域の表示をカスタマイズすることが可能です。
表示にまるで変化がなかったのであれば何か実装上の見落としがあるかもしれません。
ただし OnPaintSection() の中でチャンネル毎の描画範囲を得る手段は見当たりませんので、複数のチャンネルを持つカスタムセクションについて各チャンネルの外観をVisibilityTrack の場合と同様にすることは難しそうです。
Visibility 単体でトラックを為すことに倣い、一つの意味に対して一つのトラックとするのが悩みの少ない運用ではあるかもしれません。
チャンネル自体の外観を(エンジンに手をいれることなく)変化させる手段としてカスタムチャンネルを定義するという方法が考えられますが、こちらには相応の困難やリスクを伴うかもしれません。
探した限りではこれに関する詳しいドキュメント等は見当たらず、エンジン内でチャンネル固有の外観を実装している例もごく少数です。
参考になるものとしては下記ドキュメント及び FMovieSceneFloatPerlinNoiseChannel/FMovieSceneDoublePerlinNoiseChannel の例くらいかと思われます。
[https://dev.epicgames.com/documentation/ja\-jp/unreal\-engine/sequencer\-time\-refactor\-technical\-notes?application\_version\=4\.27\#ム%\[…]Dル](シーケンサーでの時間関連のリファクタリング技術メモ | Unreal Engine 4.27 ドキュメンテーション | Epic Developer Community)
大まかな作業内容は
・FMovieSceneChannel 及びそれに応じた ISequencerChannelInterface, TMovieSceneChannelTraits を定義
・SequencerModule に ChannelInterface を登録
・ISequencerChannelInterface::DrawExtra_Raw をオーバーライドして必要な描画処理を実装
のような形になるかと思います。
描画処理の実装については FBoolPropertySection::OnPaintSection を参考にできるはずです(パラメータのセットが異なりますが概ね互換性があるようです)。
よろしくお願いいたします。
ご回答ありがとうございます。
>表示にまるで変化がなかったのであれば何か実装上の見落としがあるかもしれません。
失礼しました。線の表示に変化がなかっただけで、セクションの表示は変わっていました。
ご教示いただいた内容を参考に今後の対応を検討したいと思います。
こちらはクローズで問題ございません。
ご対応ありがとうございました。