开篇:
前段时间,网上流出了一套手游源码,本想着把服务器端搭一下,给自己认识小伙伴们调试着把这套源码学习一下。于是就买一个阿里云服务器,可是花了几天时间,就是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[];
float x, y, w, h;
x = float.Parse(str[]);
y = float.Parse(str[]);
w = float.Parse(str[]);
h = float.Parse(str[]);
this.rect = new Rect(x, y, w, h);
float pivotX, pivotY;
pivotX = float.Parse(str[]);
pivotY = float.Parse(str[]);
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 = ; 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 = ; 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[] { '\n' }); for (int i = ; i < lineArray.Length; i++)
{
lineArray[i] = lineArray[i].Replace("\r", "");
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 = ; 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
大家如果有其它更好的方式一定要告诉我哦。
第一篇先写个简单的,以后再慢慢好好写吧。就这样吧,拜拜~!

开篇&TexturePacker打出图集给UGUI使用的更多相关文章

  1. 用TexturePacker打图集用于UGUI中

    UGUI的原理则是,让开发者彻底模糊图集的概念,让开发者不要去关心自己的图集.做界面的时候只用小图,而在最终打包的时候unity才会把你的小图和并在一张大的图集里面.Editor->Projec ...

  2. Unity3D - 使用TexturePacker打包图集以及NGUI对旋转sprites的支持

    作者:EnigmaJJ 博客地址:http://www.cnblogs.com/twjcnblog/ 在Unity中使用NGUI时,为了减少draw call,我们会将美术用到的小图打成一张图集,如图 ...

  3. UGUI 打图集

    using UnityEngine; using System.Collections; using UnityEditor; using System.Collections.Generic; us ...

  4. 使用 Unity 3D 开发游戏的架构设计难点

    Unity 3D 引擎对于开发者来说,入手非常快,因为它采用的是 C# 作为开发语言,这也大大降低了开发者的门槛.但凡只要懂一门编程语言的人都能使用 Unity 3D 引擎开发,另外 Unity 3D ...

  5. CanvasWebgl项目介绍

    CanvasWebgl 介绍 CanvasWebgl 是一个基于webgl 开发的2d绘图框架,使用TypeScript开发   CanvasWebgl的功能,是在屏幕空间 或者 3D空间产生一个画布 ...

  6. Cocos Creator 性能优化:DrawCall

    前言 在游戏开发中,DrawCall 作为一个非常重要的性能指标,直接影响游戏的整体性能表现. 无论是 Cocos Creator.Unity.Unreal 还是其他游戏引擎,只要说到游戏性能优化,D ...

  7. UGUI的图集处理方式-SpriteAtlas的前世今生

    最糟糕的是人们在生活中经常受到错误志向的阻碍而不自知,真到摆脱了那些阻碍时才能明白过来. —— 歌德 说到UGUI的图集初学者可能觉得没什么难度,包括我刚开始接触的时候也是,甚至你在开发的时候只需要把 ...

  8. (转) Unity3D 使用Texturepacker打包工具制作NGUI(Atlas)图集

    转自:http://www.unitymanual.com/thread-37485-1-1.html 由于NGUI AtlasMaker对打包的优化不好,容易打出很大的图集,很多部分都是浪费的,所有 ...

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

    版权声明:本文转自http://blog.csdn.net/huutu 转载请带上 http://www.liveslives.com/ 在学习UGUI的过程中,一直使用小图也就是散图,一个按钮一个图 ...

随机推荐

  1. 学习一下《JavaEE开发的颠覆者 Spring Boot实战 》

    SPRING,绕不过去的.

  2. phpcms v9 黄页实现手机访问手机版,电脑访问电脑版(双模板)

    第一步.模板文件夹下,yp复制一份,改名字 ypwap 第二步.修改phpcms/modules/yp/index.php和phpcms/modules/ypwap/index.php //判断客户端 ...

  3. poj 2337 欧拉回路输出最小字典序路径 ***

    把26个小写字母当成点,每个单词就是一条边. 然后就是求欧拉路径. #include<cstdio> #include<iostream> #include<algori ...

  4. jsp,图片显示

    问题:jsp中显示项目中image文件夹中的图片 1,项目中image文件夹中有对应的图片 2,<img ,src="/项目名/image/图片名.jpg">,用其他变 ...

  5. PAT A 1014. Waiting in Line (30)【队列模拟】

    题目:https://www.patest.cn/contests/pat-a-practise/1014 思路: 直接模拟类的题. 线内的各个窗口各为一个队,线外的为一个,按时间模拟出队.入队. 注 ...

  6. C#部分的总结

    经过本次考试暴露出一些问题,面对一些概念性和文字性的基础知识,仍然不够细心,出现各种不应该的错误, 虽然平时学习中,实际操作写代码比较顺利,但基础知识和概念仍不可少,这在将来面试上也是重要的一部分.在 ...

  7. centos7安装redis3.2.5

    安装redis 1官方介绍 Installation Download, extract and compile Redis with: $ wget http://download.redis.io ...

  8. CLR 初步

    1. 源代码编译为托管模块 程序在.NET框架下运行,首先要将源代码编译为 托管模块.CLR是一个可以被多种语言所使用的运行时,它的很多特性可以用于所有面向它的开发语言.微软开发了多种语言的编译器,编 ...

  9. POJ 2406 KMP/后缀数组

    题目链接:http://poj.org/problem?id=2406 题意:给定一个字符串,求由一个子串循环n次后可得到原串,输出n[即输出字符串的最大循环次数] 思路一:KMP求最小循环机,然后就 ...

  10. BZOJ 2342 回文串-Manacher

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2342 思路:先跑一遍Manacher求出p[i]为每个位置为中心的回文半径,因为双倍回文串 ...