请扫描以上二维码-下载本节项目源文件
01 循环背景自适应脚本的编写02 原理:如何计算填充材料数量
为了让我们的循环背景可以自动适应任何屏幕分辨率,我们现在需要创建一个脚本来实现这个功能。
步骤1: 在 Scripts 文件夹中创建一个名为 Tiled Background 的c#脚本。然后双击它,使用Unity自带的脚本编辑软件MonoDevelop 打开它。
步骤2: 在写代码之前,首先要确定的是循环背景单独一块瓦砾材质的尺寸,在Unity的 Inspector 面板中可以看到它的尺寸是128×128,我们需要使用这个值来计算填充所需的个数,因此可以在脚本中创建一个变量来存储这个材质尺寸:
public int textureSize = 128
要制作一个地面循环材质,首先需要计算出需要多少块瓦砾材质才可以填充屏幕的宽度,当然瓦砾的宽度需要略大于屏幕的宽度,所以我们在计算时需要把块数值正向取整数。需要注意是pixels per unit(每个单元格的像素)值,在计算循环背景载体宽度时需要使用这个值,同时我们还需要考虑到摄像机为了自适应做的变焦比例值(scale),所以在计算尺寸的时候一定要除以这个值,否则就会出现误差。
我们会使用一些简单的数学方法来计算出循环背景载体的宽度来适应所有的屏幕分辨率(因为我们这个循环背景只是一个循环地面,所以不需要考虑高度)。
接下来开始编写脚本代码。
步骤1: 首先删除系统自动创建的update方法,这里不需要使用到它,然后创建两个变量来分别存储 单元格像素值 与 瓦砾材质尺寸 。
步骤2: 计算出需要多少个瓦砾材质才可以填充当前屏幕的分辨率,而且要保证瓦砾的宽度一定不能小于屏幕的宽度。所以计算出来的值,需要向上取整数,这样瓦砾材质的宽度就可以略大于屏幕宽度了。这里使用math方法里的Ceil方法。Ceil方法可以实现正向取最大值,Unity有自己的math方法—Mathf,接下来来获取屏幕的宽度,使用屏幕宽度除以瓦砾宽度,最后乘以摄像机变焦比例(scale)。这个比例非常重要,因为摄像机为了自适应所有屏幕分辨率会对整体游戏场景进行缩放,所以需要乘以这个值。
这里需要注意的是所有美术图片资源的内存计算都是2 n ,所有材质一般都是16、32、64、128这样的尺寸,如果需要修改背景尺寸,请保持2 n ,这样可以大幅提升图像运算效率,节约系统消耗。
步骤3: 现在使用一些简单的数学方法来计算出循环背景载体的宽度比例,来适应所有屏幕分辨率(因为这个循环背景只是一个循环地面所以我们不需要考虑高度),我们使用transform local scale来访问它的比例属性,创建一个新的vector 3来赋值。为什么有时候用vector2来调整坐标( x , y )值,有的时候又使用vector3?这是因为Quad是3D对象,它的比例和位置属性都使用vector 3来赋值,这里有一个重点需要注意,即在设置localscale的时候如果把 Z 值设置成0,图像就会消失。
我们已经计算出了new width的值,为Quad赋值的Vector3的 X 值为newWidth乘以textureSize,再除以pixelToUnit, Y 值保持1,因为地面没有在 Y 方向拉伸, Z 值也是1。c#代码如下:
步骤4: 上一节介绍了Tiling值,也就是瓦砾材质块数赋值,我们现在需要使用脚本来设置这个值。首先需要获取当前组件瓦砾材质的引用,在这里我们使用getComponent方法,进入Renderer引用中找到材质,再使用material texture scale给vector 3赋值。
材质中的Tiling X 、 Y 值就等于material texture scale的 X 、 Y 值,所以把newWidth和newHeight的值赋给Vector3的 X 、 Y 即可。c#代码如下:
Awake()方法运行优先级高于Start()方法,所以这里使用Start()初始化方法确保所有的初始化参数都正确后再运行。
步骤5: 把TileBackground脚本拖到Quad对象上,单击 运行 按钮。
步骤6: 在运行程序后,可以在 Inspector 面板中看见 scale 值自动变化了,这说明我们的脚本已经开始工作了,我们也可以在 Tile Background(Script) 选项下手动修改材质的尺寸。这个属性正是在脚本中编写的这个公共属性:
小结: 本节学习了如何使用脚本横向自动填充屏幕,在项目中也有可能需要平铺整个屏幕,如果大家有兴趣可以自己修改代码来实现一些功能。