unity动态图集图集由多少个文

unity切割图集并且读取图集
1.切割图集,先找一张图集来讲解如图所示,先把他在unity里面切割出来
2.将图片属性改为如图所示:然后点击Sprite进入切割界面,然后根据参数切割,然后应用生成如第一张图片一样
二:读取图集的哪一个
1.使用单例模式
2.用一个字典将所有图集和名字存起来
3.加载图集中的某个贴图
4.删除贴图缓存
5.从缓存中查找图集,并找出sprite
6.从图集中,并找出sprite
7.如果图集中没有那个名字
Debug.Logerror("图集中没有这张图片");
8.新建一个脚本读取贴图,然后付到需要贴的组件上
9。完工。。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Unity NGUI 图集索引怎么实现的? - 知乎有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。13被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答13 条评论分享收藏感谢收起0添加评论分享收藏感谢收起写回答雨松MOMO UGUI 之 全面理解图集与使用(三)
雨松MOMO UGUI 之 全面理解图集与使用(三) http://www.unitymanual.com/thread-.html
(出处: -u3d游戏开发者社区【游戏蛮牛】)
UGUI的图集打包与工作原理,看了一天多,终于看明白了~晕~还是记录一下我研究的成果,分享给大家,一起学习和研究。
先说说UGUI的Atlas和NGUI的Atlas的区别,NGUI是必须先打出图集然后才能开始做界面。这一点很烦,因为始终都要去考虑你的UI图集。比如图集会不会超1024 ,图集该如何来规划等等。而UGUI的原理则是,让开发者彻底模糊图集的概念,让开发者不要去关心自己的图集。做界面的时候只用小图,而在最终打包的时候才会把你的小图和并在一张大的图集里面。然而这一切一切都是自动完成的,开发者不需要去care它。
如下图所示,Editor-&Project Settings 下面有sprite packer的模式。Disabled表示不启用它,Enabled For Builds 表示只有打包的时候才会启用它,Always Enabled 表示永远启用它。 这里的启用它就表示是否将小图自动打成图集。
我的选项是Always Enabled 。因为开发的时候我们需要清楚的看到现在是几个Draw Call,从而才能优化小图。在最终打包的时候unity会自动构建大的图集,可是我开发的时候就想看图集会占几个Draw Call,这怎么办呢?如下图所示,首先将你的图片拖入unity中,将同一图集的所有图片的packing tag设置成一个名子即可。
注意你的图片不能放在Resources文件夹下面,Resources文件夹下的资源将不会被打入图集,切记(也就是在这里混淆了我很久)。然后在Windows-&Sprite Packer 里,点击packer 在这里你就可以预览到你的图集信息。图集的大小还有图集的格式等等很多参数我们都是可以控制的,也可以通过脚本来设置。我在下一篇文章里详细说这个(请期待嘿嘿)。
图集的预览紧紧是让你看看你的图集大概张什么样子。那么我们的图集的这张图片保存在了哪里呢?它保存在和Assets文件夹同级的目录,Libary/AtlasCache里面。你不用管它,也不要删除它,就算你删除了也没用因为只要你打包,它就会生成并且会打到包中。
此时在Hierarchy视图中创建两个Image对象。如下图所示,我们可以清楚的看到此时我的draw call已经被合并成了 1。
这两个图片是我是在Editor模式下预先拖入Hierarchy视图中的,可是如果我想运行时根据图片的名子来动态创建精灵该如何?可是unity根本没有提供加载图集的方法,也没有提供加载图集上某个图片的方法。 因为UGUI就不像让开发者有图集的这个概念,可是我们肯定是要实现这个需求的。。怎么办呢?
第一个设想,先把散=小图打包成图集,然后再把所有散图拷贝在Resources文件夹下,这样运行时就能用Resources.load了。
第二个设想,还是先把小图打成图集,然后把所有小图关联在prefab上,拷贝在Resources文件夹下,这样运行时也能用Resources.load了。到底那个靠谱呢? 给大家看一个图大家就知道答案了。
如下图所示,打成图集的图片如果在放在Resources那么资源就变成双份了。。 所以我们只能把小图关联在Prefab上,把所有的Prefab放在Resources下面,这样就不占用多余的空间了。
好了,现在方法我们已经掌握,那么就开始写工具吧。如下图所示可以按文件夹分,每一个文件夹就是一个图集。然后每一张小图创建一个Prefab,Prefab的名子就起小图的名子,文件关联在Resources下面。
代码比较简单,我就不注释了。
[MenuItem ("MyMenu/AtlasMaker")]
static private void MakeAtlas()
string spriteDir = Application.dataPath +"/Resources/Sprite";
if(!Directory.Exists(spriteDir)){
Directory.CreateDirectory(spriteDir);
DirectoryInfo rootDirInfo = new DirectoryInfo (Application.dataPath +"/Atlas");
foreach (DirectoryInfo dirInfo in rootDirInfo.GetDirectories()) {
foreach (FileInfo pngFile in dirInfo.GetFiles("*.png",SearchOption.AllDirectories)) {
string allPath = pngFile.FullN
string assetPath = allPath.Substring(allPath.IndexOf("Assets"));
Sprite sprite = Resources.LoadAssetAtPath&Sprite&(assetPath);
GameObject go = new GameObject(sprite.name);
go.AddComponent&SpriteRenderer&().sprite =
allPath = spriteDir+"/"+sprite.name+".prefab";
string prefabPath = allPath.Substring(allPath.IndexOf("Assets"));
PrefabUtility.CreatePrefab(prefabPath,go);
GameObject.DestroyImmediate(go);
然后是运行时的代码。
using UnityE
using System.C
using UnityEngine.UI;
public class UIMain : MonoBehaviour {
void Start ()
CreatImage(loadSprite("image0"));
CreatImage(loadSprite("image1"));
private void CreatImage(Sprite sprite ){
GameObject go = new GameObject(sprite.name);
go.layer = LayerMask.NameToLayer("UI");
go.transform.parent =
go.transform.localScale= Vector3.
Image image = go.AddComponent&Image&();
image.sprite =
image.SetNativeSize();
private Sprite loadSprite(string spriteName){
return Resources.Load&GameObject&("Sprite/" + spriteName).GetComponent&SpriteRenderer&().
因为这两个图是在同一个图集上,所以drawcall就是1了。这样我们就可以根据图片的名子来运行时加载图片了。
接下来就是Assetbundle了,如果我们的图集需要在线更新那该怎么办呢? 其实Assetbundle比Resources要更简单一些,无论如何我们要先开始打图集。
using System.C
using UnityEngine.UI;
public class UIMain : MonoBehaviour {
void Start ()
CreatImage(loadSprite("image0"));
CreatImage(loadSprite("image1"));
private void CreatImage(Sprite sprite ){
GameObject go = new GameObject(sprite.name);
go.layer = LayerMask.NameToLayer("UI");
go.transform.parent =
go.transform.localScale= Vector3.
Image image = go.AddComponent&Image&();
image.sprite =
image.SetNativeSize();
private Sprite loadSprite(string spriteName){
return Resources.Load&GameObject&("Sprite/" + spriteName).GetComponent&SpriteRenderer&().
如下图所示,我的assetbundle已经打出来了。
然后把UIMain.cs在改一改。
using UnityE
using System.C
using UnityEngine.UI;
public class UIMain : MonoBehaviour {
AssetBundle assetbundle =
void Start ()
CreatImage(loadSprite("image0"));
CreatImage(loadSprite("image1"));
private void CreatImage(Sprite sprite ){
GameObject go = new GameObject(sprite.name);
go.layer = LayerMask.NameToLayer("UI");
go.transform.parent =
go.transform.localScale= Vector3.
Image image = go.AddComponent&Image&();
image.sprite =
image.SetNativeSize();
private Sprite loadSprite(string spriteName){
#if USE_ASSETBUNDLE
if(assetbundle == null)
assetbundle = AssetBundle.CreateFromFile(Application.streamingAssetsPath +"/Main.assetbundle");
return assetbundle.Load(spriteName) as S
return Resources.Load&GameObject&("Sprite/" + spriteName).GetComponent&SpriteRenderer&().
为把NGUI干掉的目标而奋斗,嘻嘻。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!怎么将图集那样N张图片切割出来呢_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:87,383贴子:
怎么将图集那样N张图片切割出来呢收藏
除了使用PS切片有其他快速的方法吗,NGUI好像也有手动切不过一样好麻烦,这样的图片没有坐标信息不能直接做图集吧,有什么方法分出来吗
SiKi学院上有大量的项目案例课程,可以让学员随时随地学习!通过案例来从入门到深入的学习Unity!
导入以后 把sprite mode改成multiple 然后点下面的sprite editor 左上角slice自动切割
自动切割太好用了,灰常感谢啊
做横版游戏?带上我好吗
哈哈 我也刚好用过别人资源。sprite mode改成multiple 并自动分割后,坐标会记录到.meta需要自己写个Editor类或小工具,根据.meta文件中的坐标写方法 分割图片 生成多个图片我写的代码在内网,所以没办法贴了。
这种屁大的事,不用Unity我自豪。。。
using UnityEusing UnityEusing System.Collections.Gusing System.IO;public static class SpriteSheetPackerImport{[MenuItem(&Assets/Sprite Sheet Packer/Process to Sprites&)]static void ProcessToSprite(){Texture2D image = Selection.activeObject as Texture2D;//获取旋转的对象string rootPath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(image));//获取路径名称string path = rootPath + &/& + image.name + &.PNG&;//图片路径名称TextureImporter texImp = AssetImporter.GetAtPath(path) as TextureIAssetDatabase.CreateFolder(rootPath, image.name);//创建文件夹foreach (SpriteMetaData metaData in texImp.spritesheet)//遍历小图集{Texture2D myimage = new Texture2D((int)metaData.rect.width, (int)metaData.rect.height);//abc_0:(x:2.00, y:400.00, width:103.00, height:112.00)for (int y = (int)metaData.rect.y; y & metaData.rect.y + metaData.rect. y++)//Y轴像素{for (int x = (int)metaData.rect.x; x & metaData.rect.x + metaData.rect. x++)myimage.SetPixel(x - (int)metaData.rect.x, y - (int)metaData.rect.y, image.GetPixel(x, y));}//转换纹理到EncodeToPNG兼容格式if(myimage.format != TextureFormat.ARGB32 && myimage.format != TextureFormat.RGB24){Texture2D newTexture = new Texture2D(myimage.width, myimage.height);newTexture.SetPixels(myimage.GetPixels(0),0);myimage = newT}var pngData = myimage.EncodeToPNG();//AssetDatabase.CreateAsset(myimage, rootPath + &/& + image.name + &/& + metaData.name + &.PNG&);File.WriteAllBytes(rootPath + &/& + image.name + &/& + metaData.name + &.PNG&, pngData);}}}终于写好了,嘿嘿,谢谢
提供的API,虽然里面找不到这些功能不过让我知道了还有TextureImporter这东西,谷歌太强大了,查了一上午的API用法终于给我写好了
使用方法,把图片用自带的切割功能切割好后,点击图片,Assets/Sprite Sheet Packer/Process to Sprites单击就OK了
好东西,感谢分享
lz的好东西,感谢分享
原生2d好蛋碎。。。
求素材可以吗
你这些人物动作素材哪里找的啊。。。我是画图白痴。T.T
Advanced 模式下分割图片然后应用,但是还没没有分割出许多小图片
我也求素材,
我也遇到类似的问题 , 不知道坐标信息哪里可以搞得到?。。。
好像没什么
屌大的回答我一下,自动打包的图集后,什么文件存储的图片坐标?
素材可以反编译天天酷跑apk
试了几个办法
还是楼主这个法好 谢谢楼主
素材哪来的
楼主6啊,,,,我正愁怎么把这个怎么分出来了,,真是雪中送炭啊,,阿里嘎都!!!!!!!
登录百度帐号在什么重要的问题上,你跟其他的人有不同的看法?
[Unity优化]UGUI图集的使用
参考链接:
http://www.xuanyusong.com/archives/3304
http://www.xuanyusong.com/archives/3315
Sprite Packer的使用:
http://liweizhaolili.blog.163.com/blog/static//
1.在unity5中,Statistics面板中的Batches即为drawcall。并且,新建一个空场景,drawcall的初始值为2,所以一般drawcall的计算要从2开始
2.在导入图片时,最好就是一个图集对应一个文件夹,文件夹的名字即为图集的名字
using UnityE
using UnityE
using System.IO;
public class AutoSetPackingTag : AssetPostprocessor {
void OnPostprocessTexture(Texture2D texture)
string atlasName = new DirectoryInfo(Path.GetDirectoryName(assetPath)).N
TextureImporter textureImporter = assetImporter as TextureI
textureImporter.textureType = TextureImporterType.S
textureImporter.spritePackingTag = atlasN
textureImporter.mipmapEnabled =
3.需要打包成图集的图片不能放在Resources文件夹内,也就是说,我们无法通过Resources.Load的方式加载图片。对此,有两种解决方法:
a.将图片保存到prefab中,prefab放到Resources文件夹内。不过当需要加载的图片比较多时,这种方法就比较麻烦。可以使用ScriptableObject把图片序列化保存,这样会比较方便一些
using UnityE
using System.Collections.G
using System.IO;
using UnityE
public class SpriteScriptableObject : ScriptableObject {
public List&Sprite& list = new List&Sprite&();
//字典无法被序列化
public Dictionary&string, Sprite& nameSpriteDir = new Dictionary&string, Sprite&();
public void ReadData(string dataDir)
list = new List&Sprite&();
string[] filePaths = Directory.GetFiles(dataDir);
foreach(string s in filePaths)
if (!s.EndsWith(".meta"))
Sprite sprite = AssetDatabase.LoadAssetAtPath&Sprite&(s);
list.Add(sprite);
Debug.Log(sprite.name);
public void Init()
for (int i = 0; i & list.C i++)
nameSpriteDir.Add(list[i].name, list[i]);
using UnityE
using System.C
using UnityE
using System.IO;
using System.R
public enum ScriptableObjectType
SpriteScriptableObject,
public class CreateScriptableObject : EditorWindow {
static string dataD
static string outputDir = "Assets/";
static ScriptableObjectType scriptableObjectT
[MenuItem("Window/CreateScriptableObject")]
static void Init()
EditorWindow.GetWindow(typeof(CreateScriptableObject));
void OnGUI()
EditorGUILayout.BeginHorizontal();
dataDir = EditorGUILayout.TextField("数据目录", dataDir);
if (GUILayout.Button("拾取路径")) dataDir = AssetDatabase.GetAssetPath(Selection.objects[0]);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
outputDir = EditorGUILayout.TextField("输出目录", outputDir);
if (GUILayout.Button("拾取路径")) outputDir = AssetDatabase.GetAssetPath(Selection.objects[0]);
EditorGUILayout.EndHorizontal();
name = EditorGUILayout.TextField("名字", name);
scriptableObjectType = (ScriptableObjectType)EditorGUILayout.EnumPopup("类型", scriptableObjectType);
if (GUILayout.Button("输出"))
//Type.GetType对于继承UnityEngine.Object的类会返回空
//string className = scriptableObjectType.ToString();
//Debug.Log(className);
//Type t = Type.GetType(className);
//if (t == null) Debug.Log("null");
switch (scriptableObjectType)
case ScriptableObjectType.SpriteScriptableObject :
SpriteScriptableObject so = ScriptableObject.CreateInstance&SpriteScriptableObject&();
so.ReadData(dataDir);
AssetDatabase.CreateAsset(so, outputDir + name + ".asset");
AssetDatabase.Refresh();
using UnityE
using System.C
using System.Collections.G
using UnityEngine.UI;
public class NewBehaviourScript1 : MonoBehaviour {
public Image[]
// Use this for initialization
void Start ()
SpriteScriptableObject sso = Resources.Load&SpriteScriptableObject&("2");
sso.Init();
Debug.Log(sso.list.Count);
Debug.Log(sso.nameSpriteDir.Count);
images[0].sprite = sso.nameSpriteDir["a"];
images[1].sprite = sso.nameSpriteDir["b"];
images[2].sprite = sso.nameSpriteDir["c"];
b.使用AB包的形式。将同一个图集的小图的AB包名字设置为相同的,即可将这些小图打包到同一个AB包中
using UnityE
using System.C
using UnityEngine.UI;
public class NewBehaviourScript : MonoBehaviour {
public Image[]
// Use this for initialization
void Start ()
AssetbBundleManager.Instance.Load(@"file:///" + Application.dataPath + "/AB/", "2.unity3d",
(ab, name) =&
Sprite a = AssetbBundleManager.Instance.GetAsset&Sprite&(ab, "a");
images[0].sprite =
Sprite b = AssetbBundleManager.Instance.GetAsset&Sprite&(ab, "b");
images[1].sprite =
Sprite c = AssetbBundleManager.Instance.GetAsset&Sprite&(ab, "c");
images[2].sprite =
4.图集占内存的计算:对于一张的RGBA图集,占4M内存()
5.如果把带透明通道和不带透明通道的小图打包到同一图集,unity会把它分成两组
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 unity 打图集 的文章

 

随机推荐