type
status
date
slug
summary
tags
category
icon
password
Video preview
主要讲了Dead Zone的生成切换,以及相关攻击特效。

目标

  • 体现死域的威胁感
    • 此区域对玩家有威胁感
    • 和其他区域有鲜明的对比
    • 区域内除了有乱长的根茎、尖刺外,还要强调恢复过程
  • 实时性
    • 场景区域转换最好是实时的
    • 除了在过场动画中有实时改变,游玩时角色行为也会触发转换
    • 通过VFX讲好Rot(腐灵)故事(表现、设定等)
    • Kena拥有控制Rot的能力后,相关技能会触发场景转换
 
notion image
 
 

原型1展示

第一个prototype是基于物理的,dead zone效果是通过场景中碰撞体和相关模型展现的。
这个原型效果实际上是在可用级别,但是从设计考虑毙掉了。
简单来说,就是通过物理系统进行消除dead zone的操作,由此进行区域转换,还是很好理解的。

原型2展示

通过一张RenderTexture对Rot影响范围做一个遮罩,其他材质采样这张RT来进行相关变化。
原型2的问题在于dead zone内的模型将顶点垂直向下推入到terrain中,这会出现一些artifact。
此外,因为是实时移动顶点以贴近RT范围的方法,所以这需要Mesh的顶点数较多,贴近地表的植被也需要被取代掉。
同时,碰撞体也比较难做,因为并不想根据模型区域动态修改碰撞体形状。这个版本同样基于碰撞,角色攻击将地形上dead zone的碰撞关闭,以此更新RT。
碰撞体的方案也会导致navmesh相关的问题。
 
最后可以看到这个版本dead zone的清除不是完全实时的。
dead zone消失后生长出来的蓝色、紫色的花都是在镜头黑一下之后,播放动画展现的。

构建DeadZone引擎

  • Landscape - terrain的基本层级
  • Foliage - 植被叶子的生成和清除
  • Dead Zone Meshes - 更大的dead zone网格
  • Lighting and Ambience - 光照、环境光

Landscape

 
notion image
分为两层,UE中层级勾选No Weight-Blend
notion image
DeadMask用于使基本地形展现腐败的样子。
Harmful Deadzone 指示玩家在范围内减速并掉血。
 
  • DeadMask降低baseColor的对比度,增加一点光滑度。
  • 不同的tiled map覆盖在基本地形上,使边缘更加清楚一点。
  • 修改了物理材质,这样可以判断玩家是否站在上面。
 

清除dead zone

画一张从上向下的RT。
R通道为干净状态的mask,用于标记哪些区域被清理(状态转换)了,这个值也可以用于制作渐变:
 
补充:实际上是两个RT,用类似于级联阴影的方式进行分级,近处的精度高,远处的用于远景保持状态。
与级联阴影一样,RT保证贴近到像素以避免artifact。
 
缺点是没有办法进行垂直高度的分级,但在实际使用中影响不大。

Foliage

地表植物(蕨类等)增加场景的丰富程度和纵深感。使用UE自带的Instanced Foliage来放置和渲染植物资产。
notion image
为了适应Deadzone的切换,每一个植物资产上有两种树叶类型,也就有两种材质方便切换。
本来想做成通过一个property(类似于一个float)来在一个shader上实现两种效果,但这比想象的更麻烦:增加shader复杂度、传入property的范围很难控制,应用范围狭窄(只在转换中的区域效果好)。因此在这里做了一个权衡,直接用了两套材质球。
notion image
这里同样通过RT的R通道来判断切换区域。
有些mesh在切换后消失了,这是在vertex shader中进行了缩放。
这会导致植物密度进行了改变,气氛也有修改(毕竟有模型隐藏掉了)。
notion image
所以添加了一个B通道用于其它类型的植被的生长。
添加一个新的通道,是为了想让🌼的生长比起landspace切换更慢一点。
这也会让玩家更明显的体会到landspace切换后,对比度的变化,从而让场景更加丰富、富有活力。
 
这有个很明显的问题,在区域内外,永远都存在两套植被资源(一套显示,一套scale为0隐藏),他们尝试写了一些代码去干掉instanced植被scale为0的mesh,不过没时间去调了,所以就仅保证效果正确,起码scale是0的应该是会被cull掉。
 
G通道用在另一个功能:过度生长上
notion image
过度生长会让植被对比度更高(更鲜艳了!),会让植被长得更大。这会让场景变得更具有动画感。
 
最终结果:
可以看到B通道会比R通道更慢一些,而G通道是不会保留的。
 

Deadzone Meshes

notion image
这些mesh在dead zone中生长,阻挡玩家步伐,切换区域状态后可以正常通行。
这些mesh使用蓝图而不是instanced foliage,原因是不想采样RT,只修改碰撞体就行,另外清理过程速度很快,所以没太大必要,够用。(有性能问题)
notion image
 
mesh消失就是基于噪声的溶解,添加了一些粒子特效、扭曲等丰富最终效果。
一些植被溶解成了另一种材质。
 
但有性能问题:
在材质中逐基元存储自定义数据
Choose your operating system: 使用 自定义基元数据 (CPD)工作流时,利用材质将自定义数据存储在可通过蓝图和代码访问的索引数组中,以影响场景基元的修改。其功能与类似,可用于在运行时通过标量和向量参数动态控制材质图表的各部分。区别在于,CPD的优势是将数据存储在基元自身而非材质实例上,减少了关卡中类似几何体(如墙壁、地板或其他重复几何体)的绘制调用次数。 自定义基元数据可通过以下方式用于场景基元: 设置标量和向量材质参数,控制材质逻辑的各部分。对要动态设置和控制的参数,启用 使用自定义基元数据(Use Custom Primitive Data) 。 对于已设置此选项的参数,向其指定可在蓝图或代码中引用的唯一 基元数据索引 。 使用蓝图中的 Set Custom Primitive Data 节点设置和控制自定义数据数组中存储值的材质参数。 使用 标量(Scalar) 和 向量参数(Vector Parameter) 表达式控制材质图表的各部分,与驱动 材质实例中材质可控部分 的方式类似。选择参数后,使用 细节(Details) 面板启用该表达式的 使用自定义基元数据(Use Custom Primitive Data) 。 启用后参数在其给定命名下显示"自定义基元数据",并在数组中显示指定指数。 基元数据索引(Primitive Data Index) 值会设置存储此参数的指定索引。此索引用于蓝图和代码中的引用。 在标量(浮点)参数上设置索引时,该索引为使用的索引。在向量参数上进行相同操作时,将在所有输出上设置浮点值,共有四个输出。例如,在向量参数上将基元数据索引设为0,将向索引0、1、2和3指定浮点值;所有RGBA输出各指定一个。 通过蓝图并使用以下节点访问场景基元,即使用自定义基元数据: 此类节点无需字符串与参数命名匹配。相反,其使用指定 基元数据索引(Primitive Data Index) 逐基元设置和获取数组中的数据。 在材质内访问该数组中的自定义数据,与使用材质实例中的材质参数类似。区别在于,在参数节点上的材质中,参数必须为匹配字符串的统一参数,而非匹配数字的索引。 使用 细节(Details) 面板为场景基元设置自定义基元数据的默认值,将数组元素添加至 自定义基元数据(Custom Primitive Data) 数组中。 各个编号数组元素都引用具有对应值的自定义基元数据索引。若数组元素不存在索引,则其将被忽略。若要手动调整某些值,但不附加蓝图或不创建材质实例来加以控制,则非常适合使用此方法设置默认值。 以下范例展示了使用多个(标量和向量)参数驱动的简单材质,在向量参数中随机选择颜色,并通过图表中的材质逻辑设置场景中网格体的发射率和对象范围。蓝图用于驱动已存储自定义数据的此类参数。 对于材质设置,已在材质图表中的选定参数上启用 使用自定义基元数据(Use Custom Primitive Data) : 底色(Base Color) 和 自发光(Emissive) 强度由两个参数驱动:名为"颜色参数"的向量4参数和名为"自发光功率"的标量参数。 此图表的第二部分使用逻辑统一缩放其在关卡中指定的网格体。名为"Scale_XYZ"的标量参数控制指定对象的缩放量: 利用参数上的自定义数据(如MID),可在运行时使用蓝图或代码完成更改。下图展示了在此类材质参数中设置并保存值,以设置随机颜色、其发射率及游戏会话开始时的初始缩放。 在Event BeginPlay上,在蓝图中使用 Set Custom Primitive Data 节点初始化两个CPD参数的颜色和缩放值。 两个Set节点上的 数据索引 使用材质中的相同 基元数据索引 初始化材质参数。 在Event Tick上,Set节点引用CPD参数的基元数据索引,并基于Delay节点各tick设置的随机时间,设置新的颜色和自发光强度。XYZ的随机浮点值(在材质的向量参数表达式中转换为RGB值)范围将设置颜色。同时使用浮点值的界定范围设置自发光强度。 设置和使用Event Tick时需谨慎。出于本次演示目的,建议采用快速测试和调试,但运行时不适合持续使用。 此例结果为一种采用受蓝图控制CPD参数的材质,其使用材质参数设置网格体的颜色、发射率和缩放。 本页对比了CPD的设置和使用,与类似。现在先对各操作所需材质和蓝图设置进行比较,便于理解: 材质设置仅需使用CPD的参数启用 使用自定义基元数据(Use Custom Primitive Data),并设置之后会在蓝图中引用的 基元数据索引 ...
在材质中逐基元存储自定义数据
notion image
主意这是per primitive设置的,也就是一个mesh上有多个材质球,给不同的data是做不到的。因此如果想要达到这样的效果,就退回到蓝图版本。

Lighting and Ambience

科娜全实时光,通过Custom post-process volumes控制不同区域的氛围。
  • lighting & fog
  • 制作了预制(方便切换,方便版本管理)
  • 通过toggle切换污染前后的不同氛围
 

Rot Abilities

腐灵技能
notion image

目标

  • 腐灵能被收集
  • 在区域清理时能够发挥作用
 
腐灵的制作包含这些:
  • 动画mesh
  • Niagara粒子
 
动画mesh方便,制作了lowpoly的mesh跟随动画曲线,一般技能中跟随的mesh顶点数并不是很多。
这些mesh也会对衣物等有物理影响。
 
Niagara这里并不是很懂,希望大佬能看一下。
大概意思是有两种版本的动画,一个版本是mesh动画,另一个版本是通过Niagara来控制的,这样能达到性能和效果的平衡,并且方便程序控制。
 
Niagara通过这个动画曲线来控制,他也会出现在模型动画内部。
 
然后是看不懂的Niagara参数,通过动画曲线控制,使得Niagara粒子匹配模型动画的运动。
 
技能动画分三个部分:
 
  1. geometry cache:
 
  1. Niagara粒子
  1. Skeletal Mesh
 
 
此外,技能会影响之前说的RT,绘制时会判断与地面的距离,来影响绘制颜色的强度。
 

总结

notion image
整体场景制作基于分层的思想进行制作,通过绘制RT的系统来对场景进行交互影响。
博客修改记录Vision Pro——苹果给XR开发者的新可能