《Unity着色器和屏幕特效开发秘笈》—— 2.3 让精灵表单动起来

简介:

本节书摘来自华章出版社《Unity着色器和屏幕特效开发秘笈》一 书中的第2章,第2.3节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.3 让精灵表单动起来

学习如何制作精灵表单动画对于我们是很有帮助的。它可以用于粒子特效,或翻书的效果,不过它最常用于2D侧卷轴游戏。
精灵表单,也可以称为精灵图集(sprite atlas),如果你不熟悉这个术语,你可以把它理解为一个巨大的图片,里面镶嵌了很多小图片,有时也称为图片序列。
screenshot

当你逐个遍历表中的每个小图片时,你会得到一个类似动画的效果。这个概念如同一个便签的翻页效果或者一部电影胶卷的帧图像一样。如果我们循环精灵表单的每一帧,我们将创建一个动画效果。
本节在编写代码时将使用一点点数学公式,不过不用担心,我们会逐行解释所编写的代码。

2.3.1 准备工作

为了能够测试我们的着色器代码,还应该做一些美术方面的工作。我们需要自己制作一个精灵表单或者在网上找一个。精灵表单并不复杂,它只需提供一个能够浏览的图像序列。
screenshot

创建一个新的材质和新的着色器,接着在场景视图中将你创建的材质设置为一个平面的材质。然后将精灵表单拖到材质的纹理上。

2.3.2 如何操作

输入如下代码使精灵动画着色器开始工作:
1.在着色器的Properties块中创建三个新属性。这样我们可以直接从材质Inspector面板中修改系统,而不必涉及代码:
screenshot

2.然后将输入的UV存储到独立变量,以便在代码中使用它们的值:
screenshot

3.下面,我们需要得到每个单元格的宽度。在精灵表单中,每个网格占用范围为0到1之间的值,所以我们需要计算每个网格的百分比值:
screenshot

4.接下来,我们必须使用系统自带的时间组件,这样我们才能使网格一个个地运动或者偏移起来:
screenshot

5.最后,我们计算出了精灵表单x方向上的UV偏移量。现在,你应该拥有了一个可以创造翻书效果的着色器。
screenshot

下面就是表面着色器使用物体的UV偏移实现的结果。同样,你应该相信下图其实是可以动起来的。
screenshot

2.3.3 实现原理

首先,我们从Input结构体中得到UV值,将其存到一个单独变量中。不过也不一定必须这样做,因为它只是一种相对较好的选择,而不是一个硬性的要求,这只是我们阅读代码的方式而已。在这里,我们将该变量命名为spriteUV,并且声明为float2变量类型。因为我们需要将网格UV的x和y坐标都存到一个变量中。
接下来,我们得到当前纹理的宽度大小,然后根据Properties块中的_CellAmount值将其划分成相同大小的小图片。假如我们有一个宽度是512的纹理,我们把它分为16个单元格,就会得到值32。这就是每个单元格的宽度,但是我们还需要得到每个单元格占整个图片的百分比,这是因为UV值的范围是在0~1之间或者0%~100%之间的。这样我们得到了cellPixelWidth变量(小单元格的宽度),然后除以纹理图片的总宽度。如果我们将32像素除以512像素,可以得到0.06或者纹理图片整个宽度的6%的值。这个值就表示我们从一个单元格到另一个单元格的UV偏移量。
然后,我们需要计算随时间增大的偏移值,这些值都是整数。 例如,一个整数值依次从0,1,2,3,4开始增大,直到增大到精灵表单中单元格的数目。为了做到这些,我们可以使用CGFX的内置函数fmod()。
screenshot

如果我们对x值使用fmod()函数并将它除以y值,会得到相除的余数。所以,当我们使用_Time代替x值,使用_CellAmount值代替y值后,就会得到一个随时间增加的返回值。并且当它的值等于_CellAmount值,它会重新从0开始增长。
得到随时间增长的值后,我们需要使用ceil()函数来确保该值是个整数而不是一个浮点数。该函数的基本功能就是向上取整,比如将1.5取整得到2。这样就可以得到整数0,1,2,3,4,...直到等于属性值_CellAmount。一旦达到单元格的数目大小时,它就重新归为0。
最后,我们得到Input?结构体中当前的UV值,然后计算百分比值、时间值还有单元格总数三者相乘的值,将得到的值加到刚才的UV值上。这样,我们就实现了从一个单元格到下个单元格的偏移,但是我们必须对UV值进行缩放使一个时间点只能看到一个单元格,要达到这种效果,我们将UV偏移量乘以百分比,得到最终的UV值。所以这些做完之后就可以将UV值放入tex2D函数中用于纹理渲染了。

2.3.4 更多内容

也许你已经注意到了,你不必只对一个方向进行偏移。就像我们在前面的章节中实现滚动纹理时使用了两个方向上的UV偏移,我们也可以实现一个2D的精灵表单动画。你只需在最后的偏移量上添加一个y方向上的偏移值。
这些步骤跟创建水平滚动一样,但是你可以在多维度里循环一个更大的精灵表单。虽然你做的只是增加了着色器的边数,但是最后可能会加入大量的着色器指令。这意味着它会影响应用程序的性能。
为了改善这一情况,我们可以将帧偏移选择的代码转移到C#脚本中,从而让CPU来分担GPU的部分负担。这其实要求我们在需要优化的时候对我们的应用程序进行一个平衡,在不损失后面元素的情况下,设计我们的应用程序。本书中包含了一个C#脚本,它演示了一个简单的精灵动画系统如何使用脚本将数据传递到着色器。它基本上是使用了时间计算,只是通过下面的代码将时间值传递给我们的着色器:

screenshot

相关文章
|
5月前
|
算法 vr&ar C#
使用Unity进行虚拟现实开发:深入探索与实践
【8月更文挑战第24天】使用Unity进行虚拟现实开发是一个充满挑战和机遇的过程。通过掌握Unity的VR开发技术,你可以创造出令人惊叹的VR体验,为用户带来前所未有的沉浸感和乐趣。随着技术的不断进步和应用场景的不断拓展,VR开发的未来充满了无限可能。希望本文能为你提供有用的指导和启发!
|
4月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
399 0
|
4月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
171 0
|
5月前
|
vr&ar 图形学 开发者
步入未来科技前沿:全方位解读Unity在VR/AR开发中的应用技巧,带你轻松打造震撼人心的沉浸式虚拟现实与增强现实体验——附详细示例代码与实战指南
【8月更文挑战第31天】虚拟现实(VR)和增强现实(AR)技术正深刻改变生活,从教育、娱乐到医疗、工业,应用广泛。Unity作为强大的游戏开发引擎,适用于构建高质量的VR/AR应用,支持Oculus Rift、HTC Vive、Microsoft HoloLens、ARKit和ARCore等平台。本文将介绍如何使用Unity创建沉浸式虚拟体验,包括设置项目、添加相机、处理用户输入等,并通过具体示例代码展示实现过程。无论是完全沉浸式的VR体验,还是将数字内容叠加到现实世界的AR应用,Unity均提供了所需的一切工具。
194 0
|
7月前
|
C# 图形学 C++
使用vscode开发C#+unity没有代码提示问题
使用vscode开发C#+unity没有代码提示问题
121 0
使用vscode开发C#+unity没有代码提示问题
|
7月前
|
图形学
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏4(附项目源码)
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏4(附项目源码)
107 0
|
7月前
|
图形学
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏3(附项目源码)
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏3(附项目源码)
138 0
|
7月前
|
图形学 索引
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏1(附项目源码)
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏1(附项目源码)
173 0
|
8月前
|
图形学
【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】
【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】
|
8月前
|
算法 安全 图形学
Unity Hololens2开发|(十一)MRTK3 Solver(求解器)
Unity Hololens2开发|(十一)MRTK3 Solver(求解器)