日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity UGUI图集打包与动态使用(TexturePacker)

發布時間:2023/12/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity UGUI图集打包与动态使用(TexturePacker) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TexturePacker

在用UGUI時,我們需要將一個個小圖打包成圖集,然后將圖集一次性加載以內存換取圖片讀取效率,即減小Drawcall。

UGUI打包并使用圖集有兩種方法:一種是使用系統自帶的打包工具SpritePacker,這種方法限制比較多;一種是使用TexturePacker打包圖片并使用。

  • 先打開TexturePacker把小圖打包成我們所需要的圖集,打包的格式要注意是"Unity - Texture2D sprite sheet"
  • 打包之后會有一個.png和一個.tpsheet,直接將這兩個文件放在工程資源中即可,此時從工程看這只是一張大圖,并不能算是一個圖集。雖然可以用Unity自帶的圖片裁剪的功能,但裁剪的小圖大小基本不對。

  • 接下來需要下載并導入一個Unity的插件,在Asset Story搜索TexturePacker Importer并導入,不用進行任何操作,插件會自己根據.tpsheet將剛才打包好放進入工程的大圖自動裁剪成小圖,點開圖集如下:

  • 我們只需像處理單獨小圖一樣,將圖集里的小圖拖進Source Image里即可。此時我們只能在編輯器里設置使用圖集,還不能真正使用小圖。

  • 我們還需要在程序中動態加載圖集并使用圖集里的小圖,才算完整的使用小圖。Unity并沒有明確api告知我們如何用這種圖集,而常用Resources.Load()加載只能返回單獨的一個圖片紋理,所以我們用另一個方法 Resources.LoadAll()加載整一張圖集,此方法會返回一個Object[],里面包含了圖集的紋理Texture2D和圖集下的全部Sprite,所以我們就可以根據object的類型和名字找到我們需要的某張小圖片。

  • 下面提供了一個圖集紋理的管理類,去統一管理加載,是一個單例類,找個不被銷毀的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來判斷是否存在某個鍵,因為當鍵存在,值不存在,也返回nullm_pAtlasDic.Remove?(_spriteAtlasPath);??//Remove為Dictionary方法,移除鍵值}??}?//加載圖集上的一個精靈??public?Sprite?LoadAtlasSprite(string?_spriteAtlasPath,string?_spriteName){??//第一個參數為圖集路徑,第二個參數為精靈圖名Sprite?_sprite?=?FindSpriteFormBuffer?(_spriteAtlasPath,_spriteName);??//FindSpriteFormBuffer,先從緩存中查找spriteif?(_sprite?==?null)?{??//當_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){??//第一個參數為圖集路徑,第二個參數為精靈圖名if?(m_pAtlasDic.ContainsKey?(_spriteAtlasPath))?{??//如果鍵名存在Object[]?_atlas?=?m_pAtlasDic[_spriteAtlasPath];?//把m_pAtlasDic值保存起來,即圖集數組?Sprite?_sprite?=?SpriteFormAtlas(_atlas,_spriteName);??//在m_pAtlasDic值中尋找return?_sprite;??}??return?null;??}??//從圖集中,并找出sprite??private?Sprite?SpriteFormAtlas(Object[]?_atlas,string?_spriteName){? //第一個參數為圖集數組,第二個參數為圖集內精靈圖名?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

    總結

    以上是生活随笔為你收集整理的Unity UGUI图集打包与动态使用(TexturePacker)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。