Unity2018 利用ShaderGraph着色器视图实现炫酷的物体消融特效

伴随着Unity2018.1的正式发布,许多重要的功能也正式跟开发者见面了,我们今天要介绍的Shader Graph着色器视图就是其中之一。Shader Graph着色器视图为开发者提供了一套可视化的着色器开发环境,它通过连接节点图的方式来实现Shader逻辑,既省去了编码调试的繁琐,也不用在代码编辑窗口和Unity之间来回切换查看效果。

在Unity官方技术直播课程中,我们为大家介绍了Shader Graph着色器视图的安装和使用,也介绍了一些实例来帮助大家熟悉Shader Graph的功能。今天我们将通过本文为大家介绍如何用Shader Graph着色器视图来实现消融特效。消融特效是一种在游戏中非常常见的特效,我们常常在物体消失的时候使用这样的特效,当然也可以用在物体出现的时候。

下面二张图分别表示了二种不同的消融效果,左图是表面不规则的消融,右图是按照特定的方向消融。我们将会介绍如何实现这二种不同的效果。

114943z9tadd26623ej3sd
不规则消融
不规则消融效果的实现主要包括二个步骤,首先就是让物体的表面无规则的消失,就像冰块消融在地上一样。然后就是绘制边缘,有的消融效果会有明显的边缘,例如:被火点燃的报纸,燃烧和未燃烧部分有一个明显的边界。

1、实现表面消融
实现表面消融功能的实现很容易,主要是利用一张噪音贴图来映射表面的Alpha值,然后通过控制AlphaTest的值来控制表面区域的显示。由于噪音贴图的不规则性,当AphaTest的值从0到1变化的时候,物体就会逐步无规则的消失掉。ShaderGraph着色器视图的节点图如下图所示。

114943dnnnikkqrrl2ri2r
其中噪音贴图我们使用了ShaderGraph着色器视图内置的SimpleNoise节点,这是一种程序化生成的噪音贴图。同时,我们通过属性节点DissolveAmount作为AlphaClipTreshhold的输入,这样就可以在游戏中使用脚本控制物体消融的动画。

2、绘制消融边缘
首先我们需要找到这个边缘区域,从上面的步骤中可以看到,噪音贴图中小于DissolveAmount的区域即是被剪裁的区域,如果稍微增加一点DissolveAmount,我们就可以得到和显示部分重叠的区域,如下图所示。

114943vkktui1korqjxiiu
上图中圆形部分可以看作被剪裁区域,橙色圆圈外部的扩展部分可视为边缘区域。下面我们就来看下ShaderGraph着色器视图中的具体实现步骤。
114945ijot9je8toegwlw1
首先我们增加了一个EdgeSize的属性节点,并设定值为0.05,大小可以根据实际效果进行调整。然后我们用DissolveAmount 加上 EdgeSize 后再减去噪音值,得到扩展后的剪裁区域。之后利用Step函数把这部分区域的值都变为1,最后再乘以边缘颜色。经过以上步骤我们就初步实现了带边缘的消融效果。
114947h0nnbbib0bibnb5c
以上效果在场景中添加了Unity Postprocessing Stack的Bloom效果,所以颜色显得更加光亮。
114948rngeai35ia235sqa
对于一些燃烧的效果,边缘可能需要渐变色。我们可以利用一张渐变色贴图来进行颜色采样。
114948fs9qeblbefoko3hs
实现上和之前稍有不同,对于扩展后的剪裁区域,我们不再是直接利用Step把值都变为1,因为我们需要利用这部分的渐变数值进行贴图采样。由于这部分的数值偏小,不能直接对应到渐变色贴图的uv坐标,所以在采样之前对数值进行了倍数放大,实际节点图如下所示。
114951hiee04dz9hvmxvsd运行效果如下图所示。
114953qf2k1nbe1v6fjbz6
沿固定方向的消融效果
除了不规则的消融,沿固定方向的消融效果也比较常见。和之前利用噪音贴图来映射Alpha值不同的是,我们需要根据位置来映射Alpha值。例如:我们溶解的方向是自上而下溶解,那么我们需要表面像素的Alpha值从低往上映射到[0,1]区间。

如下图所示,我们主要通过二步来实现了这个映射。首先利用点积把坐标映射到溶解的方向,当前所取方向为(0,1,0)。通过这一步,坐标被映射到[-1,1]这个区间。然后再利用remap把坐标映射到[0,1]区间。

114955zuuaxui4hau0i45t
接下来是添加边缘色。首先需要确定边缘区域,我们还是通过扩展一点剪裁区域作为边缘。表示为公式为:
step(MappedAlpha – EdgeSize,  DissolveAmount)

其中MappedAlpha是上一步计算的Alpha映射值,EdgeSize表示边缘的大小。通过上述公式,我们可以找到扩展的剪裁区域。确定好边缘区域,我们需要进行上色。在本例中,我们使用了像素风格的边缘效果。为了实现像素风格的边缘,我们需要把uv映射到一张像素风格的贴图上。

这个例子中,我们直接使用了计算的方式。公式如下:
FinalColor = step( 0.5, randomRange( floor( uv * k ) ) ) * InColor

通过把uv乘以一个倍数k,再进行floor运算,可以把uv映射到[0,1,……,k-1]的整数数列上,这样就可以把连续值进行离散化。从而实现像素风格的边缘效果。具体实现如下图所示。

114959zic9diimppqxz9vi
运行效果如下图所示。
115000hvuu1tz4jqgrslrv
小结
通过本文介绍,我们可以看到消融效果主要是通过AlphaTest技术来控制表面区域的显示,因此我们需要针对不同的效果实现不同的Alpha映射,对于不规则消融,我们使用噪音贴图来映射;对于方向性的消融,我们使用坐标转换的方式进行映射。

另外,使用Shader Graph着色器视图来实现,整个中间过程都暴露在你面前,因此可以很方便的对于效果进行调整,比如边缘的宽度,颜色,以及像素方块的大小等等。后续我们还会继续介绍基于ShaderGraph着色器视图开发的效果,帮助大家更多的了解这个新的功能。更多精彩技术教程尽在Unity中文官方技术社区(UnityChina.cn) !

简化你的工作流程-Unity Hub (Beta)

Unity Hub最新推出的用于简化工作流程的桌面端应用程序,现已提供测试版本。它提供了一个统一的地方用于管理Unity项目、简化下载、查找以及安装多个Unity版本。而且它还能帮你了解快速上手的功能,例如新出的模板功能。赶紧来尝试使用Unity Hub吧 !

下载Unity Hub(Beta) 
Windows: https://public-cdn.cloud.unity3d.com/hub/prod/UnityHubSetup.exe
Mac: https://public-cdn.cloud.unity3d.com/hub/prod/UnityHubSetup.dmg

Unity Hub介绍
Unity Hub桌面端应用程序旨在简化你打开Unity的方式。初识Unity Hub,你可能觉得它似乎没什么特别之处,但实际上它有着不少新功能。

首先它是一个与Unity编辑器分开的独立应用程序。这是简化工作流程的重要步骤。如果你经常使用Unity,下面的文件夹截图或许就是你启动Unity的时候需要面对的。

这个文件夹里存在不同版本的Unity文件夹,它们没有与你的Unity项目一一关联。这可不好。既然这是很多用户开始时经历的问题,我们便打算从它开始说起。

Unity Hub功能介绍

整合Unity编辑器的管理
Unity Hub有一个专用区域用于查找和下载Unity编辑器的版本。你可以轻松找到并下载最新版本的Unity,包括beta测试版本。而且,你还可以手动加入已经安装到电脑中的Unity编辑器版本。若想安装Unity,只需点击“Download”进行下载即可。如果你想要一次安装多个,它们会组成队列,按顺序下载。

一旦下载完成后,你便可以设置自己常用的Unity版本,也可轻松在项目视图中启动其它版本。

从技术上而言,这意味着你可以同时启动运行二个版本的Unity。但是为了避免本地冲突和其它未知问题,同一个项目应只由一个Unity编辑器打开。

安装结束后获取组件
在过去获取附加组件的最佳时机,例如增加特定平台支持、Visual Studio、离线文档和标准资源等,最好是在初始安装过程中进行。在之后做这些事会十分痛苦,你要么去重新运行下载助手(基本上需要重新安装),要么查找和安装独立组件来使用。如今当你通过Unity Hub下载一个版本的编辑器时,你可以轻松找到并添加所需的额外组件。

访问模板功能
随着Unity Hub的推出,我们也发布一个全新的功能,称作Templates(模板)。模板就是预设项目,用于快速启动常见项目类型的创建过程。当你开始一个新项目时,Unity中有不少默认设置需要更改。而且这些设置如何更改取决于你构思中的项目“原型”。模板能让我们针对目标游戏类型和特定视觉保真度进行批量预设。

这些模板中附带了优化过的Unity项目以及一些预制件和资源,用来帮助你开始进行项目开发。模板的其中一个优点是,它们能展示给用户难以发现的一些功能和设置。请一定要尝试使用模板功能,因为你或许会发现一些之前从未知道的新鲜而有用的东西。

本次发布的版本中有五个模板类型:

  • 标准2D项目
  • 标准3D项目
  • (预览版)小型游戏项目(用于移动端和低配机器)
  • (预览版)高分辨率项目(高质量视效,用于高配设备)
  • (预览版)小型VR项目

Unity Hub的未来
我们为你的Unity体验加入了很多改善用户体验的设计。管理安装版本和项目只是一个开始。我们想要让Unity Hub更为实用,让它成为开始使用和管理Unity的最佳工具。我们不打算仅仅停留在优化和简化流程上,我们还想让你的开发体验更为愉悦。有朝一日,我们希望Unity Hub能达成以下这些目标:

  • 单点登录:可以在任意机器上登录并访问你所有的Unity功能和资源。你将能够离线工作。
  • 实时活动:提供有关你的Unity项目、团队、服务和新闻的实用信息。
  • 整合访问:轻松发现并使用Unity的各项功能,例如教程和Asset Store资源商店。
  • 更好的上手体验:为Unity新用户提供一体化的使用体验。

小结
赶紧试用Unity Hub,相信它一定能带给你惊喜。如果你对Unity Hub或模板类型还有更多想法请在Unity中文官方论坛(Unitychina.cn)!

Unity 对象放置和物理效果

在Spotlight团队中,我们和优秀的Unity开发人员一起合作,深度挖掘Unity在游戏开发中的潜力。针对复杂图形、性能和设计方面的问题,我们看到了各种具有创新性的优秀解决方案。我们也看到了同样的问题与解决方案不断的反复出现。

 

最佳实践系列文章将探讨我们在与客户合作时遇到的一些常见的问题。这些都是我们的合作团队辛苦得出的经验和教训,我们很自豪能够和大家分享他们的智慧。这其中的很多问题只有在真正制作主机游戏、手机游戏、或者处理巨量游戏内容时才会出现。如果能在开发早期就将这些问题考虑进去,那么开发过程就会更轻松,而游戏也会更炫酷。

将对象放置到理想位置
尽管摆放对象是在Unity中最为常见的任务之一,我们还是看到不少团队为了如何能更好地完成这项工作而苦恼。要把对象排列完美,不让角色跑出世界,不让寻路出现障碍,并让各个物理对象能够放置在理想的位置,这的确不是件轻松的事。

Unity提供了一些工具来方便处理这个问题,这些工具各自扮演着不同的角色。尤其是在我们想要制作大量重复使用的内容,或是制作一张图放置了大量动态物理对象的场景,了解这些工具的使用方法则尤为重要。

使用正确的辅助工具
Unity中提供了变换、旋转和缩放工具,在Unity 2017.3中还加入了能同时拥有这三个功能的通用工具。这些小工具能在3D环境下修改游戏对象的变换属性。除此之外,还有2D环境下处理对象的矩形变换工具(Rect Transform)。

所有这些辅助工具的运作方式都与其所处的工作模式直接相关。如果将模式设为中心(Center),辅助工具将使用根据对象边界计算得出的对象中心点。这个计算结果是个近似值,所以在处理复杂对象时或许会感觉该中心点偏移了真正的中心点。

如果将辅助工具模式设为轴心(Pivot),辅助工具将使用对象自身引用框的原点(0,0,0)。这个轴心点是由创建该资源的作者在制作时设定的。通常需要将对象按照彼此相对的位置进行摆放时,我们推荐使用轴心模式,而且在制作资源时要留意轴心点的位置。

第二个切换按钮,全局/局部(Global / Local)切换按钮,确定了操作对象时所处的空间。设为全局(Global)意味着辅助工具将会对齐世界(x,y,z)坐标轴,而设为局部(Local)将会对齐对象自身的(x,y,z)坐标轴。通常我们需要在局部空间下处理对象。但如果我们想要让多个对象互相对齐,则会切换到全局坐标系,并使用网格对齐工具来排列对象。

吸附对象
在Unity中,最为直接的定位工具是按下CTRL键(Windows系统)或是Command键(OSX系统)来吸附网格。在我们通过坐标轴手柄(也就是分别为蓝、红、绿的坐标轴辅助工具)来移动对象时,按下吸附键会让对象根据当前网格大小计算的增量而移动,这个增量可以自行修改。

自动吸附设置(Snap Settings)菜单能为网格大小设置每个轴的数值,让我们控制旋转角度和缩放大小的吸附,还能将所选对象的当前变换属性近似取其最近的网格线。

吸附所有坐标轴(Snap All Axes)按钮在排列任意对象时十分有用。我们可以选择一组对象,将它们在坐标轴上吸附到网格,然后重新定位,这样就能把他们排列好了。效果如下图所示:

这个方法在处理规则几何体、大型关卡布局和设置碰撞块时十分管用。如果我们需要处理更为复杂的放置情况,则需要下面这些工具。

顶点吸附

在使用变换工具时按住V,变换辅助工具会切换为顶点吸附模式,显示为一个小方框。然后点击所选对象网格上的一个顶点,将其拖到光标下的任意顶点上。在处理任意网格的对齐时,尤其是要处理那些复杂的或是不存在碰撞的网格对齐时,这个方法很实用。

在上图中,不管是电线还是台灯都没有紧凑的碰撞网格,而且它们也都不是规则的立方体,所以它们不能用网格吸附或碰撞吸附处理。

如果需要这样放置多个游戏对象,我们也可以将顶点吸附模式保持在打开状态。按下Ctrl+Shift+V打开,按下Ctrl+V关闭。这样便不需要一直按住V就能顶点吸附多个对象了。

碰撞吸附
按下CTRL + SHIFT可以启用碰撞吸附。启用后,必须拖拽变换辅助工具中心的黄色小方框,而不是使用坐标轴控制工具。这样会让所选对象与光标下对象的碰撞体相对齐。

用顶点吸附或网格吸附来对齐网格在处理静态几何体时十分出色,但如果要处理动态对象,比如说互相穿透并在触碰后发射到空中的对象时,应该吸附到碰撞体而不是可见网格。

碰撞安置
如果有大量动态物理对象,或是十分复杂的关节系统,利用碰撞吸附来放置对象也许就不太合适。幸运的是,现在Unity编辑器中可以运行PhysX。它能模拟几秒的游戏时间,完成物理效果,然后保存完成时对象的位置信息。

当了解了何时和为何使用网格、顶点吸附、碰撞吸附时,我们将在关卡设计工作流程获得更好的开发体验。推荐开发者们多多尝试这些工具,例如:对比轴心(Pivot)和中心(Center)模式的区别,或是比较全局(Global)和局部(Local)模式的不同,这样就可以知道什么模式更为适合。花费在布置虚拟对象的时间越少,那么在开发时得到的乐趣就越多。