• 开篇&TexturePacker打出图集给UGUI使用


    开篇:
    前段时间,网上流出了一套手游源码,本想着把服务器端搭一下,给自己认识小伙伴们调试着把这套源码学习一下。于是就买一个阿里云服务器,可是花了几天时间,就是run不起来了啊。还好网上已经有人搭出来了,暂且连上他们的服务器调试吧。哎,还是不说这些糗事了。
    那阿里云服务器买都买了,总不能空着把。那就开个网站吧。于是心血来潮的,注册域名,备案,balabala。就是现在这个了。www.shihuanjue.com,个人觉得还是很好记的。以后会把之前写在有道云的笔记梳理一下搬过来吧。我不是大神,有不足的地方还请多多指出。

    正文:
    UGUI 有自己的 Sprite Packer 机制,就是在开发的时候让开发者没有图集这个概念,用的都是散图,然后在打包的时候引擎根据各个小图的 Packing Tag合并成一个图集,从而来降低drawcall。
    设置成统一参数的图集将被合并到一张图集里面。

    个人觉得,这东西不可控,合并成啥样也不知道,是否会出现一张大图里面还空着很多地方没用。
    我也看了雨松MOMO的关于这些的文章。个人感觉不好用啊。(强调:个人观点)
    所以我就在想能不能不用这套机制。
    于是尝试用TexturePacker试试。
    首先把Edit->Project Setting->Editor : Sprite Packer设置成Disabled。默认是开启的。

    准备:
    1.下载 texturepacker for unity 的插件,然后把插件导入到unity里面。这个插件什么用, 我会在后面说。
    地址:http://www.codeandweb.com/texturepacker/unity
    2.网上下载个破解版的texturepacker
    准备就绪之后呢。打开texturepacker,把美术给我们的散图导入进去。
    然后设置 Data file和Texture file 都是我们unity工程的目录下面的res文件

    然后其它参数,大家可以酌情修改,最后导出

    转到unity工程可以看到test图片不是一张单独的大图了,它有一张张小图在下面了。
    这就是之前导入的插件帮我们做好的事情。

    UI不需要 Minmap,所以我把勾打掉了。大小也变小了。多好。

    再来看导入unity的另外一个文件。test.tpsheet
    这里面保存着每一张小图的在这张图集中的位置。
    读取的时候就是要根据这些数据把相对应的小图显示出来。
    我把test.tpsheet改成了.txt后缀,然后把开头的没用的信息删除了。

    那么接下来就是写代码了

     
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine.UI;
     
    /// <summary>
    ///贴图类
    /// </summary>
    public class ImageInfo
    {
        public string name;
        public Rect rect;       //配置文件中要替换的精灵的位置区域Rect
        public Vector2 vec2;    //要替换的精灵的pivot
     
        public ImageInfo(string[] str)
        {
            if (str != null)
            {
                this.name = str[0];
                float x, y, w, h;
                x = float.Parse(str[1]);
                y = float.Parse(str[2]);
                w = float.Parse(str[3]);
                h = float.Parse(str[4]);
                this.rect = new Rect(x, y, w, h);
                float pivotX, pivotY;
                pivotX = float.Parse(str[5]);
                pivotY = float.Parse(str[6]);
                this.vec2 = new Vector2(pivotX, pivotY);
            }
        }
    }
     
    /// <summary>
    /// 图集管理类
    /// </summary>
    public class AtlasMgr
    {
        public static Dictionary<string, List<ImageInfo>> imgDic = new Dictionary<string, List<ImageInfo>>();
    }
     
     
    public class Test : MonoBehaviour
    {
        string url = "test";
        public Texture2D mTex;//图集
        public GameObject UIRoot;
        List<Image> images = new List<Image>();
     
        void Start()
        {
            this.LoadData(url);
     
            for (int i = 0; i < AtlasMgr.imgDic[url].Count; i++)
            {
                ImageInfo _temp = AtlasMgr.imgDic[url][i];
                Debug.Log(_temp.name + "|" + _temp.rect + "|" + _temp.vec2);
            }
     
            int count = this.UIRoot.transform.childCount;
            for (int j = 0; j < count; j++)
            {
                this.images.Add(this.UIRoot.transform.Find("Image" + j).GetComponent<Image>());
            }
        }
     
        /// <summary>
        /// 加载图集的配置信息
        /// </summary>
        /// <param name="loadUrl">Load URL.</param>
        private void LoadData(string loadUrl)
        {
            if (!AtlasMgr.imgDic.ContainsKey(loadUrl))
            {
                AtlasMgr.imgDic.Add(loadUrl, new List<ImageInfo>());
            }
     
            TextAsset binAsset = Resources.Load(loadUrl, typeof(TextAsset)) as TextAsset;
            string[] lineArray = binAsset.text.Split(new char[] { '
    ' });
     
            for (int i = 0; i < lineArray.Length; i++)
            {
                lineArray[i] = lineArray[i].Replace("
    ", "");
                string[] strArray = lineArray[i].Split(new char[] { ';' });
                ImageInfo imgInfo = new ImageInfo(strArray);
                AtlasMgr.imgDic[loadUrl].Add(imgInfo);
            }
        }
     
        void OnGUI()
        {
            if (GUILayout.Button("换图"))
            {
                for (int i = 0; i < this.images.Count; i++)
                {
                    //根据rect,pivot,把mTex图集里面在这个位置的小图显示出来
                    this.images[i].sprite = Sprite.Create(this.mTex, AtlasMgr.imgDic["test"][i].rect, AtlasMgr.imgDic["test"][i].vec2);
                }
            }
        }
    }

    然后新建7个Image进行测试

    点击“换图”按钮,是可以根据这些数据显示出一张小图吧。
    最后把例子工程也分析出来了,例子总归是例子,只是提供一个思路,项目中要用的话,还是要好好的封装,模块化吧。
    例子工程:
    链接:http://pan.baidu.com/s/1pJklvz9 密码:arxk
    大家如果有其它更好的方式一定要告诉我哦。
    第一篇先写个简单的,以后再慢慢好好写吧。就这样吧,拜拜~!

  • 相关阅读:
    手指抽搐强迫症 之 APM病理分析器 v0.0.0.3 (11月24日更新)
    [转帖]修改MySql密码及访问限制设置详解
    C#学习笔记
    CodeSmith快速向导
    奇葩的maxscript
    MASM中可以定义的变量类型
    js琐记
    史上最全的css hack(ie69,firefox,chrome,opera,safari)
    逆向win32程序的思路琐记
    makefile伪目标
  • 原文地址:https://www.cnblogs.com/joeshifu/p/5488625.html
Copyright © 2020-2023  润新知