[Unity UGUI图集系统]浅谈UGUI图集使用
**写在前面,下面是自己做Demo的时候一些记录吧,参考了很多网上分享的资源
一、打图集
1.准备好素材(建议最好是根据图集名称按文件夹分开)
2、创建一个SpriteAtlas
3、将素材添加到图集中
4、生成图集
到此,我们的图集就准备好了
二、加载图集
1、在工程里面使用(正常包内使用建议打成AB,更新比较方便,加载方式和下面一样,工程为了方便,我将上面打好的图集放在Resources下面)
2、这是最喜欢的c+v环节,加载图集
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 using UnityEngine.U2D; 5 6 public class UIResourceLoadManager : UnitySingleton<UIResourceLoadManager> 7 { 8 9 private Dictionary<string, SpriteAtlas> mUISpriteAtlasDic = new Dictionary<string, SpriteAtlas>(); 10 11 private T LoadResouceOfType<T>(string _resPath) where T:Object 12 { 13 T tempResource = null; 14 tempResource = Resources.Load<T>(_resPath); 15 return tempResource; 16 } 17 18 public SpriteAtlas GetSpriteAtlas(string _atlasName) 19 { 20 if (mUISpriteAtlasDic.ContainsKey(_atlasName)) 21 { 22 if (mUISpriteAtlasDic[_atlasName] == null) mUISpriteAtlasDic[_atlasName] = LoadResouceOfType<SpriteAtlas>("Chart/"+_atlasName); 23 } 24 else 25 { 26 mUISpriteAtlasDic.Add(_atlasName, LoadResouceOfType<SpriteAtlas>("Chart/" + _atlasName)); 27 } 28 return mUISpriteAtlasDic[_atlasName]; 29 } 30 31 public Sprite LoadSprite(string _atlasName,string _spriteName) 32 { 33 Sprite tempSprite = null; 34 SpriteAtlas tempAtlas = GetSpriteAtlas(_atlasName); 35 if(tempAtlas != null ) tempSprite = tempAtlas.GetSprite(_spriteName); 36 return tempSprite; 37 } 38 39 public Sprite[] LoadSprites(string _atlasName, Sprite[] _spriteArray) 40 { 41 SpriteAtlas tempAtlas = GetSpriteAtlas(_atlasName); 42 if (tempAtlas != null) 43 { 44 if (_spriteArray == null || _spriteArray.Length < tempAtlas.spriteCount) _spriteArray = new Sprite[tempAtlas.spriteCount]; 45 if (tempAtlas != null) tempAtlas.GetSprites(_spriteArray); 46 } 47 return _spriteArray; 48 } 49 } 50 51 public class UnitySingleton<T> : MonoBehaviour where T : Component 52 { 53 private static T _instance; 54 public static T Instance 55 { 56 get 57 { 58 if (_instance == null) 59 { 60 _instance = FindObjectOfType(typeof(T)) as T; 61 if (_instance == null) 62 { 63 GameObject tempObject = new GameObject(); 64 tempObject.hideFlags = HideFlags.HideAndDontSave; 65 _instance = (T)tempObject.AddComponent(typeof(T)); 66 Object.DontDestroyOnLoad(tempObject); 67 } 68 } 69 return _instance; 70 } 71 } 72 }
3、使用举例
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 using UnityEngine.UI; 5 6 public class UIAtlasLoadImag : MonoBehaviour 7 { 8 public Image image; 9 // Start is called before the first frame update 10 void Start() 11 { 12 if (image) image.sprite = UIResourceLoadManager.Instance.LoadSprite("icon","小地图底"); 13 } 14 15 // Update is called once per frame 16 void Update() 17 { 18 19 } 20 }
三、意外情况
我在打图集的时候发现,有一张素材中间有很大一块透明区域,导致打图集时把几个尺寸比较小的素材打到这个素材中间了,使用的时候出现下面这种情况
刚开始我以为是图集问题,不能将小尺寸打到中间有透明区域的大尺寸素材里面
后面我随手乱点,发现好了 = =||
如果你也有类似情况,选他选他选他。。。
---------------------------------------------------------------------------------------------------------------------------------------------------
写在后面,上面素材马赛克是为了避免产生一些不必要的麻烦。
我的工作是使用NGUI项目,用的是5.X版本Unity,最近想用用新版本Unity,一下从5.x到2019,有种从石器时代到工业时代的赶脚,新奇,哈哈
很久不记录这个东西了,这次因为想试试看把自己用NGUI实现的内容完全转换成UGUI,记录一下过程,和一些差异实现,开发日记之类的
====================================================================================
2024年10月28日19:17:14 补充
Use Sprite Mesh虽然是能解决上面的问题,但是会造成部分的性能消耗,如果资源空白区域不多的情况下,最好还是不要使用紧凑型打图集,有空我再查查测一下这两种得性能和内存消耗占用比较,但是在SpriteRanderer上面使用上面的紧凑型图集是完全没有问题的