UE4:FSequencer的BakeTransform封装到蓝图

问题

美术有需要将Level Sequence进行BakeTransform然后导出fbx到其他软件中工作的需求,在这中间TA大佬还需要用Python脚本或者蓝图脚本来进行一些流水线处理,但是

1
2
/** Bake transform */
void BakeTransform();

是FSequencer的成员函数,非UFUNCTION,需要想办法再包一层给到蓝图的Library中

那么问题来了,我们获取到的ULevelSequence和FSequencer还有相当长的距离……

解决办法

由于这个问题已经有一段时间了,具体的解决过程就是翻源码看看,具体的过程也不必要赘述,这里直接写最后的解决方案

和TA大佬约定,我提供一个蓝图方法,传入参数为ULevelSequence*,我对这个对象执行BakeTransform

在我各种查看源码后,发现有这个东西FLevelEditorSequencerIntegration,该类定义的时候有SEQUENCER_API,是一个纯c++类,但是可以导出
并且其有成员方法:AddSequencer;RemoveSequencer;GetSequencers

通过这个GetSequencers可以获取TArray<TWeakPtr> ISequencers

再对ISequencer进行StaticCast可以获取到FSequence

拿到FSequencer之后可以通过GetFocusedMovieSceneSequence()方法获取 UMovieSceneSequence

最后通过 UMovieSceneSequence的GetMovieScene方法可以获取一个UMovieScene

而通过参数传进来的ULevelSequence可以直接GetMovieScene获取一个UMovieScene

如果这两个UMovieScene相同,则能从FLevelEditorSequencerIntegration的GetSequencers获取的一堆ISequencer中确定我们需要的那个FSequencer,然后调用一下BakeTransform即可

将以上过程封装为FLevelEditorSequencerIntegration的一个成员函数,最后在蓝图Library再封装一层给到蓝图就完成啦

源码贴到这里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void FLevelEditorSequencerIntegration::BakeLevelSequencerTransform(ULevelSequence* LevelSequence)
{
UMovieScene* MovieScene = LevelSequence->GetMovieScene();
if(MovieScene == nullptr)
{
return;
}
auto ISequencers = GetSequencers();
for (auto& Sequencer : ISequencers)
{
auto SharedRefISequence = Sequencer.Pin().ToSharedRef();
auto DerivedSequencerPtr = StaticCastSharedRef<FSequencer>(SharedRefISequence);
UMovieScene* FocusedMovieScene = DerivedSequencerPtr.Get().GetFocusedMovieSceneSequence()->GetMovieScene();
if (MovieScene == FocusedMovieScene)
{
DerivedSequencerPtr.Get().BakeTransform();
return;
}
}
}

UE4:FSequencer的BakeTransform封装到蓝图
http://muchenhen.com/posts/61655/
作者
木尘痕
发布于
2022年8月16日
许可协议