生活随笔
收集整理的這篇文章主要介紹了
Unity UGUI图集打包与动态使用(TexturePacker)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
TexturePacker
在用UGUI時,我們需要將一個個小圖打包成圖集,然后將圖集一次性加載以內(nèi)存換取圖片讀取效率,即減小Drawcall。
UGUI打包并使用圖集有兩種方法:一種是使用系統(tǒng)自帶的打包工具SpritePacker,這種方法限制比較多;一種是使用TexturePacker打包圖片并使用。
先打開TexturePacker把小圖打包成我們所需要的圖集,打包的格式要注意是"Unity - Texture2D sprite sheet"
打包之后會有一個.png和一個.tpsheet,直接將這兩個文件放在工程資源中即可,此時從工程看這只是一張大圖,并不能算是一個圖集。雖然可以用Unity自帶的圖片裁剪的功能,但裁剪的小圖大小基本不對。
接下來需要下載并導(dǎo)入一個Unity的插件,在Asset Story搜索TexturePacker Importer并導(dǎo)入,不用進(jìn)行任何操作,插件會自己根據(jù).tpsheet將剛才打包好放進(jìn)入工程的大圖自動裁剪成小圖,點開圖集如下:
我們只需像處理單獨小圖一樣,將圖集里的小圖拖進(jìn)Source Image里即可。此時我們只能在編輯器里設(shè)置使用圖集,還不能真正使用小圖。
我們還需要在程序中動態(tài)加載圖集并使用圖集里的小圖,才算完整的使用小圖。Unity并沒有明確api告知我們?nèi)绾斡眠@種圖集,而常用Resources.Load()加載只能返回單獨的一個圖片紋理,所以我們用另一個方法 Resources.LoadAll()加載整一張圖集,此方法會返回一個Object[],里面包含了圖集的紋理Texture2D和圖集下的全部Sprite,所以我們就可以根據(jù)object的類型和名字找到我們需要的某張小圖片。
下面提供了一個圖集紋理的管理類,去統(tǒng)一管理加載,是一個單例類,找個不被銷毀的GameObject綁定就行,代碼比較簡單,用一個Dictionary按圖集的路徑通過key將加載過的圖集緩存起來,需要時再由外部刪除掉,下面是代碼:
using?UnityEngine;??
using?System.Collections;??
using?System.Collections.Generic;??//紋理圖集加載管理??
public?class?PPTextureManage?:?MonoBehaviour?{??private?static?GameObject?m_pMainObject;?//掛載對象private?Dictionary<string,?Object[]>?m_pAtlasDic; //圖集的集合,Dictionary<[key], [value]>,方便處理?private?static?PPTextureManage?m_pContainer?=?null; //單例public?static?PPTextureManage?getInstance(){??if(m_pContainer?==?null){??m_pContainer?=?m_pMainObject.GetComponent<PPTextureManage> ();??}??return?m_pContainer;??}??void?Awake (){??initData?();??}void?Start?()?{??}????private?void?initData(){??//一些初始化操作PPTextureManage.m_pMainObject?=?gameObject;??m_pAtlasDic?=?new?Dictionary<string,?Object[]>?();??}??//刪除圖集緩存??public?void?DeleteAtlas(string?_spriteAtlasPath){??//字典的鍵為路徑if?(m_pAtlasDic.ContainsKey (_spriteAtlasPath))?{??//ContainsKey為Dictionary的方法,判斷是否存在指定鍵名,不可以使用get來判斷是否存在某個鍵,因為當(dāng)鍵存在,值不存在,也返回nullm_pAtlasDic.Remove?(_spriteAtlasPath);??//Remove為Dictionary方法,移除鍵值}??}?//加載圖集上的一個精靈??public?Sprite?LoadAtlasSprite(string?_spriteAtlasPath,string?_spriteName){??//第一個參數(shù)為圖集路徑,第二個參數(shù)為精靈圖名Sprite?_sprite?=?FindSpriteFormBuffer?(_spriteAtlasPath,_spriteName);??//FindSpriteFormBuffer,先從緩存中查找spriteif?(_sprite?==?null)?{??//當(dāng)_sprite找不到,說明m_pAtlasDic的Object[]為空,還未緩存Object[]Object[]?_atlas?=?Resources.LoadAll?(_spriteAtlasPath);??m_pAtlasDic.Add?(_spriteAtlasPath,_atlas);??_sprite?=?SpriteFormAtlas?(_atlas,_spriteName);??//SpriteFormAtlas,直接從圖集本身查找}??return?_sprite;??}??//從緩存中查找圖集,并找出sprite??private?Sprite?FindSpriteFormBuffer(string?_spriteAtlasPath,string?_spriteName){??//第一個參數(shù)為圖集路徑,第二個參數(shù)為精靈圖名if?(m_pAtlasDic.ContainsKey?(_spriteAtlasPath))?{??//如果鍵名存在Object[]?_atlas?=?m_pAtlasDic[_spriteAtlasPath];?//把m_pAtlasDic值保存起來,即圖集數(shù)組?Sprite?_sprite?=?SpriteFormAtlas(_atlas,_spriteName);??//在m_pAtlasDic值中尋找return?_sprite;??}??return?null;??}??//從圖集中,并找出sprite??private?Sprite?SpriteFormAtlas(Object[]?_atlas,string?_spriteName){? //第一個參數(shù)為圖集數(shù)組,第二個參數(shù)為圖集內(nèi)精靈圖名?for?(int?i?=?0;?i?<?_atlas.Length;?i++)?{??if?(_atlas?[i].GetType?()?==?typeof(UnityEngine.Sprite))?{??if(_atlas?[i].name?==?_spriteName){??return?(Sprite)_atlas?[i];??}??}??}??Debug.LogWarning?("圖片名:"+_spriteName+";在圖集中找不到");??//如果沒有returnreturn?null;??}??
}?
代碼使用示例
Sprite _sprite = PPTextureManage.getInstance().LoadAtlasSprite("common/game/CommPackAltas","小圖名字");
原文:https://blog.csdn.net/weixin_39706943/article/details/80522010
總結(jié)
以上是生活随笔為你收集整理的Unity UGUI图集打包与动态使用(TexturePacker)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。