unity打包图集作用:减少drawcall,提高性能;

Sprite Packer unity以前打包图集的方式,该功能在windows/sprite packer,如果功能不可用,打开目录edit/project setting/editor,更改sprite packer的mode,在下拉列表中 disabled不启用、enabled for builds(legacy sprite packer)打包时启用(针对sprite packer这种打包方式)、always enabled(legacy sprite packer)总是启用(针对sprite packer这种)、enabled for builds打包时启用(针对sprite Atlas这种打包方式)、always enabled(针对sprite Atlas)如图:

unity spriterender 只显示一部分 unity sprite packer_ide


然后将你要打包的sprite的packing tag设为相同名字,如图:

unity spriterender 只显示一部分 unity sprite packer_System_02


在点击sprite packer面板左上角的pack即可打包成功。

关于sprite packer有三点说明一下:

1:在Resources文件夹下的sprite无法打包;

2:带alpha的sprite和不带alpha的sprite不会打包到同一图集;

3:sprite packer将逐渐被sprite Atlas替代;Sprite Atlas unity2017版本后增加的功能,在资源面板上,右击create–sprite Atlas即可创建出来。type为master的,图集的一些参数可以设置来影响图集的品质和大小。objects for packing 下点击+即可添加你想打包的sprite或者文件夹或者sprite和文件夹的混合形式。如图:

unity spriterender 只显示一部分 unity sprite packer_System_03


type为variant的,为原有图集的一个变种。它会复制原有图集的贴图,并根据一个比例系数(scale)来调整复制贴图的大小。这样的Variant通常用于为高分辨率和低分辨率的屏幕准备不同的图集如图:

unity spriterender 只显示一部分 unity sprite packer_贴图_04


另外可以用代码控制打包的图集中的sprite哦,并且还可以放在Resources文件夹下打包图集和访问,部分代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D; //引用spriteAtlas类对应的类库
public class spriteAlatsController : MonoBehaviour {

    SpriteAtlas myAtlas;
    SpriteRenderer spriteTest;
    // Use this for initialization
    void Start ()
    {
        spriteTest = GameObject.Find("SpriteTest").GetComponent<SpriteRenderer>();
    }

    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
           myAtlas =(SpriteAtlas)Resources.Load("firstSpriteAltas");
           print(myAtlas);
            //.GetSprite("name") 通过图集中某一sprite的名字得到对应的精灵;
           Sprite changedSprite = myAtlas.GetSprite("backGround4"); 
            //换装
           spriteTest.sprite = changedSprite;
        }
    }
}

再来说说一个有趣实用的东东:sprite mask 精灵遮罩

把sprite拖入场景中,在sprite属性面板上的sprite renderer上有一个mask interaction就是配合遮罩使用的。

unity spriterender 只显示一部分 unity sprite packer_System_05

提供的sprite mask属性图片如下:

unity spriterender 只显示一部分 unity sprite packer_ide_06


当mask interaction为visible inside mask时,表现如图:

unity spriterender 只显示一部分 unity sprite packer_贴图_07


当mask interaction为visible outside mask时,表现如图:

unity spriterender 只显示一部分 unity sprite packer_System_08


上述sprite mask会对场景中所有设置了mask interaction的sprite产生作用,那么如何有选择性控制呢,提供两种方案:

一:在sprite mask属性面板上添加sorting group ,然后把要产生遮罩作用的sprite放在sprite mask下(子物体),不是其子物体的不会被影响;

二:勾选mask属性上的custom range ,然后设置sorting layer和order in layer,配合sprite的sorting layer和order in layer设置就可(当sprite的order in layer值处在mask的front-order in layer和back-order in layer之间时可行);最后mask的alpha cutoff如果要起作用,那么sprite的alpha source应该选择from gray scale(灰度图),如图:

unity spriterender 只显示一部分 unity sprite packer_ide_09

调整alpha cutoff大小的动态图献上:

unity spriterender 只显示一部分 unity sprite packer_贴图_10