Unity3D-NGUI动态加载图片
NGUI提供了很方便的UIAtlas,其主要作用是改进DrawCall,把众多图片整合在一张贴图上,由于UNITY3D简单易用的好处,所以只是用原生的GUI很容易忽视DrawCall的问题,所以NGUI为了改进,才有了UIAtlas。当然NGUI还做了很多优化。
这里主要还是介绍如何利用UISprite来动态的加载图片。NGUI所提供的UIAtlas虽然好用,但只能在Editor内生成贴图和prefab以供UISprite使用。为了能够让游戏资源与游戏本体尽可能的分离,特别是游戏资源需要动态更新的情况。很多时候,都需要动态加载,动态设置UIAtlas。
这里主要介绍2个方法。
方法1:直接在代码中创建和设置UIAtlas并对UISprite进行显示。这种方法可以对任何零散的贴图进行加载,但缺点是浪费DrawCall,主要应用在特别零散的贴图资源上。
public class ImageLoader : MonoBehaviour {
    //需要加载动态图片的对象
    public UISprite m_img;
    //自用的Atlas
    private UIAtlas m_uiAtlas;
    /// <summary>
    /// 加载的贴图
    /// </summary>
    /// <param name="tex">Tex.</param>
    public void ImageLoad(Texture2D tex)
    {
        if(tex == null)
        {
            return;
        }
        if(tex.name == m_img.spriteName)
        {
            return;
        }
        //准备对象和材质球
        if(m_uiAtlas == null)
        {
            Material mat;
            Shader shader = Shader.Find("Unlit/Transparent Colored");
            mat = new Material(shader);
            m_uiAtlas = this.gameObject.AddComponent<UIAtlas>();
            m_uiAtlas.spriteMaterial = mat;
        }
        //设定贴图
        m_uiAtlas.spriteMaterial.mainTexture = tex;
        m_uiAtlas.coordinates = UIAtlas.Coordinates.Pixels;
        //为对应UISprite接口,给Atlas加对象
        UIAtlas.Sprite sprite = new UIAtlas.Sprite();
        sprite.name = tex.name;
        sprite.outer = sprite.inner = new Rect(0f, 0f, tex.width, tex.height);
        m_uiAtlas.spriteList.Clear();
        m_uiAtlas.spriteList.Add(sprite);
        //设置完成
        m_img.atlas = m_uiAtlas;
        m_img.spriteName = tex.name;
    }
}
方法2:将整个UIAtlas及其贴图打包,而后形成资源,驻留在内存中(仅仅是指向资源的指针),UNITY3D会根据引用来确定贴图是否直接放实际内存中。这种方法更适合ICON之类有规律可以配置整合的资源。缺点是需要维护。
//从资源文件夹加载打包成assetBundle的ICON资源文件
private IEnumerator LoadResIcon()
{
//准备好资源们
string strFormat = ResourcePath.GetPath() + "UI/{0}";
string strFilePath = "";
for(int i = , nMax = GameConfig.Instance.IconSet.strIcons.Length; i < nMax ; i++)
{
string strAssetName = GameConfig.Instance.IconSet.strIcons[i]; strFilePath = string.Format(strFormat, strAssetName);
WWW tmp_www = null;
try
{
tmp_www = new WWW(strFilePath);
}
catch
{
tmp_www = null;
}
if(tmp_www==null)
{
continue;
}
yield return tmp_www;
if(tmp_www.error !=null)
{
tmp_www.Dispose();
tmp_www = null;
yield break;
}
AssetBundle tmp_assetBundle = tmp_www.assetBundle;
tmp_www.Dispose();
tmp_www = null; UIAtlas atlas = tmp_assetBundle.Load(strAssetName,typeof(UIAtlas)) as UIAtlas;
tmp_assetBundle.Unload(false); GameConfig.Instance.IconSet.SaveUIAtlas(i, atlas);
}
yield return null;
}
管理UIAtlas
public class IconSet
{
public string[] strIcons =
{
"A1_Atlas",
"A2_Atlas",
"A3_Atlas",
};
public UIAtlas[] m_AtlasData;
Dictionary<string, int> m_dicIcon;
public IconSet()
{
m_AtlasData = new UIAtlas[strIcons.Length];
m_dicIcon = new Dictionary<string, int>();
}
//保存Atlas的完整信息
public void SaveUIAtlas(int nIndex, UIAtlas UIvalue)
{
m_AtlasData[nIndex] = UIvalue;
foreach (string iconNames in UIvalue.GetListOfSprites())
{
m_dicIcon[(string)iconNames.Clone()] = nIndex;//将所有的ICONNAME信息记录并且绑定成索引,以便查找
}
}
//根据ICONNAME找出对应UIATLAS
public UIAtlas FindAtlasBySpriteName(string name)
{
int nAtlasIndex = ;
if (m_dicIcon.TryGetValue(name, out nAtlasIndex))
{
return m_AtlasData[nAtlasIndex];
}
return null;
}
}
实际使用的范例:
//设置显示对象
UISprite sprite = this.GetComponent<UISprite>();
sprite.atlas = GameConfig.Instance.IconSet.FindAtlasBySpriteName("Icon001");
sprite.spriteName = "Icon001";
总结:
以上两种方法基本能够应对大部分UI的现实问题,ImageLoader本身传入的是Texture2D,所以,即便是RenderTexture也没问题,都能与NGUI和谐相处。加以扩展的话,就是让另一个摄像机导出的东西和当前NGUI摆的UI结合。
Unity3D-NGUI动态加载图片的更多相关文章
- Unty3D动态加载图片
		
试验动态加载图片,代码如下: using UnityEngine; using System.Collections; public class DynamicLoad : MonoBehaviour ...
 - ie6,7下js动态加载图片不显示错误
		
ie6,7下js动态加载图片不显示错误 先描述一下出现这种匪夷所思bug的背景: 我在页面加载的时候加载一堆小缩略图,<a href="javascript:void(0);" ...
 - asp.net向后台传参数动态加载图片
		
//向后台传参数动态加载图片 $(function() { $("#Button1").click(function() { var stockcode = getUrlParam ...
 - vue动态加载图片,取消格式验证
		
vue 一. 动态加载图片 (以vue模板为例) app.vue 代码如下: <template> <div id="app"> <img :src= ...
 - 【MFC】picture控件 两种有细微差别的动态加载图片方法
		
摘自:http://www.jizhuomi.com/software/193.html VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control) 分类标签: 编程入门 ...
 - Unity3D AssetBundles 动态加载游戏资源
		
AssetBundles are files which you can export from Unity to contain assets of your choice. These files ...
 - Vue动态加载图片图片不显示
		
图片是放在assets文件夹下的 使用require进行解决 图片不显示的原因 在webpack,将图片放在assets中,会将图片图片来当做模块来用,因为是动态加载的,所以url-loader将无法 ...
 - vue动态加载图片
		
如果是直接动态获取完整的图片地址可以使用以下方法 <template> <img :src="url"> </template> <scr ...
 - vue:使用不同参数跳转同一组件,实现动态加载图片和数据,以及利用localStorage和vuex持久化数据
		
需求:通过不同的参数复用同一组件,实现动态加载数据和图片,同时,在页面刷新时,图片依旧可以加载成功. 过程出现的bug和问题: 1.使用params传参后,再次刷新页面,参数丢失导致数据无法再次加载 ...
 
随机推荐
- 参数化测试与Mock
			
参数化测试与Mock 转载自https://blog.csdn.net/sunliduan/article/details/42026509 单元测试概念 说到测试,大家都不会陌生,从我们开始学习编程 ...
 - 五一,期待一场这样的旅行,提前预祝Csdner五一快乐
			
五一,期待一场这样的旅行,提前预祝Csdner五一快乐 五一,你是否期待一次这样的旅行: 住在一间安静优美的小屋,在鸟鸣中起床,推窗有花香铺面而来.早餐过后,在阳光温暖的抚摸里,骑车踏青或光脚奔跑. ...
 - sql geography类型(地理坐标) 赋值
			
sql 语句赋值 update [lishui].[dbo].[t_NearbyService] ,, ) ,[locationbaidu]=geography::Point(,, ) where [ ...
 - Eclipse/MyEclipse按任何键,都可以提示?(最强帮手)
			
说明: 一般在Eclipse ,MyEclipse代码里面,打个foreach,switch等这些,是无法得到代码提示的(不信自己试试),其他的就更不用说了,而在Microsoft Visual St ...
 - Java Inner Class 内部类
			
内部类 Inner Class 一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分. Java中的内部类共分为四种: 静态内部类static inner class ( ...
 - CentOS7手动修改系统时间
			
CentOS7 永久修改系统时间 安装在虚拟机上的CentOS7的时间分为系统时间和硬件时间.二者都修改,重启系统(init 6 )才会永久生效.修改步骤如下 查看当前系统时间 date 修改当 ...
 - Canvas 绘制矩形,圆形,不规则图形(线条),渐变等图像效果
			
绘制矩形: getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径.矩形.圆形.字符以及添加图像的方法. fillStyle 方法将其染成红色,fill ...
 - HTML5 的拖放(实例:两个div之间拖放图片)
			
重点解释: 首先,为了使元素(如本图片)可拖动,把 draggable 属性设置为 true : dataTransfer.setData() 方法设置被拖数据的数据类型和值: ondragover ...
 - 如何用webgl(three.js)搭建不规则建筑模型,客流量热力图模拟
			
本节课主要讲解如何用webgl(three.js)搭建一个建筑模型,客流量热力图模拟 使用技术说明: 这里主要用到了three.js,echart.js以及一些其它的js 与css技术,利用webso ...
 - RestTemplate的一个请求过程,mark一下
			
来看下RestTemplate中默认的的ResponseErrorHandler: package org.springframework.web.client; import java.io.IOE ...