Unity项目Lost Crypt分析-6
水面倒影的Trigger
水面环境有一个Collider,作为Trigger。当带有Player标签的物体进入时,激活Mirror摄像机,退出时禁用Mirror摄像机。
image.png
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag(activatorTag))
{
foreach (var obj in objects)
obj.SetActive(true);
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (deactivateOnExit && collision.CompareTag(activatorTag))
{
foreach (var obj in objects)
obj.SetActive(false);
}
}
Mirror相机
Mirror相机是一个URP相机,连文档都还没写出来。参见:https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.1/manual/camera.html
我们只好根据hint来猜测。它从水面上的一片区域获取画面,并输出到一个Render Texture。
image.png
从下图也可以看到,水面上的倒影就是Mirror Camera采集到的区域。
image.png
水面
水面非常巧妙地分成了三个部分,顶面,侧面和倒影。
接下来来看水面的Shader:
这部分用来计算出上下两端较亮的分量,计算方式就是对Y的分布取平方,正负的图相叠加。
image.png
接下来来看波光粼粼的部分,这种变换的部分还是老套路:随时间变化的量施加于噪声。
image.png
这里的Voronoi图叫做泰森多边形,是一组由连接两邻点线段的垂直平分线组成的连续多边形组成。一个泰森多边形内的任一点到构成该多边形的控制点的距离小于到其他多边形控制点的距离
image
这里把变化的量施加给了泰森多边形的角偏移分量。
然后做调整,做完Power之后白色区域明显收缩,这也是很有用的一个技巧。
image.png
得到的波光粼粼的效果会分成三路,其中两路分别作为波光和alpha。另一路会叠加到倒影上,作为扰动添加。
再来看倒影的部分。首先还是老套路:时间变量施加于噪声。这里的变化是先分成两路,分别施加于正负Y坐标,让Y随时间变化。注意这里的x=0.18。对噪声做了水平的拉伸。对UV的操作跟你想要对图形的操作恰好是相反的,如果想放大图形,就缩小UV,如果想让图像向下,就增加V,向上,就减少V。
从图中可以看到,把上下的噪声同时相加,产生波纹的效果。
image.png
波纹作为输入与一个强度控制分量相乘。Remap用于把一个值映射到另一个范围内。例如,如果直接让用户输入0到0.02之间的数字的话,不便于输入,所以让用户输入0到1之间的数,然后我们把它映射到0到0.02,就方便了。图中的Preview作为Lerp的T分量给予,效果为在顶端更强地把效果(波动)向B(此处为0,全黑,无波动)偏移,也就是在顶端让它更少地波动。
image.png
当看到下面这个图的时候我愣了半天。左边是一个二维向量,怎么能作为X?后来查了一下才发现自己理解有偏差,这些噪声节点,生成的都是Vector1,一维的。我们看到的波动效果是因为Unity给我们在UV上进行了展示,并考虑了time的因素。那么作为一维的数据,我们只是可以理解为这个数据的变化,符合这个噪声的概率分布。把x具有高斯噪声分布,y具有voronoi噪声分布的UV作为偏移量,赋值给Sprite Render(此处将会是Mirror Camera采集的倒影)
image.png
另外,这里的UV默认值取 {1, -1} 非常重要,才能恰当地造成物体的微小形变效果和倒立效果:
image.png
当我把基础值改成{1,1}后,角色就不是倒影了:
image.png
那么来看Water - side,它使用了同样的shader,为什么看不到倒影呢?只是因为它的颜色设置成了比较深的黑色,如果设置成白色也就看的到了。下图是把颜色修改成白色之后的效果:
image.png
Water-Caustic的shader比Water-top的要简单的多,内容也类似,就不细看了。