开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:676

当前位置:游戏蛮牛 技术专区 教程分享

查看: 1035|回复: 9

[自学总结] UGUI 多张图片合成一张 记时 显示ICO

[复制链接]  [移动端链接]
5熟悉之中
633/1000
排名
6065
昨日变化
2

11

主题

133

帖子

633

积分

Rank: 5Rank: 5

UID
152229
好友
0
蛮牛币
2449
威望
0
注册时间
2016-6-16
在线时间
285 小时
最后登录
2017-9-16
发表于 2016-12-28 21:39:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 wtujoxk 于 2016-12-29 09:59 编辑

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


来一张全家福

QQ图片20161228213114.png


再来个硬菜:
[C#] 纯文本查看 复制代码
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;
        }
    }
}



时间显示:
GIF.gif
代码:
[C#] 纯文本查看 复制代码
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);
            }
        }
}


示例工程:
MergeImage.zip (34.66 KB, 下载次数: 15, 售价: 2 蛮牛币)

回复

使用道具 举报

6蛮牛粉丝
1183/1500
排名
21478
昨日变化
16

10

主题

660

帖子

1183

积分

Rank: 6Rank: 6Rank: 6

UID
158776
好友
1
蛮牛币
23
威望
0
注册时间
2016-7-26
在线时间
499 小时
最后登录
2017-9-21
发表于 2016-12-29 08:38:07 | 显示全部楼层
谢谢楼主的分享

回复

使用道具 举报

7日久生情
2811/5000
排名
1777
昨日变化
5

3

主题

1729

帖子

2811

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
182740
好友
0
蛮牛币
4299
威望
0
注册时间
2016-11-10
在线时间
487 小时
最后登录
2017-9-23

迈向小康

发表于 2016-12-29 08:38:21 | 显示全部楼层
谢谢分享!!!!!

回复

使用道具 举报

排名
50570
昨日变化
751

0

主题

7

帖子

9

积分

Rank: 1

UID
196955
好友
0
蛮牛币
1
威望
0
注册时间
2016-12-29
在线时间
0 小时
最后登录
2016-12-29
发表于 2016-12-29 09:41:10 | 显示全部楼层
6555555555555

回复

使用道具 举报

7日久生情
2998/5000
排名
77
昨日变化

10

主题

225

帖子

2998

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
11915
好友
4
蛮牛币
3651
威望
0
注册时间
2014-1-6
在线时间
662 小时
最后登录
2017-9-23
发表于 2016-12-29 10:18:51 | 显示全部楼层
非常不建议你运行时自己做图集合并,首先你这么干的话原始散碎的图片必须开启Read/Write属性(内存中会产生两份图片资源占用),另外这样的操作占用了运行时的cpu消耗,完全是得不偿失。建议不要动态合并,使用静态合并!

回复 支持 反对

使用道具 举报

5熟悉之中
633/1000
排名
6065
昨日变化
2

11

主题

133

帖子

633

积分

Rank: 5Rank: 5

UID
152229
好友
0
蛮牛币
2449
威望
0
注册时间
2016-6-16
在线时间
285 小时
最后登录
2017-9-16
 楼主| 发表于 2016-12-29 11:30:23 | 显示全部楼层
死骑很厉害 发表于 2016-12-29 10:18
非常不建议你运行时自己做图集合并,首先你这么干的话原始散碎的图片必须开启Read/Write属性(内存中会产生 ...

如果这是绿幕抠图,更换背景呢???

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1244/1500
排名
5130
昨日变化
1

2

主题

775

帖子

1244

积分

Rank: 6Rank: 6Rank: 6

UID
92518
好友
1
蛮牛币
2464
威望
0
注册时间
2015-4-15
在线时间
277 小时
最后登录
2017-4-6
发表于 2016-12-29 18:02:23 | 显示全部楼层

谢谢分享!!!!!

回复

使用道具 举报

5熟悉之中
944/1000
排名
2677
昨日变化
2

7

主题

168

帖子

944

积分

Rank: 5Rank: 5

UID
172983
好友
1
蛮牛币
6894
威望
0
注册时间
2016-9-30
在线时间
359 小时
最后登录
2017-9-23
发表于 2017-1-16 16:34:10 | 显示全部楼层
谢谢分享!!!!!谢谢了

回复

使用道具 举报

3偶尔光临
193/300
排名
8191
昨日变化
2

5

主题

21

帖子

193

积分

Rank: 3Rank: 3Rank: 3

UID
109599
好友
1
蛮牛币
269
威望
0
注册时间
2015-6-21
在线时间
61 小时
最后登录
2017-3-10
QQ
发表于 2017-3-6 12:38:52 | 显示全部楼层
死骑很厉害 发表于 2016-12-29 10:18
非常不建议你运行时自己做图集合并,首先你这么干的话原始散碎的图片必须开启Read/Write属性(内存中会产生 ...

http://www.manew.com/forum.php?m ... p;page=1#pid1348688

对于获取图集中资源,有什么方法么?

回复 支持 反对

使用道具 举报

5熟悉之中
913/1000
排名
4115
昨日变化
2

12

主题

482

帖子

913

积分

Rank: 5Rank: 5

UID
206456
好友
1
蛮牛币
2088
威望
0
注册时间
2017-2-14
在线时间
203 小时
最后登录
2017-9-15
发表于 2017-3-17 09:48:29 | 显示全部楼层
{:94:}{:94:}
[发帖际遇]: snow3250ARPG 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表