Unity2D 编辑裁切纹理
图片素材导入
2D模式下Texture Type导入默认为Sprite(2D and UI)
裁切精灵集合
- Sprite Mode选Multiple(告诉Unity这张图片由多张序列组成)
- Filter Mode 为Point(no filter)
- 点击Apply应用设置
- 单击Sprite Editor打开裁切窗口
- 单击裁切窗口左上角Slice按钮,Type设置为Automatic、pivot设置为Center、Method设置为Smart,然后单击Slice,最后点击Apply应用设置
小技巧
Pixels Per Unit是什么?(在导入图片的设置中)
Pixels Per Unit就是每个Unity单元格的像素大小为什么把Pixels Per Unit设置那么小?
Pixels Per Unit就是每个Unity单元格的像素大小为什么修改Filter Mode为Point?
对于像素资源来说,point模式可以让它看上去更加干净、清晰。为什么要选择Truecolor?
Compressed模式是压缩格式,体积小,但牺牲质量
Truecolor模式是真彩格式,最大程度上还原图片信息
Unity2D 如何使用Sprite Packer
Unity内置的Sprite Packer打包工具
- 选中所有要打包的图片
- Packing tag里输入Player(打包集合的名称),然后点Apply
- 顶端菜单Window-Sprite Packer
- 点击打开窗口左上角Pack
Unity内置的Sprite Packer打包工具
Sprite Packer有三种打包模式,分别是
① DefaultPackerPolicy
② TightRotateEnabledSpritePackerPolicy
③ TightPackerPolicy
DefaultPackerPolicy
默认的打包方式,也是矩形打包方式。此模式会把所有的小图按照矩形的方式来排列,如果有宽高不一样的图片,他们会自动补齐。
TightRotateEnabledSpritePackerPolicy
是紧密可选择打包方式,即尽可能的把图片都打包在纹理上,这种方式最节省空间。
TightPackerPolicy
是紧密打包方式,也就是尽可能的把图片都打包在纹理上,这种方式要比DefaultPackerPolicy打包的图片更多一点,也更节省空间。
验证Sprite Packer打包效果
- 将图片对象拖至场景中,在Statistics面板中查看Batches数值
- 运行时查看数值变化(若变小,则说明节点优化过)
解除Sprite Packer打包
- 停止游戏,选中刚刚打包的所有文件,删除Inspector面板上的Packing Tag文本框中的Player字符,单击Apply。
- 解除了打包效果
Unity2D 自动适应所有设备分辨率-正交摄像的自动变焦
摄像机的两种类型
Unity中摄像机的两种类型:透视摄像机(3D 游戏)与正交摄像机(2D游戏)
正交摄像机动态变焦的实用场景
根据不同设备的分辨率调整正交摄像机的对焦距离,也就是动态调整Unity中Camera的Size值,确保游戏中所有场景元素都在摄像机的观察范围之内。
摄像机对焦距离(camera size)的计算方法
例子:对于一个800像素 x640像素且单元比例(Pixel to Units)为100像素的游戏场景来说,它的比例值就是场景高度640像素除以单位比例100像素等于6.4
因为一般设置正交摄像机处于游戏场景中央位置,所以它的Size值为比例值 6.4的一半3.2,所以我们要设置摄像机尺寸(Size)为3.2。
创建C#脚本来实现正交摄像机的自动对焦
- 右键新建C#脚本,命名为PixelPerfect-Camera
- 删除自带的Start()和Update()方法
- 具体代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PixelPerfectCamera : MonoBehaviour
{
//单位格像素大小
public static float pixelToUnit = 100f;
//比例值
public static float scale = 1f;
//默认分辨率 其他分辨率下,游戏会根据这个分辨率的比例动态的等比例缩放
public Vector2 nativeResolution = new Vector2(1136,640);
//初始化摄像机
void Awake()
{
//创建摄像机变量并获取实例
var camera = GetComponent<Camera>();
//判断是否为正交摄像机
if (camera.orthographic){
//计算比例
scale = Screen.height / nativeResolution.y;
//单位像素比例值
pixelToUnit *= scale;
//给正交摄像机赋值
camera.orthographicSize = (Screen.height / 2) / pixelToUnit;
}
}
}
将代码保存,将脚本文件拖至Main Camera上
Unity2D 手动创建循环背景
手动创建循环背景
- 打开Assets-textures中floor-texture材质。然后修改如下参数:Texture Type设置为Texture、Wrap Mode设置为Repeat、Filter Mode设置为Point,点击Apply
- 菜单栏中选择GameObject–>3D Object–>Quad命令,创建一个矩形3D对象。Quad对象可以很直观的被位移和形变,所有在项目中比较常用的Quad对象都可以作为游戏元素对象的载体
- 双击Hierarchy中的Quad对象,unity可以为用户缩放到最佳视角
- 在Hierarchy面板中的修改Quad参数,使它可以在x轴上平铺整个游戏界面。将Position的Y设置为-3.5,将Scale设置为15
- 在Assets文件夹中新建一个文件夹用来存放Quad需要的材质。单击鼠标右键,选择Assets–>Create–>Folder命令,将这个文件夹命名为Materials
- 在Materials文件夹中创建一个新材质(选择Assets->Create->Material命令),将其命名为floor_materails
- 在floor_materails的着色器下拉列表中选择不透明度的混合模式,即选择Shader->Mobile->Particles-Alpha Blended选项
- 刚才选择材质时,我们选择刚刚编辑好的floor-texture
- 把刚刚创建好的floor_materails材质拖到Quad对象上,会发现此时这个Quad地面背景是被拉伸变形的,下面就来修复这个问题。
- 选中floor_materails材质后,在Inspector面板中设置Tiling X属性为15(即需要15块材质来填充)。这样就可以解决图像拉伸变形的问题了。当然也可以通过修改Y值实现一些大型背景(比如砖墙、铁块墙等),我们可以修改Offset值来修改x、y坐标的间歇值。这里创建的是地面背景,所有只需要设置Tiling X坐标就可以啦。
小技巧
Quad对象与Plane对象的区别
Quad对象与Plane对象非常类似,但是Quad对象是由两个三角形组成的,而Plane则由一个面组成。我们在2D模式下看Quad对象像一个平面,但是在3D模式下它就是一个立方体。所以不需要关心Quad的Z轴,但需要关心Quad的Position Z的位置,如果把这个参数设置的太大,就会被其他对象遮挡,毕竟Quad是用来创建一个背景地面的。我们可以把Quad的面无限缩放来是硬件2D游戏中所有的美术资源。Paeticles的着色器介绍
下面针对Mobile->Particles的着色器混合模式做一下简要介绍
- Alpha Blended:主要用于半透明效果,类似于玻璃
- Addtive:相加混合模式
- Multiply:相乘混合模式
- Vertexlit Blended:渲染路径模式贴图、纹理、材质的区别
- 纹理是最基本的数据输入单位,游戏领域基本上使用的都是位图
- 贴图(Map)包含另一层含义,就是“映射”。其功能就是把纹理通过UV坐标映射到物体表面。贴图包含除纹理外的其他很多信息。
- 材质是一个数据集,主要功能就是给渲染器提供数据和光照算法。贴图就是其中数据的一部分,根据用途不同,贴图也会被分成不同的类型。
Unity2D 创建循环背景自适应脚本
循环背景自适应脚本的编写
- 在Script文件夹中创建一个名为TiledBackground的C#脚本。然后双击打开。
- 在写代码之前,首先要确定的是循环背景单独一块瓦砾材质的尺寸,在Unity的Inspector面板中可以看到它的尺寸是128 x 128,我们需要使用这个值来计算填充所需的个数,因此可以在脚本中创建一个变量来存储这个材质尺寸:
public int textureSize = 128
原理:如何计算填充材质的数量
要制作一个地面循环材质,首先需要计算出需要多少块瓦砾材质才可以填充屏幕的宽度,当然瓦砾的宽度略大于屏幕的宽度,所以我们在计算时需要把块数值正向取整数。需要注意的是pixels per unit(每个单元格的像素)值,在计算循环背景载体宽度时需要使用这个值,同时我们还需要考虑到摄像机为了自适应做的变焦比例值(scale),所以在计算尺寸的时候一定要除以这个值,否则就会出现误差。
我们会使用一些简单的数学方法来计算出循环背景载体的宽度来适应所有的屏幕分辨率(因为我们这个循环背景只是一个循环地面,所以不需要考虑高度)。
- 删除update方法,然后创建两个变量来分别存储单位格像素与瓦砾材质像素
- 计算需要多少个瓦砾材质才可以填充当前屏幕的分辨率,而且要保证瓦砾的宽度一定不能小于屏幕的宽度。所以计算出来的值,需要向上取整,这样瓦砾材质的宽度就可以略大于屏幕的宽度了。这里使用math方法里面的Ceil方法。Ceil方法可以正向取最大值,unity有自己的math方法—mathf,接下来来获取屏幕的宽度,使用屏幕宽度除以瓦砾宽度,最后乘以摄像机的变焦比例(scale)。这个比例非常重要,因为摄像机为了自适应所有屏幕分辨率会对整体游戏场景的缩放,所有要乘以这个值。
- 现在使用一些简单的数学方法来计算出循环背景载体的宽度比例,来适应所有屏幕分辨率(因为这个循环背景只是一个循环地面所有我们不需要考虑高度),我们使用transform local scale来访问它的比例属性,创建一个新的vector 3来赋值。为什么有时候用vector3来调整坐标(x,y)值,有的时候又用vector3?这是因为Quad是3D对象,它的比例和位置属性都使用vector 3来赋值,这里有一个重点需要注意,即在设置local scale的时候如果把Z值设置为0,图像就会消失。
- 上一节我们介绍了Tiling值,也就是瓦砾材质块数的赋值,我们现在需要使用脚本来设置这个值。首先我们需要获取当前组件瓦砾材质的引用,在这里我们使用getComponent方法,进入Renderer引用中找到材质,再使用material texture scale 给vector 3赋值。
把TileBackground脚本拖至Quad对象上,单机运行按钮
具体代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TileBackground : MonoBehaviour {
//单位格像素值
public static float pixelToUnit = 100f ;
//瓦砾材质的尺寸
public int textureSize = 128 ;
// Use this for initialization
void Start () {
//计算当前屏幕分辨率需要几块瓦砾来填充
var newWidth = Mathf.Ceil(Screen.width/(textureSize * PixelPerfectCamera.scale)) ;
//计算出了new width的值,为Quad赋值的Vector3的X值为newWidth乘以textureSize,
//再除以pixelToUnit,Y值保持1,因为地面没有在Y方向上的拉伸,Z值也是1
//Quad的宽高比例值
transform.localScale = new Vector3((newWidth * textureSize)/pixelToUnit,1,1);
//材质中的Tiling的X、Y值就等于material texture scale的X、Y值
//所以把newWidth和newHeight的值赋给Vector3的X、Y即可
//为瓦砾材质块数赋值
GetComponent<Renderer>().material.mainTextureScale = new Vector3(newWidth, 1, 1);
}
}
小技巧
图形尺寸运算原理
这里需要注意的是所有美术图片资源的内存计算都是2ⁿ,所有材质一般都是16、32、64、128这样的尺寸。所以如果需要修改背景尺寸,清保持2ⁿ,这样可以大幅提升图像运算效率,节约系统损耗。初始化方法的选择
Awake()方法运行优先级高于Start()方法,所以这里使用Start()方法初始化方法确保所有的初始化参数都正确再运行