开篇&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[];
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
大家如果有其它更好的方式一定要告诉我哦。
第一篇先写个简单的,以后再慢慢好好写吧。就这样吧,拜拜~!
- 本文固定链接: http://www.shihuanjue.com/?p=16
- 转载请注明: 乔 2015年08月03日 于 是幻觉 发表
开篇&TexturePacker打出图集给UGUI使用的更多相关文章
- 用TexturePacker打图集用于UGUI中
UGUI的原理则是,让开发者彻底模糊图集的概念,让开发者不要去关心自己的图集.做界面的时候只用小图,而在最终打包的时候unity才会把你的小图和并在一张大的图集里面.Editor->Projec ...
- Unity3D - 使用TexturePacker打包图集以及NGUI对旋转sprites的支持
作者:EnigmaJJ 博客地址:http://www.cnblogs.com/twjcnblog/ 在Unity中使用NGUI时,为了减少draw call,我们会将美术用到的小图打成一张图集,如图 ...
- UGUI 打图集
using UnityEngine; using System.Collections; using UnityEditor; using System.Collections.Generic; us ...
- 使用 Unity 3D 开发游戏的架构设计难点
Unity 3D 引擎对于开发者来说,入手非常快,因为它采用的是 C# 作为开发语言,这也大大降低了开发者的门槛.但凡只要懂一门编程语言的人都能使用 Unity 3D 引擎开发,另外 Unity 3D ...
- CanvasWebgl项目介绍
CanvasWebgl 介绍 CanvasWebgl 是一个基于webgl 开发的2d绘图框架,使用TypeScript开发 CanvasWebgl的功能,是在屏幕空间 或者 3D空间产生一个画布 ...
- Cocos Creator 性能优化:DrawCall
前言 在游戏开发中,DrawCall 作为一个非常重要的性能指标,直接影响游戏的整体性能表现. 无论是 Cocos Creator.Unity.Unreal 还是其他游戏引擎,只要说到游戏性能优化,D ...
- UGUI的图集处理方式-SpriteAtlas的前世今生
最糟糕的是人们在生活中经常受到错误志向的阻碍而不自知,真到摆脱了那些阻碍时才能明白过来. —— 歌德 说到UGUI的图集初学者可能觉得没什么难度,包括我刚开始接触的时候也是,甚至你在开发的时候只需要把 ...
- (转) Unity3D 使用Texturepacker打包工具制作NGUI(Atlas)图集
转自:http://www.unitymanual.com/thread-37485-1-1.html 由于NGUI AtlasMaker对打包的优化不好,容易打出很大的图集,很多部分都是浪费的,所有 ...
- Unity4.6 UGUI 图片打包设置(小图打包成图集 SpritePacker)
版权声明:本文转自http://blog.csdn.net/huutu 转载请带上 http://www.liveslives.com/ 在学习UGUI的过程中,一直使用小图也就是散图,一个按钮一个图 ...
随机推荐
- Sencha Architect 安装与使用
http://www.sencha.com/products/touch/ Sencha SDK Tools Advanced JavaScript and CSS Project Build Too ...
- Unreal Engine4 学习笔记1 状态机 动画蓝图
1.动画蓝图 包含 状态机 包含 混合空间BlendSpace,即状态机包含在动画蓝图的"动画图表中",而混合空间可用于在状态机中向某(没)一个状态输出最终POSE: 动画蓝 ...
- 攻城狮在路上(贰) Spring(二)--- Spring IoC概念介绍
一.IoC的概念: IoC(控制反转)是Spring容器的核心.另一种解释是DI(依赖注入),即让调用类对某一个接口的依赖关系由第三方注入,以移除调用类对某一个接口实现类的一览. 定义如此,由此可见, ...
- 监听报错 TNS-00525: Insufficient privilege for operation 11gR2 + 连接报错ORA-12537: TNS:connection closed
1.TNS-00525: Insufficient privilege for operation Started with pid= Listening on: (DESCRIPTION=(ADDR ...
- Java Thread join() 的用法
Java Thread中, join() 方法主要是让调用改方法的thread完成run方法里面的东西后, 在执行join()方法后面的代码.示例: class ThreadTesterA imple ...
- Git 基础操作
[TOC] 在Linux上安装Git $ git --version #查看git的版本号 $ sudo apt-get install git # 安装git 创建版本库 $ git init # ...
- 一定要学会paxos算法!
paxos算法 http://blog.csdn.net/dellme99/article/details/14162159
- json方式的面向对象
json方式只适合于一个对象. var p1 = { name:"香菇", sex :"女", dreamdu: { URL: "www.dreamd ...
- JAVA Day5
数组 1.数组是一组变量的集合,存储“相同数据类型”的一组数据: 连续的空间. 2.声明一个变量就是在内存空间划出一块合适 ...
- JavaScript 入门 (1)
一. javascript的调用 JavaScript代码可以直接嵌在网页的任何地方,不过通常我们都把JavaScript代码放到<head>中: <html> <hea ...