Unity2018 图集的使用

本文介绍了Unity2018中图集SpriteAtlas的使用,强调了其降低DrawCall的作用。通过创建和管理SpriteAtlas,可以优化游戏性能。Unity提供了Include in build功能,但在打包AB时可能导致资源重复。为解决这个问题,文章详细讲解了Late Binding的概念,通过注册SpriteAtlasManager.atlasRequested回调,确保在需要时正确加载图集资源。

使用图集的好处是降低DrawCall,如果不将UI图片合并到一个图集中,每个图片都将占用一个DrawCall。

untiy2018提供了创建SpriteAtlas的功能,相较于老版的Sprite Packer提供了更加灵活的控制方式。

SpriteAtlas可以在Project窗口中创建,然后将图片添加到SpriteAtlas的Objects for Packing中即可,点击PackPreview即可查看生成的图集。

Unity默认提供了图集的Include in build功能,就是在项目构建时默认包含图集资源,在运行时如果需要某个图集中的Sprite时就会加载这个图集。

但是在生成AB时就会产生一个问题,在做UI时一定会把Sprite填到Image中,这时再UI的AB包和SpriteAtlas的AB包中都会包含图集资源,这样同一个资源就包含在了两个AB包中。

如果需要打AB包,就要把Include in build 选项禁用掉。但如果禁用,载入UI时会找不到图片所在的图集,无法正常显示图片。所以Unity又提供了Late Binding功能。就是在使用某一图集中的图片资源之时,会先发出一个事件,告诉你我要用的图片在哪个图集资源中,事件中有个回调函数,你要做的就是在回调中传入这个图集资源,这样Unity就得到了这个图集,可以正常显示图片了。

我们要做的就是在脚本中注册 SpriteAtlasManager.atlasRequested += RequestAtlas; 回调,在需要某个图集中的Sprite时,会在回调中传入此图集的名称,我们只需载入此图集即可。

using UnityEngine;
using System.IO;
using System.Collections;
using UnityEngine.U2D;
public class AssetBundleLoader : MonoBehaviour {
	void Awake(){
		SpriteAtlasManager.atlasRequested += RequestAtlas;
	}
	void OnD
### 如何在 Unity 2022 中创建和使用 Sprite Atlas #### 创建 Sprite Atlas 资源 为了优化游戏性能并减少 Draw Call 数量,在 Unity 2022 中可以利用 Sprite Atlas 来打包多个精灵图像到单个纹理中。要创建一个新的 Sprite Atlas,可以通过右键点击项目窗口中的任意空白处,选择 `Create -> Sprites -> Sprite Atlas` 或者通过菜单栏依次点击 `Assets -> Create -> Sprites -> Sprite Atlas`[^1]。 #### 添加精灵至图集中 一旦创建好 Sprite Atlas 后,就可以向其中添加需要被打包在一起的精灵资源了。这一步骤可通过拖拽的方式完成——只需将目标精灵文件直接从项目视窗拖放到所选中的 Sprite Atlas 上即可;另外也可以展开该 atlas 的 Inspector 面板下的 "Sprites" 属性列表来手动挑选想要加入集合内的各个 sprite 对象[^2]。 #### 设置打包参数 对于每一个被纳入管理范围之内的 Sprite Asset,都可以单独调整其属性配置选项。例如,可以在 Inspector 窗口中修改特定图片的质量等级或是裁剪模式等设置。此外,还能够指定整个 atlas 使用相同的材质球以及定义打包规则(如是否允许旋转、缩放),从而更好地控制最终输出效果及内存占用情况[^3]。 #### 应用 Sprite Atlas 到场景对象上 当所有的准备工作都完成后,则可开始考虑怎样把已经构建好的 Sprite Atlas 实际应用起来。通常情况下,只需要简单地更改那些原本各自关联着独立 texture 的 GameObjects 所使用的素材引用指向新的 atlas 即可实现无缝切换。具体操作是在相应组件(比如 Image 组件)里找到 Source Image 字段,并从中选取来自当前编辑的那个 atlas 下面的一个合适项作为替代品[^4]。 ```csharp // 示例代码展示如何程序化访问SpriteAtlas及其内部成员 using UnityEngine; public class Example : MonoBehaviour { public SpriteAtlas myAtlas; // 将此字段分配给Inspector面板上的某个实际存在的atlas实例 void Start() { // 获取名为"example_sprite_name"的sprite Sprite desiredSprite = myAtlas.GetSprite("example_sprite_name"); // 假设有一个Image类型的UI控件, 可以这样改变它的显示内容: GetComponent<UnityEngine.UI.Image>().overrideSprite = desiredSprite; } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值