内容纲要
在Sequence的程序开发过程中,若是想对Editor模式下的Sequence编辑器面板添加新的轨道的话,需要使用UMovieScene***Track类。
如图所示,在图中UE还提供了其他成分的类作为要添加轨道的类型,在此笔记中将会使用UMovieSceneIntegerTrack作为示例。
//使用AddTrack函数初始化UMovieSceneIntegerTrack的实例化对象。
UMovieSceneIntegerTrack* TimeCodeSecond = MovieSequence->GetMovieScene()->AddTrack<UMovieSceneIntegerTrack>(Guid);
//接下来使用SetDisplayName设置Track类在Sequence中显示的名字。
TimeCodeSecond->SetDisplayName(FText::FromString(TEXT("拍摄时间码_秒")));
//使用创建的Track生成新的Section,并尝试将其转换到对应的UMovieSceneIntegerTrack类上。
UMovieSceneIntegerSection* Section = Cast<UMovieSceneIntegerSection>(TimeCodeSecond->CreateNewSection());
...未完待续
...
在C++中得到已经创建的轨道。LevelSequenceEditorToolkit获得方法跳转至此
//得到所有当前绑定在Sequence上的Object,UMovieSceneSequence是LevelSequence的资源类。
//如此一来就能得到在Sequence中所有的Object了。
LevelSequenceEditorToolkit->GetSequencer().Get()->GetRootMovieSceneSequence()->GetMovieScene()->GetBindings();
若是想得到Binding的轨道名称的话,可以使用ForLoop对Bindings进行循环。
for (FMovieSceneBinding Binding : Bindings)
{
//每个Binding是绑定在当前LevelSequence上面的Object。
//每个绑定的Object同时又有很多子轨道,使用GetTracks函数获得子轨道
for (UMovieSceneTrack* MovieSceneTrack : Binding.GetTracks())
{
//得到轨道的内部命名 ***_0, ***_1
MovieSceneTrack->GetName();
//得到轨道的显示命名
MovieSceneTrack->GetTrackName().ToString();//到字符串
//尝试将UMovieSceneTrack转换到对应类型的一种。
//UMovieSceneIntegerTrack可以是上述图的任意一个。
//TimeCodeFrame是示例名称。
UMovieSceneIntegerTrack* TimeCodeFrame = Cast<UMovieSceneIntegerTrack>(MovieSceneTrack)
}
}
若是想得到某一个轨道的长度,可以通过得到Section的方式,得到Section类中的Range。
for (UMovieSceneSection* MovieSceneSection : TimeCodeFrame->GetAllSections())
{
//使用Track类中的GetAllSections函数得到所有的MovieSceneSection。
//用MovieSceneSection中的GetRange函数返回TRange,这便是Section的Range。
TRange<FFrameNumber>Range = MovieSceneSection->GetRange();
//FFrameNumber::Value()可以直接将内部类型转换为int32。
const FFrameNumber Low = Range.GetLowerBoundValue();
const FFrameNumber High = Range.GetUpperBoundValue();
SCHLOG("%d", Low.Value);
SCHLOG("%d", High.Value);
}
TRange<FFrameNumber>Range = MovieSceneSection