UE5 C++ LevelSequence

前言

       最近在用UE C++做一些功能,用到了Level Sequence功能,但是看了下UE官方论坛包括一些文章基本没有关于C++ 处理Level Sequence 这块内容,有的也是一些修改或者源码原理的一些内容分析,接下来我就把我新建Sequence包括一些库的调用写下来,基本上把源码翻了一遍了。

过程

       因为我这是基本走了一遍UE官方的新建的流程,所以我这里UE的插件模式Editor Toolbar Button模式。

       创建完这个模式的插件以后,需要我们在Edit -> Edit Preferences -> Miscellaneous中将Display UI extension Poins勾选,因为我们是一个编辑器按钮的插件,所以我们要知道我们的插件按钮放在哪个UI层级下面,开启这个勾选以后,它就会显示对应的层级关系。

       创建完插件同步代码以后,在我们的插件Source文件中就会默认.h / Commands.h  / Style.h三个文件默认就是我们用来处理常规逻辑的,Commadns是我们同步编辑器一些配置用的,Style就是我们这个插件的一些样式内容了,我们可以先打开Commans.cpp文件编辑按钮名称以及鼠标提示词

       然后打开我们的默认CPP文件,因为我这里是不需要插件按钮在其他地方显示出来的,所以我就把PlayToolBar这边的显示注解掉了,如果大家有需要去开启就好了。设置完成以后,点击编译,运行我们的项目这时你就会发现在我们创建UE LevelSequence的地方就有了一个我们自己的插件

       现在我们这个Level Sequence插件就基本创建完成了,在我们的编辑器中有一个自己的按钮了,接下来我们来实现逻辑,第一步如UE一样,我们也打开一个Save Asset 的窗口对我们的Level Sequence 进行命名和路径选择。创建一个函数,命名为CreateLevelSequenceAsset,这步的操作我是在Movice下面的LevelSequenceEditor里面找到的,他主要就是打开一个UE窗口创建一个Level Sequence资产

       我这里创建完Level Sequence以后是创建了一个CameraCut然后又创建了一个摄像机,将这个摄像机绑定到了CameraCut上面作为了一个默认设置。我是先在场景中创建了相机,这个逻辑处理过程是如果这个场景中没有这个摄像机我就进行创建,有的话就不创建了,这样我所有的LevelSequence都用的一个摄像机,如果大家不需要这么做就修改一下逻辑就好了,创建相机这块很简单,创建了一个相机类,代码如下:

ACameraActor* DoseCineCameraExist()
{
	UWorld* World = GWorld;
	bool bCineCameraExists = false;
	for (TActorIterator<ACameraActor> It(World); It; ++It)
	{
		ACameraActor* ExistingCineCameraActor = *It;
		if (ExistingCineCameraActor && ExistingCineCameraActor->GetActorLabel() == "MainCamera")
		{
			bCineCameraExists = true;
			// 如果存在指定名称的 CineCameraActor,则直接返回该 Actor
			return ExistingCineCameraActor;
			break;
		}
	}
	if (!bCineCameraExists)
	{
		FActorSpawnParameters SpawnParams;
		ACameraActor* NewCineCameraActor = GWorld->SpawnActor<ACameraActor>(ACameraActor::StaticClass(), FVector::ZeroVector, FRotator::ZeroRotator, SpawnParams);

		// 设置新创建的 CineCameraActor 的位置和旋转
		if (NewCineCameraActor)
		{
			NewCineCameraActor->SetActorLabel("MainCamera");
			// 设置位置和旋转
			NewCineCameraActor->SetActorLocation(FVector(0, 0, 50));
			NewCineCameraActor->SetActorRotation(FRotator(0, 0, 0));
		}
		return NewCineCameraActor;
	}
	return nullptr;
}

       现在,我们进行主功能,就是创建一个CameraCut然后将我们的摄像机绑定上去,接下来的主要逻辑顺序基本分层为创建一个对应类型的Track然后设置其属性或者Section。代码如下:

	if (NewAsset && NewAsset->IsA<ULevelSequence>())
	{
		//将CameraCut添加到Seq中
		ULevelSequence* levelsequence = static_cast<ULevelSequence*>(NewAsset);

		UMovieSceneCameraCutTrack* CameraCutTrack = Cast<UMovieSceneCameraCutTrack>(levelsequence->MovieScene->GetCameraCutTrack());
		CameraCutTrack = Cast<UMovieSceneCameraCutTrack>(levelsequence->MovieScene->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值