UGUI(六)资源下载之Icon

本文介绍如何在Unity中使用UGUI进行Icon资源的批量打包,并实现资源的有效加载及显示,以减少DrawCalls数量,提升游戏性能。

说起icon相信大家都不陌生,如果是页游icon会做成动态下载,其实其他平台也是如此,需要单独给一组icon打包,然后游戏载入时根据类型和文件名加载图片。

 

如果你在学习UGUI相信也接触过NGUI,NGUI制作的图集作为prefab存在工程目录下,我们直接写打包工具就可以,而且游戏载入图集资源和显示时,在Game下也只是占用一个DrawCalls,这样挺好。

 

但是UGUI却不一样,合成之后的图集不会以文件的形式存在工程目录下,这时我们就不能和NGUI一样对一个parfab进行打包,是不是很纠结?但是我们还是必须给icon资源进行打包,如果单独给每一个icon打包,那么载入资源显示时,一个icon就占用一个DrawCalls,这样明显不可取。所以我们可以把一组icon打包为一个文件,比如使用BuildAssetBundle的第二个参数存放一组icon。

BuildPipeline.BuildAssetBundle(null,

assets.ToArray(),

targetPath,

BuildAssetBundleOptions.CollectDependencies,
BuildTarget.StandaloneWindows);

 

将打包icon到界面显示icon的流程简单分为四步:

1.打包icon资源为unity3d文件

将一组icon资源导入unity,设置为同一个图集。

关于后缀名可能大家都是保存为.assetbundle,这个其实可以自定义,但是我觉得.unity3d更拉风!UGUI(六)资源下载之Icon

代码如下:

  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4. using UnityEditor;  
  5. using System.IO;  
  6. [ExecuteInEditMode]  
  7. public class ExportIcon MonoBehaviour   
  8.  
  9.     private static string m_u3dPath Application.dataPath "/data/ui/icon" 
  10.     private static string m_u3dName "" 
  11.   
  12.     [MenuItem("Assets/ExportU3DByIcon")]  
  13.     static public void ExpoerIconU3D()  
  14.      
  15.         GetIconDirectory();  
  16.      
  17.     // 获取icon目录  
  18.     static private void GetIconDirectory()  
  19.      
  20.         // 获取当前选中的icon文件夹  
  21.         string iconDirectory "" 
  22.         Object[] selection Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);  
  23.         for (int 0selection.Length; i++)  
  24.          
  25.             if (selection[i].name.Contains("icon_"))  
  26.              
  27.                 iconDirectory AssetDatabase.GetAssetPath(selection[i]);  
  28.                 iconDirectory iconDirectory.Replace("Assets/""");// 去掉一个Assets  
  29.                 m_u3dName selection[i].name;  
  30.                 break 
  31.              
  32.          
  33.         if (iconDirectory.Equals(""))  
  34.          
  35.             EditorUtility.DisplayDialog("导出错误""当前目录不为icon目录""确定");  
  36.             return 
  37.          
  38.         iconDirectory Application.dataPath "/" iconDirectory;  
  39.   
  40.         BuildU3D(iconDirectory);  
  41.      
  42.     // 打包为U3D文件  
  43.     static private void BuildU3D(string prefabDirectory)  
  44.      
  45.         List assets new List();  
  46.         DirectoryInfo rootDirInfo new DirectoryInfo(prefabDirectory);  
  47.         foreach (FileInfo fileInfo in rootDirInfo.GetFiles())   
  48.          
  49.             if (fileInfo.Name.Contains(".png"&& !fileInfo.Name.Contains(".meta"))  
  50.              
  51.                 string assetPath fileInfo.FullName.Substring(fileInfo.FullName.IndexOf("Assets"));  
  52.                 Sprite sprite Resources.LoadAssetAtPath(assetPath);  
  53.                 assets.Add(sprite);  
  54.              
  55.          
  56.         Directory.CreateDirectory(m_u3dPath);  
  57.         string targetPath  m_u3dPath "/" m_u3dName ".unity3d" 
  58.         BuildPipeline.BuildAssetBundle(nullassets.ToArray(), targetPath, BuildAssetBundleOptions.CollectDependencies,  
  59.             BuildTarget.StandaloneWindows);  
  60.      

2.下载icon资源

(ResourceFactory在这里就不公开了,这个封装了资源下载功能)

  1. public class LoadIcon  
  2.  
  3.     private int m_resId 0 
  4.     private string m_imageName "" 
  5.     private Image m_image null 
  6.     private static Dictionary<</SPAN>intAssetBundle> m_iconMap new Dictionary<</SPAN>intAssetBundle>();  
  7.     public void Load(int resId, string name, Image image)  
  8.      
  9.         m_resId resId;  
  10.         m_imageName name;  
  11.         m_image image;  
  12.         if (!m_iconMap.ContainsKey(m_resId))  
  13.          
  14.             ResInfo resInfo ResCsvInfo.GetResInfo(2);  
  15.             ResourceFactory.Inst.LoadResource(resInfo, LoadEnd, null);  
  16.          
  17.         else  
  18.          
  19.             image.sprite m_iconMap[m_resId].Load(name) as Sprite;  
  20.          
  21.      
  22.   
  23.     private void LoadEnd(Resource res)  
  24.      
  25.         m_iconMap.Add(m_resId, res.m_assertBundle);  
  26.         m_image.sprite m_iconMap[m_resId].Load(m_imageName) as Sprite;  
  27.      
  28.  

3.UI层封装界面

  1. public Transform m_list;  
  2. public GameObject m_item;  
  3. private void UpdateImageList(int index,string image)  
  4.  
  5.     Transform item ((GameObject)GameObject.Instantiate(m_item)).transform;  
  6.     item.gameObject.SetActive(true);  
  7.     item.name index.ToString();  
  8.     item.SetParent(m_list);  
  9.     LoadIcon icon new LoadIcon();  
  10.     icon.Load(2image, item.GetComponent());  
  11.  

4.逻辑层开始读配置表拿到icon名称,直接调用UI的接口即可!

  1. List imageList new List()  
  2.  
  3.     "129001","129007","129017","129025","129026","129035"  
  4. };  
  5. for (int 0imageList.Count; ++)  
  6.  
  7.     UpdateImageList(i, imageList[i]);  
  8.  

最后界面显示如下:

UGUI(六)资源下载之Icon
再看看DrawCalls:

(2个,就对了!这些图标只会暂用一个DrawCall)

UGUI(六)资源下载之Icon

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值