昼夜序列(Day Sequence)插件是一系列Actor和资产,可用于自动生成24小时的昼夜循环。 这些组件能简化当日时间系统的设置,同时让你能利用Sequencer的工具对太阳、月亮、星星、大气和云层等元素实现更多美术控制。 昼夜序列插件利用蓝图、关键帧结构体和自定义触发器简化了定制昼夜循环的实现,让资产的复用和共享变得更为便捷。
昼夜序列插件的设计充分考虑了模块化、兼容性和灵活性,注重资产的复用与重组、与现有项目的集成,以及在多个行业和不同团队规模下的整体实用性。 昼夜序列插件还支持多人游戏的网络同步、使用体积创建兴趣点以重载其他昼夜序列,以及基于数据的光照方案与程序化序列生成。
在项目中启用昼夜序列
要在你的场景中开始使用昼夜序列当日时间Actor,你必须先为项目启用昼夜序列(Day Sequence)插件。 你可以在编辑(Edit)菜单的插件(Plugins)浏览器中找到该插件。
设置昼夜序列
昼夜序列插件包含了从零开始设置时间系统所需的所有组件,其中还包括一套预设的当日时间循环,你可以将该循环直接拖放至关卡中。
配置当日时间循环的主要方式有以下几种:
通过添加或移除手动制作的昼夜序列集合资产来编辑昼夜序列Actor。
创建昼夜序列Actor以自定义光照组件及其参数,例如一天的长度、时间推进的间隔等。
使用一系列光照组件和参数自定义昼夜序列Actor,例如指定一天的长度、更新之间的时间间隔等。
请阅读下文小节来了解如何设置并使用昼夜序列并创建当日时间系统。 这些方法将按设置和使用的复杂程度,从简单到复杂的顺序排列。
设置预配置的当日时间系统
日月昼夜序列Actor是一种预配置的完整昼夜循环,你可以将其拖放到关卡中。 它无需额外设置即可实现功能完备的当日时间系统,其编译所用的组件和资产与下文编译自定义当日时间系统所用的组件和资产一致。
请遵循以下入门步骤:
新建空白关卡,或打开现有关卡。 如果你的关卡中已存在环境光照组件(定向光源、天空光照、天空大气和体积云等),请将其移除。
转到关卡编辑器的主工具栏,点击创建(Create),然后找到所有(All)卷展栏类别,将日月昼夜序列Actor(Sun Moon Day Sequence Actor)拖入场景中。
当关卡中放置日月昼夜序列Actor后,你将看到一个拥有太阳、大气和云层的完整照明环境。 昼夜序列Actor还附带一个名为当日时间(Time of Day)的新视口工具栏。 你可以用该菜单中的时间(Time)滑块手动推移当前时间,从而在编辑器中移动太阳的位置。
如需详细了解昼夜序列Actor的设置和如何针对项目进行配置,请参阅本页面的昼夜序列Actor小节。
设置简化的当日时间系统
你可以使用基础昼夜序列Actor(Base Day Sequence Actor)创建一套简化的当日时间系统,并将其作为起始点。 与日月昼夜序列Actor类似,该Actor包含了必要的光照组件,但需要你自行设置其他资产以实现自定义,从而满足项目需求。
编译简化版当日时间系统时,主要使用两个元素,分别是基础昼夜序列Actor和昼夜序列集合资产。 基础昼夜序列Actor包含了一系列的光照组件。 昼夜序列集合是用于设置昼夜序列资产的资产,后者指定了太阳在天空中的移动方式。
请遵循以下入门步骤:
使用创建(Create)菜单为关卡添加基础昼夜序列Actor(Base Day Sequence Actor)。
转到内容浏览器,新建昼夜序列集合(Day Sequence Collection)资产。
打开你的昼夜序列集合资产。
转到"昼夜序列(Day Sequence)"分段下,点击添加(+)按钮,新建一个条目并展开其属性。
转到序列(Sequence)插槽,指派由昼夜序列插件提供的DS_24hr昼夜序列资产。
如有需要,你可以自行创建昼夜序列资产,以获得更符合项目需求的定制化内容。但就目前设置而言,建议你在初次编译当日时间系统时使用此资产。
转到"程序化昼夜序列(Procedural Day Sequence)"分段下,点击添加(+)按钮以新建一个条目。 点击Index[0]旁的下拉菜单,选择太阳位置序列(Sun Position Sequence)。
保存并关闭昼夜序列集合。
返回关卡并在大纲视图中选择你的基础昼夜序列Actor。 然后,前往细节(Details)面板。
找到位于"序列(Sequence)"类别下的昼夜序列集合(Day Sequence Collection)指派插槽。 指定你的昼夜序列集合。
完成后,你应该能看到一个由太阳照亮且存在大气层和云层的场景,即实现昼夜循环所需要的一切。 若昼夜序列集合中的昼夜序列资产设置正确,你将可以在关卡视口的当日时间(Time of Day)菜单中使用时间(Time)滑块来推移时间,从而调整天空中太阳的位置。 另一方面,当使用PIE时,当日时间会根据昼夜序列Actor的默认设置而自动调整。
设置自定义当日时间系统
你可以用昼夜序列Actor从零开始编译当日时间系统。 这是通用Actor,不包含默认光照组件,这一点与日月昼夜序列Actor和基础昼夜序列Actor有所不同。
使用昼夜序列Actor从零开始编译时间系统,可以为你的项目提供最大程度的灵活性和定制性。
要从零开始编译当日时间系统,请执行以下步骤:
转到内容浏览器,点击添加(+)按钮并选择蓝图类(Blueprint Class)。
在弹出的选择父类(Pick Parent Class)窗口中,使用所有类(All Classes)下的搜索栏,选择DaySequenceActor作为类。
转到内容浏览器,命名该蓝图。
打开昼夜序列蓝图。
转到组件(Components)面板,添加你的当日时间系统所需的一切环境光照组件。 你可以在蓝图视口的窗口中预览此效果。
包括的部分组件如下:
两个定向光源(供太阳和月亮使用)
天空大气
体积云
天空光源
指数高度雾
后期处理体积
转到事件图表(Event Graph),添加逻辑以将昼夜序列Actor注册到昼夜序列子系统中。 这将让你可以在编辑器中预览昼夜序列Actor。 要完成此设置,你需要在"构造(Construction)"和"开始播放(BeginPlay)"事件发生时调用Day Sequence Subsystem > Set Day Sequence Actor。
转到内容浏览器,创建昼夜序列集合资产和昼夜序列资产。
打开该昼夜序列集合资产。
点击昼夜序列旁的添加(+)图标并展开Index [0]设置。
将你在上一步创建的昼夜序列资产指派给序列(Sequence)插槽。
保存并关闭昼夜序列集合。
转到你在第1步中创建的自定义昼夜序列Actor蓝图,使用细节面板将你的昼夜序列集合资产指派给昼夜序列集合(Day Sequence Collection)插槽。
编译并保存蓝图。
当日时间视口工具栏
关卡中添加了"昼夜"功能后,视口工具栏中就会自动添加当日时间(Time of Day)工具栏菜单。 该工具栏让你能快速访问当日时间系统的某些设置,例如在关卡视口中手动预览更改效果的滑块、时间重载的设置项,以及针对昼夜序列的快速操作等。
当日时间工具栏包含如下分段:
| 属性 | 说明 |
|---|---|
| 预览 | |
时间(Time) | 使用关卡编辑器时,你可以使用此设置预览由分配的昼夜序列集合资产所决定的定向光源的位置。 你可以手动输入时间值,或拖动滑块以推移当日时间。 |
| PIE设置 | |
重载初始当日时间(Override Initial Time of Day) | 勾选方框后,时间滑块中当前设置的预览将作为在编辑器中运行(PIE)时的初始当日时间。 |
冻结PIE中的时间(Freeze Time in PIE) | 在该时间启动PIE时暂停昼夜循环。 |
| 操作 | |
打开根序列(Open Root Sequence) | 打开昼夜序列Actor上的根序列。 |
选择昼夜序列Actor(Select Day Sequence Actor) | 选择当前关卡中的昼夜序列Actor。 |
刷新昼夜序列Actor(Refresh Day Sequence Actor) | 刷新昼夜序列Actor中的主序列。 |
打开昼夜序列Actor(Open Day Sequence Actor) | 打开昼夜序列Actor蓝图。 |
设置昼夜序列Actor后,你可以使用时间(Time)滑块手动推移当日时间,就如同处理预配置的日月昼夜序列Actor那样。
如果无法使用当日时间工具栏中的时间(Time)滑块,请检查以下内容以确保已启用时间滑块:
昼夜序列子系统能感知到关卡中的昼夜序列Actor(详见下文"设置自定义当日时间系统")。
昼夜序列Actor拥有有效的根序列,即该根序列存在且至少包含1个子分段/子序列。 通常而言,这意味着昼夜序列Actor拥有有效的集合资产。
在大多数情况下,若时间滑块被禁用,则原因无非是缺失昼夜序列Actor、存在无集合的昼夜序列Actor,或昼夜序列集合为空。
昼夜序列Actor、组件和资产
昼夜序列插件提供了一系列运行时Actor、组件和资产,供你从零开始编译当日时间系统、修改关卡中现存的当日时间系统,以及一套完整的预配置当日时间系统,无需进行任何设置即可使用。
你可以使用的相关Actor、组件和资产的完整列表如下:
| 名称 | 说明 |
|---|---|
| 关卡Actor | |
昼夜序列Actor(Day Sequence Actor) | 一个可放置的Actor,负责在关卡中播放昼夜序列资产。 该Actor定义了:
昼夜序列Actor会动态地编译一个根序列,该根序列由多个子序列组成,子序列分别对应昼夜序列资产的输入列表,如定向光源、天空大气、体积云和雾等。 昼夜序列负责构造并管理根序列的播放。 |
基础昼夜序列Actor(Base Day Sequence Actor) | 一种自注册的昼夜序列Actor,包含一系列简单的光照组件,部分组件可选。 该Actor可按原样使用,也可按派生类扩展。 你可以查看 |
日月昼夜序列Actor(Sun Moon Day Sequence Actor) | 一种自注册的昼夜序列Actor,包含所有必要的光照组件,用于模拟物理上准确的24小时昼夜循环。 你可以将该Actor拖放到关卡中,以实现完整的当日时间系统。 |
昼夜序列修改器体积(Day Sequence Modifier Volume) | 该体积可在运行时为昼夜序列Actor注入程序生成的序列或用户创建的序列。 你可以在Gameplay过程中动态地启用、禁用这些序列,或调整其权重(以与其他子序列混合)。 |
| 资产 | |
昼夜序列集合(Day Sequence Collection) | 一种自定义数据资产,包含了一组集合条目。 集合条目包含了昼夜序列、偏差偏移和条件集。 该资产旨在帮你处理针对特定情况和用例而定制的序列组。 |
昼夜序列(Day Sequence) | 一种自定义序列资产,其播放范围可表示完整的昼夜循环。 |
根序列(Root Sequence) | 根序列是由昼夜序列Actor创建并管理的特定昼夜序列的名称。 点击当日时间视口工具栏中的打开根序列(Open Root Sequence)按钮即可访问根序列。 |
| 资产类型 | |
昼夜序列条件标签(Day Sequence Condition Tag) | 可与昼夜序列关联的布尔条件的抽象表示,用于实现基于任意条件(通常为可伸缩性设置)动态启用或禁用昼夜序列的逻辑复用。 |
昼夜序列条件集(Day Sequence Condition Set) | 关联式容器,用于映射条件标签至布尔值(即条件的"预期值")。 条件集可被求值,即对条件集中各个条件标签进行求值。若所有条件标签的求值结果均为其关联的预期值,则返回true,否则返回false。 |
程序化昼夜序列(Procedural Day Sequence) | 简单类型的昼夜序列,是任意程序化昼夜序列的抽象表示。 它们让用户定义的逻辑能基于一组公开的参数创建昼夜序列。 可作为示例的程序化序列有三种。 分别是:太阳角度序列、太阳位置序列、正弦序列。 你只能用C++创建程序化昼夜序列。 |
昼夜序列Actor
昼夜序列Actor是你创建所有当日时间系统的基础。 你需要在这里分配昼夜序列,并配置参数来决定当日时间系统在关卡中的行为。 当从零开始设置昼夜序列时,你需要使用此Actor添加其他环境光照组件,例如定向光源、天空大气、体积云、雾等。
日月昼夜序列Actor和基础昼夜序列Actor是两个示例,它们已预先配置了相应的光照组件,你可以直接在项目中使用,或探索其配置方式。
你可以使用关卡编辑器工具栏中的创建(Create)下拉菜单,将昼夜序列Actor添加到关卡中,并用细节(Details)面板为其添加光照组件。
昼夜序列Actor的设置项如下:
| 属性 | 说明 |
|---|---|
| 序列 | |
昼夜序列集合(Day Sequence Collection) | 一种自定义数据资产,包含了一组集合条目。 集合条目包含了昼夜序列、偏差偏移和条件集。 该资产旨在帮你处理针对特定情况和用例而定制的序列组。 |
集合偏差(Collection Bias) | 用户定义的偏差,由指定昼夜序列集合中的序列所应用。 |
| 预览 | |
当日时间预览(Time of Day Preview) | 设置要在关卡编辑器中预览的当日时间。 包含一个序列播放滑块,该滑块从昼夜序列资产中获取时间轴数据。 以此面板的"运行时昼夜循环(Runtime Day Cycle)"类别中的设置为基础,你可以使用此滑块推移当日时间循环。 此设置不会影响该当日时间循环的运行时开始时间,但如果你在关卡视口勾选了当日时间(Time of Day)菜单中的重载初始当日时间(Override Initial Time of Day)选项,则可将其用作游戏启动时昼夜循环的初始时间。 |
| 运行时昼夜循环 | |
序列更新间隔(Sequence Update Interval) | 昼夜循环视觉效果的应用频率。 出于性能原因,昼夜序列会采用时间切片/预算求值。 该数值越高,播放昼夜循环的成本越低。 然而,相应的代价是可能出现画面卡顿。 当该值较高(约为2)时,你会看到每两秒就出现阴影跳动现象。 通常而言,将更新间隔设为0到0.5之间时,效果最佳。 |
运行昼夜循环(Run Day Cycle) | 设置是否在运行时运行昼夜循环。 如果未勾选,昼夜循环将保持在由初始当日时间(Initial Time of Day)所设的指定时间。 |
日间插值曲线(Day Interp Curve) | 用户提供的插值曲线,将昼夜循环时间映射到所需的循环时间(通常为0至24小时)。 禁用时,循环将线性插值。 |
单日时长(Day Length) | 游戏时间中单一昼夜循环的长度。 仅用于设置某些逻辑,例如在指定的游戏时间触发特定事件。 默认的一天长度为游戏时间的24小时。 |
单次循环时间(Time Per Cycle) | 按世界时间算,完成一天的循环需要的时长。 如果该值与一天的实际时间相同,则意味着使用真实世界时间(即24小时)。 默认设置中,完成一天的循环需要的时长为五分钟。 |
初始当日时间(Initial Time of Day) | 设置昼夜循环开始时的初始时间。 默认的昼夜循环开始时间为早上6点。 |
昼夜序列修改器体积
你可以使用昼夜序列修改器体积重载关卡中的昼夜序列。 你可以使用这些体积为场景的根序列注入不同的昼夜序列,从而重载任意时间点的各种元素的外观。 此外,当昼夜序列进入或退出体积时,这些体积还可以控制其中的当日时间或其他组件。
下方示例展示了修改器体积如何利用单独分配的昼夜序列资产来更改当日时间和云层的覆盖程度。
使用关卡编辑器工具栏的创建(Create)下拉菜单,即可在关卡中添加昼夜序列修改器体积。 调整体积大小以覆盖其影响的区域。
昼夜序列修改器体积包含的内容如下:
| 属性 | 说明 |
|---|---|
| 昼夜序列 | |
体积形状组件(Volume Shape Component) | 设置后,修改器体积将使用形状组件。 否则使用默认的盒体组件。 |
偏差(Bias) | 该后期处理体积所用的用户定义偏差。 |
模式(Mode) | 决定修改器如何计算内部混合权重。 你可以选择体积或全局模式。
|
混合量(Blend Amount) | 此选项仅在体积(Volume)模式下可见。 定义有效混合权重为0.0到1.0(不包含)的区域。 |
混合策略(Blend Policy) | 决定修改器如何使用用户混合权重来计算有效混合权重。 选项包括:
|
用户混合权重(User Blend Weight) | 混合策略为忽略时,此设置不可用。 用户指定的混合权重。 最终混合权重取决于混合策略。 |
预览(Preview) | 启用后,你可以将摄像机位置移动到其边界内,从而在编辑器中预览此昼夜序列修改器。 |
使用集合(Use Collection) | 若未勾选,则可以为用户昼夜序列指定昼夜序列。 若勾选,则可以为昼夜序列集合插槽指定昼夜序列集合。 |
用户昼夜序列(User Day Sequence) | 要求不勾选使用集合(Use Collection)。 用户提供的昼夜序列资产。 |
昼夜序列集合(Day Sequence Collection) | 要求勾选使用集合(Use Collection)。 用户提供的昼夜序列集合资产。 |
平滑混合(Smooth Blending) | 勾选后,处于对应体积的混合区域内时,对昼夜序列的求值将被平滑处理。 这与序列更新间隔相关,因为平滑混合会暂时将更新间隔重载为较小的值。使用控制台变量 此选项可能会消耗大量资源。 请谨慎使用。 |
| 时间 | |
日夜循环(Day / Night Cycle) | 启用后,变更修改器控制昼夜循环时间的方式。 你可以从以下选项中选择:
|
昼夜序列集合资产
昼夜序列集合资产用于微调你所设置的当日时间系统。 该集合会添加对序列的引用,并允许配置序列条件和程序化昼夜序列参数。
在设置昼夜序列集合时,你要为该集合提供可引用的昼夜序列资产。 你还需要选择一种使用程序化昼夜序列类型,该序列会使用参数来确定定向光源(太阳和月亮)随时间推移而在天空中移动的方式。
你可以在内容浏览器中创建此类资产,具体方法是点击添加(+)图标,从杂项(Miscellaneous)卷展栏菜单中选择昼夜序列集合(Day Sequence Collection)。
昼夜序列插件包含了一个昼夜序列集合的示例,供你探索。 它在内容浏览器中的路径为:引擎(Engine) > 插件(Plugins) > 昼夜序列内容(DaySequence Content),名称为DSCA_24hr。 该集合需与日月昼夜序列Actor配合使用。
昼夜序列集合资产包含的内容如下:
| 属性 | 说明 |
|---|---|
| 昼夜序列 | |
序列(Sequence) | 此集合条目的昼夜序列资产。 |
偏差偏移(Bias Offset) | 分配给此集合条目的偏移层级偏差。 |
条件(Conditions) | 必须求出其预期值才能激活此条目的一组条件。 |
| 程序化昼夜序列 | |
索引(Index) | 提供任意程序化昼夜序列的各种抽象表示。 (详见下文。) |
程序化昼夜序列
程序化昼夜序列是一种选择类型,是任意程序化昼夜序列的抽象表示。 这些类型可以由任何人创建,以公开可定义的逻辑,从而以一组公开的参数为基础创建一个昼夜序列。
昼夜序列插件提供了三种类型的程序化昼夜序列。 具体是:
正弦序列(Sine Sequence)可根据正弦波为用户指定的属性制作动画。
太阳角度序列(Sun Angle Sequence)可线性制作太阳的动画。
太阳位置序列(Sun Position Sequence)可根据地理数据以物理准确的方式制作太阳的动画。
以上程序化昼夜序列均包含其专用的可由用户定义的参数:
目前,你只能用C++添加程序化昼夜序列。 未来你将能使用蓝图来创建此类序列。
昼夜序列资产
昼夜序列资产是所有当日时间循环的基本构建块。 昼夜序列与使用Sequencer的关卡序列类似,区别在于其播放范围始终为一天,并且会自动为关卡中的活动昼夜序列Actor绑定通道。
昼夜序列不与任何特定的Actor绑定。 相反,它们会为泛型根昼夜序列Actor所拥有的组件和属性制作动画,而该Actor会与昼夜序列Actor自动绑定。
你可以在内容浏览器中创建此类资产,具体方法是点击添加(+)图标,从杂项(Miscellaneous)卷展栏菜单中选择昼夜序列(Day Sequence)。
昼夜序列插件包含了一个昼夜序列的示例,供你探索。 它在内容浏览器中的路径为:引擎(Engine) > 插件(Plugins) > 昼夜序列内容(DaySequence Content),名称为DS_24hr。 该集合需与日月昼夜序列Actor配合使用。
下方是一个昼夜序列设置的示例,用于参考在当日时间循环范围内为其制作动画所用的某些光照组件和材质。 这些组件已设置完毕并被添加到关卡中的昼夜序列Actor中。
根昼夜序列
根昼夜序列是一种临时昼夜序列,它构成了整个昼夜循环,并由子序列组成。 显示的子序列数量取决于已添加到昼夜序列集合资产中的昼夜序列和程序化昼夜序列的数量。
点击当日时间(Time of Day)视口工具栏的打开根序列(Open Root Sequence)按钮,即可直接打开根序列。
关卡中的昼夜序列Actor负责播放这些序列。