Unity UGUI 多张图片合成一张 记时 显示ICO

原创 2017年07月04日 16:29:32
如果没有生成图集的话,一般我在使用数字记数时都是用很多个Image组件来显示,
现在使用GetPixels32和SetPixels32将多张图片合并为一张,实测,十张60*90的图片,
合并成一张600*90的时间为2ms以内,还是非常快的,这样做的好处是不用生成图集,


来一张全家福


再来个硬菜:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
 
///@brief
///文件名称: ImageTest
///功能描述:
///数据表:
///作者:YuXianQiang
///日期:#CreateTime#
///R1:
///修改作者:
///修改日期:
///修改理由:
 
namespace XianQiang.Yu
{
    public class ImagePicture : MonoBehaviour
    {
        void Start()
        {
            //加载图片
            Texture2D[] t = Resources.LoadAll<Texture2D>("Icos");
 
            //合成图片
            Texture2D tex = MergeImage(t);
 
            //生成后的图自适应大小
            GetComponent<RectTransform>().sizeDelta = new Vector2(tex.width, tex.height);
 
            //显示图片
            Sprite sp = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
            GetComponent<Image>().sprite = sp;
        }
 
        /// <summary>
        /// @brief 多张Texture2D合成一张Texture2D
        /// </summary>
        /// <param name="tex"></param>
        /// <returns></returns>
        public Texture2D MergeImage(Texture2D[] tex)
        {               
            //这里测试合成图片所花的时间
            //TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks);
 
            if (tex.Length == 0) return null;
            //定义新图的宽高
            int width = 0, height = 0;
 
            for (int i = 0; i < tex.Length; i++)
            {
                //Debug.Log(tex[i].ToString());
                //新图的宽度
                width += tex[i].width;
                if (i > 0)
                {
                    //新图的高度,这里筛选为最高
                    if (tex[i].height > tex[i - 1].height)
                        height = tex[i].height;
                }
                else height = tex[i].height; //只有一张图
            }
 
            //初始Texture2D
            Texture2D texture2D = new Texture2D(width, height);
 
            int x = 0, y = 0;
            for (int i = 0; i < tex.Length; i++)
            {
                //取图
                Color32[] color = tex[i].GetPixels32(0);
 
                //赋给新图
                if (i > 0) texture2D.SetPixels32(x += tex[i - 1].width, y, tex[i].width, tex[i].height, color);
                else texture2D.SetPixels32(x, y, tex[i].width, tex[i].height, color);
            }
 
            //应用
            texture2D.Apply();
 
            //TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks);
            //TimeSpan ts = ts2.Subtract(ts1).Duration();
            ////查看合成后的图所花时间 ms单位
            //Debug.Log(ts.TotalMilliseconds);
 
            return texture2D;
        }
    }
}

时间显示:


代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
 
///@brief
///文件名称: UpdateTime
///功能描述:
///数据表:
///作者:YuXianQiang
///日期:#CreateTime#
///R1:
///修改作者:
///修改日期:
///修改理由:
 
namespace XianQiang.Yu
{
        public class UpdateTime : MonoBehaviour
        {
            public Texture2D[] img;
            private ImagePicture imgP;
            private string curTime;
            private string lastTime;
        void Start ()
        {
            imgP = GetComponent<ImagePicture>();
        }
 
            void Update()
            {
            curTime = DateTime.Now.ToString("hh:mm:ss");
            if (curTime != lastTime)//一秒更新一次
            {
                    lastTime = curTime;
                Texture2D tex = ShowTime();
 
                //生成后的图自适应大小
                GetComponent<RectTransform>().sizeDelta = new Vector2(tex.width, tex.height);
 
                //显示图片
                Sprite sp = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
                GetComponent<Image>().sprite = sp;
            }
            }
        Texture2D ShowTime()
            {
            Texture2D[] tex = new Texture2D[curTime.Length];
 
            for (int i = 0; i < curTime.Length; i++)
                {
                    string s = curTime.Substring(i, 1);
                    if (s == ":")
                        tex[i] = img[img.Length - 1];
                    else
                        tex[i] = img[Convert.ToInt32(s)];
                }
                return imgP.MergeImage(tex);
            }
        }
}

没有权限报错的请看图


unity截取图片并合成

1.首先创建一个UI摄像机,并调整好Layer层,遮罩层之类的,拼拼界面。 2.制作成预制体。(代码中的路径可能需要改)加载的地方改下Resource.Load(); 3.先点字一个GUIBUtt...
  • u011244737
  • u011244737
  • 2016年03月11日 16:07
  • 1289

Opencv for unity图片合成

opencv for unity 合成两张图片
  • thinkcg
  • thinkcg
  • 2017年07月25日 15:15
  • 1525

Unity4.6 UGUI 图片打包设置(小图打包成图集 SpritePacker)

在学习UGUI的过程中,一直使用小图也就是散图,一个按钮一个图片,一个图标一个图片,这样每一个图片都有一个Drawcall。 之前公司的游戏都是使用Unity4.3+NGUI,在NGUI中可以使用Te...
  • cp790621656
  • cp790621656
  • 2015年02月11日 19:46
  • 8884

unity3d将一张图片切成多张图片

unity3d将一张图片切成多张图片
  • angelsmiles
  • angelsmiles
  • 2016年01月05日 18:11
  • 5217

[转载]利用Unity自带的合图切割功能将合图切割成子图

利用Unity自带的合图切割功能将合图切割成子图,并用代码导出。 转载:原文链接using UnityEngine; using UnityEditor; using System.Collecti...
  • u010279811
  • u010279811
  • 2016年11月17日 10:42
  • 292

Unity5 Sprite 图集打包 AssetBundle 更新探索

自从Unity 提供 Sprite Packer 方案,精灵图片就不需要自己来合并图集了,而是设置 Packing Tag 就会使得 Unity 自动帮我们合并图集。但是做资源更新的时候,自动生成的图...
  • akof1314
  • akof1314
  • 2015年09月11日 18:51
  • 23794

用flex将两张图片合成一张图片

//图片1var s : Number = .5;// 建立matrixvar scaleMatrix : Matrix = new Matrix();// 应用scale到matrixscaleMa...
  • Breeze2003
  • Breeze2003
  • 2011年05月07日 22:37
  • 1259

unity3D多相机的切换

Unity3D管理多相机很是繁琐,"Camera Preview"着实解决了相机的切换,然而窗口小,比例不能调整,并且在多个相机中禁用启用设置相机视角也很不方便,所以也不是很实用。Security C...
  • lwp11411
  • lwp11411
  • 2011年07月06日 16:25
  • 652

Unity将RenderTexture转成一张图片并剪裁保存到本地

//将RenderTexture保存成一张png图片 public bool SaveRenderTextureToPNG(RenderTexture rt, string content...
  • qq_15267341
  • qq_15267341
  • 2017年08月07日 09:54
  • 1429

【Unity】图片融合

using UnityEngine; using System.Collections; using System.Collections.Generic; /// /// 脚本挂载到墙上 /// ...
  • sinat_20559947
  • sinat_20559947
  • 2017年01月09日 01:08
  • 823
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity UGUI 多张图片合成一张 记时 显示ICO
举报原因:
原因补充:

(最多只允许输入30个字)