【Unity组件知识】如何在Unity2020以后版本中打包图集

文章目录

前言

一、打包图集步骤

1.导入2D Sprite包

2.开启图集打包的功能

3.创建Sprite Atlas文件

4.添加要打包的图片或者文件夹

二、图集的使用

 三、关于SpritePacker的Mode介绍

四、Sprite Altas基本属性

1.Type

扫描二维码关注公众号,回复: 14761044 查看本文章

2.Master(主图集)

3.Variant(变体)

4.Texture

5.Objects for Pakcing

6.Pack Preview按钮

重点说明

注意事项


前言

        在Unity中,通常渲染一个纹理会调用一次DrawCall。一个2D项目,可能包含大量的纹理,如果绘制每个纹理都调用一次DrawCall,这会占用过多的资源,从而影响整个应用程序的性能。为了降低性能消耗,我们可以使用精灵图集(Sprite Atlas)技术,它能够将多个纹理(texture)合并成一个大纹理,当访问图集中的多个纹理时,也只需要调用一次DrawCall 。

        Unity2020之后的版本,弃用了旧版的SpritePacker,图片设置中的Packing Tag变灰,无法修改。需要使用新版的Sprite Atlas进行图集打包。

一、打包图集步骤

1.导入2D Sprite包

        选择Window->Package Manager,选中Unity Registry,然后找到2D Sprite,将其导入到项目中。

2.开启图集打包的功能

        选择Edit -> Project Settings -> Editor,将SpritePacker的Mode切换为你所需要的模式。我这里选择了Sprite Atlas V1 - Always Enabled。

3.创建Sprite Atlas文件

        在Project视图点击鼠标右键,Create->2D->Sprite Atlas。

4.添加要打包的图片或者文件夹

        将要打包的图片或文件夹,放置到图集文件的Objects for Packing中。然后单击PackPreview按钮,可以看到图集预览。

二、图集的使用

  • 直接在场景中使用原图片

  • 通过GetSprite方法获取图片
using UnityEngine;
using UnityEngine.U2D;
using UnityEngine.UI;

public class UIPanel : MonoBehaviour
{
    public SpriteAtlas atlas;
    public Image img;
    private void Start()
    {
        img.sprite = atlas.GetSprite("Rank");
    }
}

 三、关于SpritePacker的Mode介绍

  • Disabled

        禁用图集相关功能。

  • Sprite Atlas V1 - Enabled For Builds

        仅当发布(Build)的时候构建图集,在Editor和Play模式中引用原始纹理而非图集中的纹理。

  • Sprite Atlas V1 - Always Enabled

        在运行时(Build和Play模式)引用图集中的纹理,在Editor模式中引用原始纹理。

  • Sprite Atlas V2 (Experimental) - Enabled :

        Unity2020.3版本这个功能还处于实验中,默认在运行时引用图集中的纹理。

        Sprite Atlas V1 不支持缓存服务器(Cache Server),Unity只能将打包的图集数据存储在Library/AtlasCache文件夹中,并且也不能有依赖项,不支持命名对象导入器(named objects importer),而Sprite Atlas V2提供了对上述功能的支持。具体可以参考Unity Manual:Sprite Atlas version 2 (Experimental)

四、Sprite Altas基本属性

1.Type

        设置精灵图集的类型,默认为Master(主图集),也可以设置为Variant(变体图集)。

2.Master(主图集)

  • Include in Build

        是否在运行时使用到图集中的Sprite时自动将图集加载到内存中。

        Unity在打包的项目中会包含图集,并且在运行时自动加载它们,取消勾选图集的Include in Build选项可以禁用此行为。

        如果禁用Include in Build,Unity仍会将图集打包到项目Assets文件夹中的** .spriteatlas * 文件中,只是运行的时候不会加载到内存中。因此,当精灵引用已禁用的图集中的纹理,由于引用纹理不可用或未加载(not available or loaded),该纹理将无法被找到,引用它的图片将显示为空白。此时要加载精灵图集,必须使用脚本通过后期绑定(Late Binding)执行此操作。代码如下:

using UnityEngine;
using UnityEngine.U2D; //引用SpriteAtlas的命名空间!
public class SpriteAtlasTest : MonoBehaviour 
{
    //如果勾选了Include Build属性,在启动游戏时自动进行以下操作
    //SpriteAtlasManager是在运行期间管理SpriteAtlas的一个类,它包含atlasRequested和atlasRegisterer两个事件
    //atlasRequested事件:当一个Sprite打包进了图集,但是在运行期间无法找到该图集的位置时触发。
    //atlasRegistered事件:SpriteAtlas加载完成后调用

    private void OnEnable()
    {
        SpriteAtlasManager.atlasRegistered += AtlasRegistered;
        SpriteAtlasManager.atlasRequested += AtlasRequest;
    }

    private void OnDisable()
    {
        SpriteAtlasManager.atlasRegistered -= AtlasRegistered;
        SpriteAtlasManager.atlasRequested -= AtlasRequest;
    }

    private void AtlasRegistered(SpriteAtlas spriteAtlas)
    {
        Debug.LogFormat("Registered {0}.", spriteAtlas.name);
        Sprite sprite = spriteAtlas.GetSprite("AnimPic_0");
        Debug.Log("从图集中获取到的Sprite:" + sprite.name);
    }

    private void AtlasRequest(string tag, Action<SpriteAtlas> callback)
    {
        var sa = Resources.Load<SpriteAtlas>(tag);
        callback(sa);
    }
}
  • Allow Rotation

        运行打包的时候旋转精灵Sprite,这样可以最大限度的提供图集中Sprite的密度。

        此选项默认为勾选状态,如果是画布中的UI元素则推荐关闭该选项,因为在图集中旋转了的Sprite在场景中也会旋转。

  • Tight Packing

        根据Sprite的轮廓而非Sprite外部矩形的轮廓来打包。这样可以提高图集中Sprite的密度。

        勾选后使用精度更高的裁剪图集图片(Mesh裁剪),否则是矩阵裁剪(图片是一块矩形图)。

        如果不需要高精度裁剪则取消勾选,如果发现裁剪出的图片显示不正确,则勾选。

  • Padding

        定义图集中Sprite之间的像素间距,防止Sprite之间出现重叠,默认值为4。

3.Variant(变体)

  • Master Atlas

        设置主图集内容的副本作为自己的内容。

  • Include in Build
  • Scale

        设置变体图集的缩放因子,介入0.1~1之间。

4.Texture

  • Read/Write Enabled

        是否运行通过脚本函数访问纹理数据,例如Texture2D.SetPixels函数。如果启用,Unity会创建纹理副本,这将导致所需内存翻倍,并且只适用于未压缩纹理或DXT纹理。

  • Generate Mip Maps

        是否生成MipMap。

  • sRGB

        是否将纹理存储在伽马(Gamma)空间中。

  • Filter Mode

        设置图集中纹理的滤波模式。

  • Show Platform Settings For

5.Objects for Pakcing

        添加Sprite,将列表中的所有Sprite打包到图集中。可放入Texture2D、Sprite、文件夹。放入文件夹时会将文件夹下的所有Texture2D、Sprite放入图集。

6.Pack Preview按钮

        点击后会在预览界面显示出图集的具体数值,如图集的内部表现、空间大小、尺寸、使用的压缩格式。

        注意:在Sprite Atlas V2中,如果对图集有修改,要点击该按钮保存更改。

重点说明

        变体图集的主要目的是创建与主图集不同分辨率的图集。主图集中Sprite的分辨力*Scale(缩放因子)得到的结果就是变体图集中Sprite的分辨率,它自身不包含Objects for Packing属性,因此变体图集中的内容都是主图集的副本。

        当项目中既有主图集,又有该主图集的变体图集时,可以使用这两个图集中任意一个的Sprite。如果要自动从变体图集而不是主图集中加载Sprite,那就仅为变体图集启用Include in Build选项,并关闭主图集的这个选项。

注意事项

        当图集中有一个Sprite处于活跃状态时,Unity会加载该Sprite所属图集中的所有纹理。如果一个图集中有许多纹理,而场景中只有一个纹理被引用,那么整个图集都会被加载,会造成较大的内存消耗。

        解决该问题的方法:(可能会造成DrawCall增加)

  • 将场景中激活的所有或大多是纹理都打包到同一个图集;
  •  根据纹理的常见用途将其分别打包成多个较小的图集。

猜你喜欢

转载自blog.csdn.net/yokixiang/article/details/127970560