最近公司有一个批量修改unreal sequence的需求,主要是想修复序列中丢失Reference的Actor,以及添加一些track,通过这个任务我探索到一些使用blueprint操作sequence的知识,主要是集中在Editor Mode模式下,适合用在虚拟拍摄环节以及数据处理环节,分享给大家,抛砖引玉。
操作环境
我使用的是Unreal 5.1 但是这些原理都可以是适用UE4。
首先创建一个Editor Utility Widge,因为这样才能访问到一些Editor操作的nodes。
打开这个Editor Utility Widget的 Graph就可以开始测试了。
获取要操作的sequence
1)可以通过在content browers中选择asset来获取,遍历选中的asset,cast到Levelsquence得到,一般在批量修改sequence的时候用到。
2)还有高级一些的方法,用Asset Registry和filter来获取所需的asset,这样就不需要手动选择了。
3)或者直接得到当前打开的sequence,一般是在虚拟拍摄过程中,对当前打开的sequence进行一些控制和修改的时候使用。
Squence播放控制
得到sequence asset后可以将sequence打开,然后用Get Current Level Sequence得到当前打开的sequence,然后进行播放或者设置时间轴操作。
相关节点位于 Level Sequence Editor类别下
Sequence一些常用编辑
Sequence解锁
使用Set Lock Level Sequence来锁定/解锁当前sequence。
原因是,通常Take Recorder设置Auto lock为开启,所以录制出的sequence会被默认锁定。
Fix Actor Reference 重连接丢失连接的Actor
需要注意Target连接Level sequence editor subsystem
和Sequence editor中这个选项作用一样
Sequence构成 Bindings Tracks Sections Channels
在对Sequence进行更深入的编辑前,需要了解一些概念,这些概念是组成Sequence数据的一些Object类型:
Binding, Track, Section, Channel, Key
下图我大概的写了下,这几个概念对应Sequence界面的关系,这些Object概念并不是能够完全找到图形界面对应的关系的,是我按照自己的使用和经验大概总结的。
大概可以将这几类Object理解为:
Binding:
就是通常我们加到Sequence上的Actor,以及其包含的轨道信息。
Track:
就是当前这个Actor的一个信息轨道,例如上图的Spawned或是Transform,如果是你自己写的BP蓝图,如果你将其中一个变量勾选成 Expose to Cinematics,那么也可以对这个变量key关键帧,那么这个变量也就成了一个Track。
还有另一种特殊的Track他们的父级是Sequence,叫做Master Track,这个可以通过以下节点获取。
我觉得应该是和Sequencer上的这个+Track类型对应
Section:
我对section的理解就是,根据Track的数据类型不同,有时候一个Track可以加多个section,类似常见的Transform上,可以加Absolute/Additive/Relative 这种section,可以叠加关键帧的数据。
同时Section还有一个range的属性,能调整起始点,这块我还没有实际工作需求使用过,但我的感觉是,section作用就是存一堆关键帧的,这个部分如果有更加了解的朋友欢迎一起交流。
Channel:
我的感觉channel就是负责承载关键帧的,通常channel和section包括和track都是同个类型的。
就比如说,你有一个float的变量在sequence上key了关键帧,这个float的轨道 就是一个 MovieSceneDoubleTrack,然后包含了MovieSceneDoubleSection,然后又包含了MovieSceneDoubleChannel。实际使用过程中我只是知道需要获得Key value或者需要添加关键帧,都需要这么些步骤。
Key:
Key就很直接了,就是关键帧信息。
获取关键帧的思路
获取sequence中的信息按照以下思路考虑:
获取Binding -> 从Binding获取Track -> 从Track获取section -> 从section获取channel -> 从channel 获取 key -> 从key获取数据
一个抽象的蓝图示意图如下:
其中选中的Macro是需要根据你的需要自己写的,主要就是用来filter过滤得到你需要处理的部分。
一个困扰了我许久的问题是,除了获取Key,其他object的获取都能直接从上一个层级的object获取到,但到了Key这个步骤,就需要你将channel cast到一个具体的object类型,并且每个key也要cast到具体类型的object才能获取内部信息。
例如下图中,你必须明确地将一个Channel object cast成一个 MovieSceneScriptingDoubleChannel,才能够使用Get Keys(Double)节点得到Key,并且得到了Key object,你还需要明确地Cast成 MovieSceneScriptingDoubleKey,来得到时间和数据。Channel的类型并不只有我上面图片展示的MovieSceneScriptingDoubleChannel, Key也不知是有MovieSceneScriptingDoubleKey。
所有Channel类型如下图:
所有Key的类型如下图:
一种方便的不用记忆的方法得到channel和key的类型:
你可以可以用蓝图print出来当前选中的binding,并且打印他下面的Track/Section/Channel
或者是copy当前的channel然后粘贴到记事本中观察object的名字。
添加关键帧
和前面介绍的如何获取关键帧信息同理,你首先需要得到你要操作的channel,并且明确地将他cast到一个特定的channel类型,才能使用Add Key节点。
根据不同的channel数据类型,对应不同的Add Key节点。
总结
本文只是简单介绍下蓝图操作Sequence的常用操作,帮我记录我工作中常用的操作,以及给刚接触sequence操作流程的朋友以启发,大家可以通过在蓝图编辑页面的 Pallete中搜索更多关于Level sequence操作的蓝图进行使用。