unity中怎么把textrue2d转化为unity2d sprite 图片

Unity开发之路上的那些坑(一)2D Sprite占用的Batches问题 - 简书
Unity开发之路上的那些坑(一)2D Sprite占用的Batches问题
『Unity开发之路上的那些坑』这个系列将会记录我在Unity游戏开发上遇到的那些坑和解决办法。
一、问题概述:相同的2D Sprite 却重复占用Batches
我们的手游项目上要重建一个城市的面貌,其中不可缺的就是树木、路灯等装饰物,为了达到美观和省资源的目的,我们选择了使用2D Sprite代替3D模型的方法。
看上去很像是3D的吧?
其实是障眼法
本以为是节省资源的做法,最终却发现CPU占用率非常高。后来发现是因为Batches数量太多,上图的每一个树木2D Sprite都占用了一个Batch!按常理来说,多个相同的物体(静态)会被Unity优化为只占用一个Batch,然而2D Sprite却没有。明显是相同的东西却不能批处理实在奇怪。
二、解决办法 :图集下的2D Sprite才能批处理
1、点击你导入的图片文件,进入Inspector界面
2、如上图所示将Sprite Mode改为Multiple,packing tag随便写,点击Apply应用。
3、好了,现在你会发现这张图片无法拖进场景了(如果是在拖拽进场景后再设为Multiple的话场景中图片会消失)
4、接下来点击Inspector界面中的Sprite Editor
Inspector界面
5、Sprite Editor界面,然后点击左上角的Slice按钮
Sprite Editor
6、再点击Slice
Sprite Editor
7、会多了一个灰色的框
Sprite Editor
8、选择这个框,点击左上角的Trim,应用
Sprite Editor
9、然后就多了右边这个tree22_0,这个文件就是我们要拖到场景中的2D Sprite,无论场景中有多少个这个Sprite都只占用一个Batch。问题解决。
一个兴趣使然的多功能程序员Unity教程之-Unity3d中Sprite(精灵)的切割和导出 - CSDN博客
Unity教程之-Unity3d中Sprite(精灵)的切割和导出
Unity中经常使用到精灵,尤其是2D游戏中制作动画等!今天我们就学习下精灵的切割和导出吧!
废话不多说,先建议空的工程。
1,打开Unity建工程,同时导入素材进行资源分类,工程不在于大小,这是我们对待它的态度!
2.开始分割精灵,三步走!
开始分割精灵
Apply一下,看下分割的精灵,0-9共9个。
贴精灵导出代码:
class SpriteTailed:MonoBehaviour
[MenuItem(&Tools/导出精灵&)]
void SaveSprite()
string resourcesPath =
&Assets/Resources/&;
foreach (Object obj in Selection.objects)
string selectionPath = AssetDatabase.GetAssetPath(obj);
(selectionPath.StartsWith(resourcesPath))
string selectionExt = System.IO.Path.GetExtension(selectionPath);
(selectionExt.Length == 0)
string loadPath = selectionPath.Remove(selectionPath.Length - selectionExt.Length);
loadPath = loadPath.Substring(resourcesPath.Length);
Sprite[] sprites = Resources.LoadAll&Sprite&(loadPath);
(sprites.Length & 0)
Debug.Log(sprites.Length);
string outPath = Application.dataPath +
&/outSprite/& + loadP
System.IO.Directory.CreateDirectory(outPath);
foreach (Sprite sprite in sprites)
Debug.Log(&Export Sprite:&
+ sprite.name);
Texture2D tex =
new Texture2D((int)sprite.rect.width, (int)sprite.rect.height, sprite.texture.format,
tex.SetPixels(sprite.texture.GetPixels((int)sprite.rect.xMin, (int)sprite.rect.yMin,
(int)sprite.rect.width, (int)sprite.rect.height));
tex.Apply();
System.IO.File.WriteAllBytes(outPath +
&/& + sprite.name +
&.png&, tex.EncodeToPNG());
Debug.Log(&SaveSprite to &
+ outPath);
Debug.Log(&SaveSprite Finished&);
将脚本挂到MainCamera上,点击Tools/导出精灵:
OK,大功告成,好了,本篇unity3d教程关于Sprite精灵的切割和导出到此结束,下篇我们再会!
本文已收录于以下专栏:
相关文章推荐
思路很low,把贴图分开成两张贴图再创建两个精灵将贴图覆盖上去,因为一直没做过2D的东西,发现查缺补漏的地方还不少,记录下。
这里只简单的分了上下两片
void Cut(Vector3 a...
学习了一段时间的unity,对里面的组件有一个大致的了解,但是具体操作来说还不是很熟悉,今天看了一片关于unity sprite怎么获取切割后的图的文章,感觉还不错。
假设有一张png/tga图...
原文链接: http://blog.csdn.net/eazey_wj/article/details/
  这几天做项目时,意识到要用到大量的UI素材,图片资源...
一、如何让导入的纹理,变成一个2d精灵?
有两种方法:
首先,菜单:Edit--&Project Setting--&Editor,将Mode选项的值设置为2D;
unity3d 更换sprite renderer中sprite的图片 
所更换图片尺寸与原图片相同
版权声明:本文为博主原创文章,未经博主允许不得转载。出自 游戏开发实验室_孙广东
孙广东 
在将图片导入Unity后 做的一些设置经常会得到警告信息。所以要了解一...
最近学习emgucv,我在写读摄像头的程序然后需要bitmap 转texture2D 其实可以直接使用setdata的方法赋值,感觉帧率不是一般的低,是无法忍受的。
也试了多种方法,基本上都是无法忍...
《Unity 4.x 入门到精通》完整pdf 700M:
/c0m60si5ms
提取密码:qq#iBookPdf
解压密码:ebookair...
unity3d和Android java通信 传输 byte图片在Texture2d显示经过两三天的折腾 将安卓图片变成byte再变成string传输到unity进行显示图片,遇到了很多的难处,除了查...
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
_____________________________________________________________________________________________________________
问答求助版块规则:
  1、问题尽量描述清楚
& && &2、代码要放在代码块里
& && &3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
& && &4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
& && &5、问题得到解决,请选择最佳答案。
& && &6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 1621|回复: 18
unity2d在脚本中获取切割后的sprite
本帖为抢楼帖,欢迎抢楼!&
110/50排名<font color="#FF昨日变化32主题帖子积分
注册看看, 积分 10, 距离下一级还需 40 积分
注册看看, 积分 10, 距离下一级还需 40 积分
在线时间3 小时
Resource.loadAll(*/swan_Sheet) 这个图片.&&返回的数组[0]就是swan_Sheet这个Texture2D对象, 其他的就它分 ...
我找了2天 终于找到了 感谢!
每日推荐:
3178/300排名<font color="#FF昨日变化15主题帖子积分
偶尔光临, 积分 178, 距离下一级还需 122 积分
偶尔光临, 积分 178, 距离下一级还需 122 积分
在线时间33 小时
如题,在unity中把sprite切割以后,我怎么在脚本中获取到这个切割后的单个sprite啊?
(3.45 KB, 下载次数: 7)
16:29 上传
本帖被以下淘专辑推荐:
& |主题: 37, 订阅: 4
每日推荐:
3237/300排名<font color="#FF昨日变化3主题帖子积分
偶尔光临, 积分 237, 距离下一级还需 63 积分
偶尔光临, 积分 237, 距离下一级还需 63 积分
在线时间13 小时
Resource.loadAll(*/swan_Sheet) 这个图片.&&返回的数组[0]就是swan_Sheet这个Texture2D对象, 其他的就它分割出的sprite
每日推荐:
120/50排名<font color="#FF昨日变化31主题帖子积分
注册看看, 积分 20, 距离下一级还需 30 积分
注册看看, 积分 20, 距离下一级还需 30 积分
在线时间0 小时
1)打成图集。图集拖动到你自己的脚本中
每日推荐:
3178/300排名<font color="#FF昨日变化15主题帖子积分
偶尔光临, 积分 178, 距离下一级还需 122 积分
偶尔光临, 积分 178, 距离下一级还需 122 积分
在线时间33 小时
1)打成图集。图集拖动到你自己的脚本中
怎么打成图集?NGUI的那个?
每日推荐:
7排名<font color="#FF昨日变化10主题帖子积分
在线时间7 小时
不想用NGUI,就只有用UV切图了,坐标+长宽啥的
每日推荐:
3178/300排名<font color="#FF昨日变化15主题帖子积分
偶尔光临, 积分 178, 距离下一级还需 122 积分
偶尔光临, 积分 178, 距离下一级还需 122 积分
在线时间33 小时
不想用NGUI,就只有用UV切图了,坐标+长宽啥的
NGUI那个只能切出一张啊
每日推荐:
7排名<font color="#FF昨日变化10主题帖子积分
在线时间7 小时
NGUI那个只能切出一张啊
没明白你想要干嘛,你是想获取图集里面的单个元素?如果是那样的话,直接用,atlas。里面spritelist。用名字索引就行了
每日推荐:
7排名<font color="#FF昨日变化10主题帖子积分
在线时间7 小时
NGUI那个只能切出一张啊
没明白你想要干嘛,你是想获取图集里面的单个元素?如果是那样的话,直接用,atlas。里面spritelist。用名字索引就行了
每日推荐:
3178/300排名<font color="#FF昨日变化15主题帖子积分
偶尔光临, 积分 178, 距离下一级还需 122 积分
偶尔光临, 积分 178, 距离下一级还需 122 积分
在线时间33 小时
没明白你想要干嘛,你是想获取图集里面的单个元素?如果是那样的话,直接用,atlas。里面spritelist。用 ...
就是我要获取到下图中划线的那个sprite
(4.84 KB, 下载次数: 2)
15:03 上传
(4.84 KB, 下载次数: 2)
15:04 上传
每日推荐:
7排名<font color="#FF昨日变化10主题帖子积分
在线时间7 小时
就是我要获取到下图中划线的那个sprite
打成图集, atlas 是可以通过名字来获取到单个的 用 atlas 中 getsprite()方法
每日推荐:
3178/300排名<font color="#FF昨日变化15主题帖子积分
偶尔光临, 积分 178, 距离下一级还需 122 积分
偶尔光临, 积分 178, 距离下一级还需 122 积分
在线时间33 小时
打成图集, atlas 是可以通过名字来获取到单个的 用 atlas 中 getsprite()方法
____________________________ NGUI的图集?
每日推荐:
7排名<font color="#FF昨日变化10主题帖子积分
在线时间7 小时
____________________________ NGUI的图集?
对啊,如果不是,你可以看看UV贴图
每日推荐:
61064/1500排名<font color="#FF昨日变化2主题帖子积分
蛮牛粉丝, 积分 1064, 距离下一级还需 436 积分
蛮牛粉丝, 积分 1064, 距离下一级还需 436 积分
在线时间304 小时
同一个atlas里通过spriteName设置图片UISprite sprite = gameObject.GetComponent();sprite.spriteName = &XXX&;
每日推荐:
3178/300排名<font color="#FF昨日变化15主题帖子积分
偶尔光临, 积分 178, 距离下一级还需 122 积分
偶尔光临, 积分 178, 距离下一级还需 122 积分
在线时间33 小时
同一个atlas里通过spriteName设置图片UISprite sprite = gameObject.GetComponent();sprite.spriteName = & ...
这个是NGUI的嘛,我那个是用的unity原生2d
每日推荐:
连续签到30天Unity2D,怎样从资源里加载一个图集中的一个sprite
Unity2D,怎样从资源里加载一个图集中的一个sprite,图集是一个png文件。选择了sprite 模式是multiple。要从中取得任意一个Sprite,有什么办法?
要评论请先&或者&
如果是图集里的图片,直接给sprite就容易了,直获取UISprite.spritename = “想要获取的精灵名称”;
:如果是图集里的图片,直接给sprite就容易了,直获取UISprite.spritename = “想要获取的精灵名称”; 我说的不是NGUI里面的,是unity里面的2d工具,动态的换sprite
:我说的不是NGUI里面的,是unity里面的2d工具,动态的换sprite 额,, 没有过unity的2d工具,抱歉~~帮不到你了
:额,, 没有过unity的2d工具,抱歉~~帮不到你了 没事,谢谢!
GameObject go = new GameObject();
go.name = &sprite&;
go.transform.localScale = new Vector3(,,);
SpriteRenderer sr = go.AddComponent&SpriteRenderer&();
sr.sprite &= Resources.Load&Sprite&(&&);
:GameObject go = new GameObject();
go.name = &sprite&;
go.transform.localScale = new Vector3(,,);
SpriteRenderer sr... 我取的是sprite,也就是资源中的纹理里面的一部分。你这样取取到的是一张纹理吧。
:我取的是sprite,也就是资源中的纹理里面的一部分。你这样取取到的是一张纹理吧。 你这要求太风骚了
可以通过Resources.LoadAll&Sprite&(TexturePath);加载所有sprite,然后根据名字选择一个需要的
中上所述还是NGUI比较靠谱Unity开发-使用Sprite做简单的2D精灵动画播放和移动
//----------------------
//PS:如果转载,记得附上我这里原文的链接,最近发现我有文章被转载之后我自己原文都没人进了,我这个新
人菜鸟抽时间出来分享的东西是花了我的心思在里面的.感觉没原文链接好像文章不是我写的了.心略疼.
//----------------------&
&Unity,在前不久发布了4.3版本,这个版本可谓真是高端洋气上档次啊,因为这个版本的发布Unity不再叫Unity3D了(虽然本来它就不叫Unity3D==),主要是它是增加了2D部分,虽然之前在4.3还没发布之前也有不少的插件,其中也有插件是做2D的,但是,插件毕竟插件.尤其在手机开发上,对效率影响多多少少还是有的.之前感觉Unity在3D部分能做到这么的出色,所以觉得Unity会做2D部分也是迟早的事情了。结果在有生之年还是出现了。而这次我也利用些零碎的时间来体验下Unity的2D是怎样的.这次也是简单的做下2D精灵的动画播放和移动,就是根据我键盘的输入进行相应的移动并且播放相应的动画.不过这次我还没有参照过Unity文档之类的东西,只是利用我之前在其它框架或者引擎上做2D的经验来搞的,所以可能会避免不了走了一些弯路.不过之后有时间的话再详细看吧。
&------------------------
&Unity版本:4.3.0f4
&系统环境:Mac ox 10.8
&主要使用的语言:C#
&-------------------------
&这次的示例工程文件我上传到了GitHub上了,.
&在Unity4.3的版本中,首先从界面上已经有所变化,主要看下面这里,&
&它可以随时的切换2D或者是3D的界面,现在Unity在建立Project的时候可以在窗口下方直接选择默认是2D还是3D模式,在ProjectSettings-&Editor也可以设置.
&然后在Unity的2D部分中,我稍微看了下它的代码上设计(主要是类之间的关系),在2D部分它最主要是多了一个Sprite类,这个Sprite类并不进行渲染,它只是为了产生一些精灵需要的一些数据,如位置,参考点等.然后真正做渲染的是一个继承自Component的SpriteRenderer类。SpriteRenderer作为GameObject的其中一个插件做渲染的.Sprite只要传入到SpriteRenderer中就可以.
&下面就一步一步的说下我怎样用Unity制作这个Demo吧.
&第一:建立Unity的Sprite精灵.
&建立方法如下:GameObject-&CreateOther-&Sprite,建立之后你会发现,出来是一个空的对象.其实很简单,因为在SpriteRenderer中Sprite参数是空的.下面就说明怎样建立一个Sprite对象.首先,导入一张2D图片,我导入的是下面这张图片.因为待会要用到它来搞人物动画.
&导入成功后,点击图片,就会在Inspector上出现导入的设置界面.Texture
Type设置成Sprite类型,之后你应该会看到下面这样的项目的.
&我说明下各个参数的意义:
Type:纹理类型,主要是你导入的图片是用来干什么的,然后选择相应的类型,这里选择Sprite就代表是2D精灵,以前设置的多都是Texture类型.
&SpriteMode:精灵模式,单个和多个.意义就在于你这个精灵图片是只是一张图片就是一个精灵还是一个图片有多张精灵.如果你选择了Multiple的话会多了一个SpriteEditor的界面.界面如下:
&你可以之间用它来裁剪每一个精灵,之后它返回的是一组精灵图片给你.本来我是想利用它返回的图片组来搞精灵动画的,估计受了之前用cocos2dx的一个精灵处理软件的影响.结果发现了在这里用出了不少问题所以这次我也用了很传统的方法来弄播放动画的功能.
&PackageTag:主要用在Unity图集编辑器的功能中,关于Unity的图片集貌似还只是预览版来的,所以默认也是关闭状态.这里就不详细讲它.只说明下怎样打开SpritePacker窗口和这个PackageTag的意义就好.SpritePackage就是2D游戏经常用到的图集,打开方法也有提示了:就是在Edit-&Project
Settings-&Editor,Sprite
Packer选项,默认disable,修改Mode.然后,如果你启用了之后PackageTag的作用就显而易见了,如果你没有任何标签,那么你就加入不了图集中了.
& & Pixels To
Units:这里需要修正一下,这个确实是将精灵图片的像素值转换成单位,而且这个转换是依据一个公式进行的,就是
Unity单位 = 精灵的宽或者高 / PixelsToUnits值 *
缩放大小,这里所说的单位你理解成米也行,反正这个单位大小是GameObject的Transform里面Position所支持的值,而这个参数就是影响了转换结果,如果PixelsToUnits值越小那么渲染出来的图片就会越大,我一般没特殊需求是不改这个值的。(我以前写的是-&指的是多少像素为一个单位,一个单位内像素越高,分辨率越高,图像越清晰,但是一般实际情况是在游戏中一般般就好了,不要弄得太大&-这个最近发现这样写有问题)
Pivot:描点,和在cocos2dx中anchorPoint是一个概念来的,这里它是提供几个参数来的,一般直接用Center就可以了。在Sprite类中产生是必须要有这个参数的.
& &&Filter
Mode:过滤模式,和Texture2D一样,有点模式,双线性模式,三线性模式.过滤模式也就这几种了。直接用双线性就好,没特殊要求一般都不换的.
然后这次的话SpriteMode选择Single就好,自己截,自己弄动画.
第二步:获取图片每一帧的精灵产生每一个动作的动画数组并且显示其中一帧的精灵
刚刚说了SpriteModel选择了Single,所以传入的就是一张图片精灵,像这个图片人物有四个方向,所以现在就是通过Sprite类来将图片每一个方向的每一帧都截出来并且加入到每个数组中,从而我调用其中一个数组就可以获取该人物的一个方向的动画.
首先就是要定义一个ArrayList数组(js就是Array),来存储每一个方向的动画.还有就是要传入刚刚生成好的Sprite图片.
& &&private&ArrayList&_sprites;
& public&Texture2D&_spriteTexture;
然后就是需要根据行列来截图从而产生Sprite.不过先定义图片精灵的行列吧.
& &&public&int&rows;
& & public&int&cols;
之后就可以开始截了.截的方法也很传统,先创建一个数组存储的是每一行的动作,然后的话在将这个数组存入到_sprites中做动画组就好。
& & for(int&j&=&0&;&j&&&rows&;&j++){
&&ArrayList&animFrames&=&new&ArrayList();
&&for(int&i&=&0&;&i&&&cols&;&i++){
&&Rect&spriteRect&=&new&Rect(_spriteTexture.width/cols&*&i,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&_spriteTexture.height/rows&*&j&,
&&&&&&&&&&&&&&&&&
&&_spriteTexture.width/cols,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&_spriteTexture.height/rows);
&&&&&&&&&&&&&&&&Sprite&tempSprite&=&Sprite.Create(_spriteTexture,spriteRect,new&Vector2(0,0));
&&&&&&&&&&&&&&&&animFrames.Add(tempSprite);
& &_sprites.Add(animFrames);
通过设置SpriteRenderer的Sprite属性从而能让其中一帧精灵显示到屏幕上.在此之前先要获取SpriteRenderer组件.
& &private&SpriteRenderer&_spriteRender;
&然后就是获取SpriteRenderer。
&_spriteRender&=&this.GetComponent(typeof(SpriteRenderer))&as&SpriteRenderer;
&修改SpriteRenderer的Sprite属性,CurrentIndex代表的是从_sprites获取其中一个动画组。
&ArrayList&array&=&(ArrayList)_sprites[currentIndex];
_spriteRender.sprite&=&array[0]&as&Sprite;
&如果顺利的话你运行后能够在屏幕上看到精灵已经显示上去了.
&第三步:运行精灵动画.
&运行动画的话只要注意在Update中的帧数问题,自己要稍微处理下,否则帧数过快运行的动画就特别快了.其实处理方法用很传统方法就行.
&先定义一个时间间隔的变量,还有一个是记录目前的时间过了多少.
& &private&const&float&intervalTime&=&0.1f;
&&private&float&interval;
&然后在Unity的Update()函数中:
&interval&-=&Time.deltaTime;
&if(interval&&=&0){
& &//播放精灵动画的代码在这里
&interval&=&intervalTime;
&之后需要的就是播放精灵动画,在第二步中已经在_sprites数组中存入每个方向的动画了,之后就在刚刚那个if中添加播放的代码就好.首先定义一个变量代表目前的动画在哪一帧.
&private&int&index;
&然后也是通过修改SpriteRenderer的Sprite属性从而修改精灵图片,因为在update中的所以就可以实现动画播放效果了.记得播放玩了之后要index++,继续播放下一帧.
&ArrayList&array&=&(ArrayList)_sprites[currentIndex];
&_spriteRender.sprite&=&array[index&%&cols]&as&Sprite;
& &index&++;
&如果顺利的话你会发现精灵已经会动起来了.
&第四步:添加按键事件,能够控制精灵并且根据按键方向播放相应动画.
&添加键盘事件,只要使用Input.GetKeyDown(KeyCode
code)方法就行.但是我这次就是需要添加一个效果,如果我按下按键才播放动画,如果按键提起的时候就停止动画.所以还要判断用户是否提起了按键,所以还要使用一个事件Input.anyKey就可以.但是Input.anyKey是代表是否有任何一个按键按下.所以判断时候!Input.anyKey就好.
&不过还要为Player添加状态,状态一就是按下键后需要运行动画,还有一个状态就是按键提起后静止的状态.使用枚举定义.
& &enum&PlayerState{
&standing&=&0,
&running&=&1
& &然后就是定义一个变量记录Player状态:private&PlayerState&_state;状态默认就是standing.
在第三步中update()中添加if时间判断是否为running状态,是running状态才进行帧循环,运行动画.然后就是在响应按键事件后改变精灵的动画.这时候只要改currentIndex的值就行.然后就是要进行精灵的向量移动.这个其实也不难,Unity中的Vector2已经有标示各个方向的坐标了.向上就是Vector2.up,记得向下不是Vector2.down,因为向下就是向上的相反的向量,所以直接-Vector2.up也行.
&最后在Update中不断的移动就可以.方法是:this.transform.Translate(currentDir&*&Time.deltaTime);
&currentDir是我自己定义的一个标示目前方向的二维向量.Time.deltaTime就不用解释了吧.用过Unity的肯定都知道这个是什么的.不知道的自己输出下也很容易理解的。
&如果顺利的话你就可以用键盘控制精灵了!
&通过这次我自己的一个初步的接触到Unity的2D的引擎上的设计,虽然感觉还是有不少问题,例如屏幕和摄像机之类的,而我现在在Unity开发也是3D的为主,2D的也希望以后能有机会用它开发吧.这次也算是记录我的一个学习过程.
&博客少上了,不过我github上也会经常分享我自己业余写的代码,最近想法是想把打包工具完全抽离出来不依赖任何工程,就在我的github上(/GITHZZ),这个我还是会经常登录的,还有看到一些好的代码我也会star下,有需要的人可以不断扩散,毕竟技术的成长是离不开分享的,这很重要。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 unity2d 看不到sprite 的文章

 

随机推荐