お世話になっております。
シーケンサーでクロックソースにカスタムアセットを設定する方法について質問があります。
IMovieSceneCustomClockSource を実装した UDataAsset をC++で定義しました。
このデータアセットをレベルシーケンスのクロックソース > カスタム > アセットで指定したところ、
問題無く IMovieSceneCustomClockSource の各関数が呼ばれました。
ところがレベルシーケンスを保存してから、UnrealEditorを再起動して同じレベルシーケンスを開くと、
IMovieSceneCustomClockSource の各関数が呼ばれなくなりました。
再度 クロックソース > カスタム > アセット で指定することで呼ばれるようになるのですが、
UnrealEditorを再起動するたびに指定する必要がありました。
UnrealEditorを再起動してレベルシーケンスを開いた時点で、カスタムアセットを機能させる方法はないでしょうか。
テストに使用したコードを添付いたします。
[Attachment Removed]
お世話になっております。
個別のシーケンスについて言及されている場合、そのカスタムクロックソースは、シーケンスと一緒にシリアライズされます。
前提として、そのソースが別のアセットである、またはシーケンスから正しくロードできるものである必要があります。
もしソースがアクターなど、読み込み時に存在しない可能性があるオブジェクトであれば、問題が発生する可能性があります。
一方で、カスタムクロックソースをデフォルトとして使用したい場合は、プロジェクト設定から指定することが可能です。
ただし、この設定は新しく作成されたシーケンスにのみ適用され、既存のシーケンスには遡って適用されることはありません。
おてすうですが 、よろしくお願いします。
[Attachment Removed]
お世話になっております。
ご説明いただいた内容から判断すると、特に手動でアセットを再設定した場合にはPostLoadが呼ばれるのに、再起動後にシーケンスを開いた場合には呼ばれないという点から、アセットの参照がレベルシーケンスの保存時に正しく保持されていない可能性が高いと考えています。
これを確認するために、エディターを再起動した後にUMovieSceneオブジェクトを調べていただけますでしょうか。例えば、デバッガーや保存されたアセットの中身を確認する方法で、カスタムクロックソースの参照がnullになっていないかをご確認ください。また、読み込み時にOutput Logに関連する警告が出ていれば、そちらも共有いただけると助かります。
この機能を正しくシリアライズするために、お客様側で追加の実装は必要ないはずです。
参照はエンジンのプロパティシステムによって管理されています。もし再起動後に参照がnullになっていることが確認できた場合、こちら側のバグである可能性が高いため、さらに調査いたします。
[Attachment Removed]
お世話になっております。ご回答ありがとうございます。
以下、追加の質問になります。
> 個別のシーケンスについて言及されている場合、そのカスタムクロックソースは、シーケンスと一緒にシリアライズされます。
> 前提として、そのソースが別のアセットである、またはシーケンスから正しくロードできるものである必要があります。
データアセットですので、シーケンサーとは別のアセットになっております。
UDataAssetのPostLoadをoverrideしましたが
- シーケンスをシーケンサーで開いた場合には呼ばれません。
- シーケンサーから手動設定時には呼ばれます。
このことから、「シーケンスと一緒にシリアライズ」されていない可能性を疑っています。
「シーケンスと一緒にシリアライズ」されるための要件を教えていただけないでしょうか。
(「シーケンスと一緒にシリアライズ」されるための追加の実装が必要でしょうか?)
> もしソースがアクターなど、読み込み時に存在しない可能性があるオブジェクトであれば、問題が発生する可能性があります。
ソースはデータアセットです。
> 一方で、カスタムクロックソースをデフォルトとして使用したい場合は、プロジェクト設定から指定することが可能です。
現時点では、デフォルトにする予定はありません。
[Attachment Removed]
お世話になっております。
> これを確認するために、エディターを再起動した後にUMovieSceneオブジェクトを調べていただけますでしょうか。例えば、デバッガーや保存されたアセットの中身を確認する方法で
> カスタムクロックソースの参照がnullになっていないかをご確認ください。また、読み込み時にOutput Logに関連する警告が出ていれば、そちらも共有いただけると助かります。
上記の検証結果を踏まえたうえで、こちらから改めてご返信させていただきます。恐縮ですが、少々お時間を頂戴できればと思います。
来週末までには内容を整理し、ご連絡できればと考えております。
何卒よろしくお願いいたします。
[Attachment Removed]
投稿内容の直接的な解決には至っておりませんが、こちらでの検証は下記の理由から一旦中止とすることになりました。
本来の目的である ClockSource の実装にあたり UWorld の参照が必要になることが分かり、静的インスタンスである UDataAsset を用いる構成は適切ではないと判断しました。
最後まで検証を完了できておらず恐縮ですが、現時点で確認できた内容のみ共有いたします。
- LevelSequence を T3D でエクスポートして確認したところ、CustomClockSourcePath などは正しく保存されているようでした。
- Sequencer 起動時の出力ログには、警告および ClockSource に関するメッセージは見当たりませんでした。
- FMovieSceneTimeController_Custom のコンストラクタ内で呼ばれる ResolveInterfacePtr() において、ObjectPath.ResolveObject() が nullptr を返していました。
以上となります。
こちらのスレッドは一旦閉じて頂いて大丈夫です。ご対応いただき、ありがとうございました。
[Attachment Removed]