之前对于unity得图集管理不是很了解,所以也无法做SpriteAtlas与之前的SpritePacker谁好谁坏的比较。但是按照更新就是对现有物体功能得升级来看,SpriteAtlas还是不错的,最起码对于不同性能得平台处理不同得分辨率图集来说SpriteAtlas得方便性完胜SpritePacker。
废话不多说下面进入正题:
No1.SpriteAtlas像大多数unity资源一样可以直接在Assets文件里面创建,在Project视图点击鼠标右键->Create->SpriteAtlas
No2.在进行使用SpriteAtlas之前我们需要进行一步配置
选中我们创建得SpriteAtlas点击unity菜单栏 ->Editor->Project Setting->Editor
在Inspector视图出现如下面板
**
在SpritePacker选项上点击AlwaysEnable确保我们创建的SpriteAtlas一直可以被使用
No3.下面说下SpriteAtls得属性面板
首先我们看下官方API 介绍
属性 | 介绍 |
---|---|
Type | 将Atlas的类型设置为Master或Variant。 |
Include in Build | 选中以在构建中包含Atlas Asset。请注意,取消选中此选项会导致在播放模式期间不呈现任何打包的资产。 |
Allow Rotation | 允许Sprite旋转以进行包装。 |
Tight Packing | 在包装过程中使用Sprite轮廓来装配它们而不是矩形网格概述。 |
Padding | 打包的Sprite纹理之间的额外填充量。 |
Read/Write Enable | 设置为true以允许脚本可读/写纹理数据。设置为false以防止脚本读取/写入纹理数据。 |
Generate Mip Maps | 选择此项以启用mipmap生成。 |
sRGB | 纹理存储在伽马空间中。 |
Filter Mode | 选择纹理的过滤方式。这将覆盖打包的Sprites的原始纹理设置。 |
Default Texture settings panel | 设置默认选项(使用默认值),然后使用面板顶部的按钮覆盖特定平台。 |
Objects For Packing | 选择要打包到Atlas中的对象。符合条件的对象可以是文件夹,纹理和精灵。 |
关于Type属性官方给出的解释是:
解释:意思就是说你再次可以重新创建一个或多个SpriteAtlas (为了方便我们叫他们副本,之前创建的那个SpriteAtlas叫做原文件),把副本得Type属性选择为Variant,然后将之前原文件拖拽到副本的MasterAtlas上面。
做完这些操作之后,这些副本即表示是原文件的一个复制SpriteAtlas,在副本上得图集以及精灵和源文件上面的一模一样,他们得区别在于:副本含有一个Scale属性,这个属性得范围0-1,调整这个值会改变副本中图集以及精灵得清晰度。
在实际项目中我们可以根据不同性能得机器,选择不同Scale值得副本或者清晰度最高的原文件。
关于Include in Build
Include in Build的意思时当我们勾选的时候在我们发布项目的时候unity会把此图集打进资源包,例如发布安卓平台时如果勾选此选项,则在我们的APK中会包含此图集的包文件。
当我们使用了AssetsBundle打包时如果选择打包了此文件则不需要勾选此选项,避免多占用不必要的空间。
添加图集
在Objects for Packing
上面上有一个加号,点击加号可以选择文件夹,Sprite,以及Texture 2D。
在选择文件夹时会把当前文件夹里面的Sprite以及Texture2D文件添加到SpriteAtlas
在我们选择图集使用的时候,脚本需要引用using UnityEngine.U2D;
private SpriteAtlas spriteAtlas;//创建SpriteAtls
private Sprite GetSpriteFormSpriteAtlas(string spriteName)
{
return spriteAtlas.GetSprite(spriteName);//得到名称为spriteName的sprite
}
如果我们打成AB包可以选择 回调得到并改变UI的sprite
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.U2D;
using UnityEngine.UI;
using System;
using System.IO;
public class tet : MonoBehaviour
{
private SpriteAtlas spriteAtlas;
public Image image;
private void Start()
{
RequestAtlas("sa.unity3d", ShowAtlas);
}
void RequestAtlas(string tag, System.Action<SpriteAtlas> callback)
{
var ab = AssetBundle.LoadFromFileAsync(Path.Combine(Application.streamingAssetsPath,tag));
string name = tag.Split('.')[0];
var sa = ab.assetBundle.LoadAsset<SpriteAtlas>(name);
callback(sa);
}
void ShowAtlas(SpriteAtlas spriteAtlas)
{
image.sprite = spriteAtlas.GetSprite("3333");
}
}