unity的spriteunity怎么添加sprite贴图

扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
关注:1507
当前位置: &
__________________________________________________________________________________
开发者干货区版块规则:
  1、文章必须是图文形式。(至少2幅图)
& && &2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
& && &3、本版块只支持在游戏蛮牛原创首发,不支持转载。
& && &4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
& && &5、......
__________________________________________________________________________________
查看: 2973|回复: 14
雨松MOMO UGUI 之 全面理解图集与使用(三)
本帖为抢楼帖,欢迎抢楼!&
9排名<font color="#FF昨日变化主题帖子积分
蛮牛币4832
在线时间64 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
UGUI的图集打包与工作原理,看了一天多,终于看明白了~晕~还是记录一下我研究的成果,分享给大家,一起学习和研究。
先说说UGUI的Atlas和NGUI的Atlas的区别,NGUI是必须先打出图集然后才能开始做界面。这一点很烦,因为始终都要去考虑你的UI图集。比如图集会不会超1024 ,图集该如何来规划等等。而UGUI的原理则是,让开发者彻底模糊图集的概念,让开发者不要去关心自己的图集。做界面的时候只用小图,而在最终打包的时候才会把你的小图和并在一张大的图集里面。然而这一切一切都是自动完成的,开发者不需要去care它。
如下图所示,Editor-&Project Settings 下面有sprite packer的模式。Disabled表示不启用它,Enabled For Builds 表示只有打包的时候才会启用它,Always Enabled 表示永远启用它。 这里的启用它就表示是否将小图自动打成图集。
1.png (66.85 KB, 下载次数: 2)
12:13 上传
我的选项是Always Enabled 。因为开发的时候我们需要清楚的看到现在是几个Draw Call,从而才能优化小图。在最终打包的时候unity会自动构建大的图集,可是我开发的时候就想看图集会占几个Draw Call,这怎么办呢?如下图所示,首先将你的图片拖入unity中,将同一图集的所有图片的packing tag设置成一个名子即可。
2.png (55.82 KB, 下载次数: 2)
12:14 上传
注意你的图片不能放在Resources文件夹下面,Resources文件夹下的资源将不会被打入图集,切记(也就是在这里混淆了我很久)。然后在Windows-&Sprite Packer 里,点击packer 在这里你就可以预览到你的图集信息。图集的大小还有图集的格式等等很多参数我们都是可以控制的,也可以通过脚本来设置。我在下一篇文章里详细说这个(请期待嘿嘿)。
3.png (242.65 KB, 下载次数: 2)
12:15 上传
图集的预览紧紧是让你看看你的图集大概张什么样子。那么我们的图集的这张图片保存在了哪里呢?它保存在和Assets文件夹同级的目录,Libary/AtlasCache里面。你不用管它,也不要删除它,就算你删除了也没用因为只要你打包,它就会生成并且会打到包中。
此时在Hierarchy视图中创建两个Image对象。如下图所示,我们可以清楚的看到此时我的draw call已经被合并成了 1。
4.png (165.22 KB, 下载次数: 2)
12:15 上传
这两个图片是我是在Editor模式下预先拖入Hierarchy视图中的,可是如果我想运行时根据图片的名子来动态创建精灵该如何?可是unity根本没有提供加载图集的方法,也没有提供加载图集上某个图片的方法。 因为UGUI就不像让开发者有图集的这个概念,可是我们肯定是要实现这个需求的。。怎么办呢?
第一个设想,先把散=小图打包成图集,然后再把所有散图拷贝在Resources文件夹下,这样运行时就能用Resources.load了。
第二个设想,还是先把小图打成图集,然后把所有小图关联在prefab上,拷贝在Resources文件夹下,这样运行时也能用Resources.load了。到底那个靠谱呢? 给大家看一个图大家就知道答案了。
如下图所示,打成图集的图片如果在放在Resources那么资源就变成双份了。。 所以我们只能把小图关联在Prefab上,把所有的Prefab放在Resources下面,这样就不占用多余的空间了。
5.png (41.89 KB, 下载次数: 2)
12:16 上传
好了,现在方法我们已经掌握,那么就开始写工具吧。如下图所示可以按文件夹分,每一个文件夹就是一个图集。然后每一张小图创建一个Prefab,Prefab的名子就起小图的名子,文件关联在Resources下面。
6.png (40.26 KB, 下载次数: 2)
12:17 上传
代码比较简单,我就不注释了。
[AppleScript] 纯文本查看 复制代码[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);
然后是运行时的代码。
[ColdFusion] 纯文本查看 复制代码
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了。这样我们就可以根据图片的名子来运行时加载图片了。
7.png (323.48 KB, 下载次数: 5)
12:19 上传
接下来就是Assetbundle了,如果我们的图集需要在线更新那该怎么办呢? 其实Assetbundle比Resources要更简单一些,无论如何我们要先开始打图集。
[ColdFusion] 纯文本查看 复制代码
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&().
如下图所示,我的assetbundle已经打出来了。
8.png (33.09 KB, 下载次数: 2)
12:21 上传
然后把UIMain.cs在改一改。
[ColdFusion] 纯文本查看 复制代码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&().
如下图所示,依然还是一个drawcall。
9.png (323.48 KB, 下载次数: 2)
12:22 上传
为把NGUI干掉的目标而奋斗,嘻嘻。unity resources.unity 代码动态创建unity runity 代码创建动态ugui
每日推荐:
72831/5000排名<font color="#FF昨日变化主题帖子积分
日久生情, 积分 2831, 距离下一级还需 2169 积分
日久生情, 积分 2831, 距离下一级还需 2169 积分
蛮牛币4492
在线时间914 小时
UGUI的资料很少,感谢分享
每日推荐:
5790/1000排名<font color="#FF昨日变化3主题帖子积分
熟悉之中, 积分 790, 距离下一级还需 210 积分
熟悉之中, 积分 790, 距离下一级还需 210 积分
在线时间384 小时
哈哈这做法真心不错~
1.这样的话最好自己写个AssetImporter不然每次新建预制体太累
2.AssetBundle打包的时候要解决依赖的问题,那些预制体的bundle得依赖大图bundle。
每日推荐:
61171/1500排名<font color="#FF昨日变化2主题帖子积分
蛮牛粉丝, 积分 1171, 距离下一级还需 329 积分
蛮牛粉丝, 积分 1171, 距离下一级还需 329 积分
蛮牛币1854
在线时间502 小时
好东西,标记一个先
4459/500排名<font color="#FF昨日变化7主题帖子积分
四处流浪, 积分 459, 距离下一级还需 41 积分
四处流浪, 积分 459, 距离下一级还需 41 积分
在线时间329 小时
老师,能有时间讲下5.0打包和加载的问题吗
4468/500排名<font color="#FF昨日变化2主题帖子积分
四处流浪, 积分 468, 距离下一级还需 32 积分
四处流浪, 积分 468, 距离下一级还需 32 积分
在线时间215 小时
好文章呀,写的非常的翔实
4415/500排名<font color="#FF昨日变化1主题帖子积分
四处流浪, 积分 415, 距离下一级还需 85 积分
四处流浪, 积分 415, 距离下一级还需 85 积分
蛮牛币1227
在线时间128 小时
老师,能有时间讲下5.0打包和加载的问题吗
2100/150排名<font color="#FF昨日变化6主题帖子积分
初来乍到, 积分 100, 距离下一级还需 50 积分
初来乍到, 积分 100, 距离下一级还需 50 积分
在线时间33 小时
刚会了点NGUI,莫非又要从头学UGUI?
72486/5000排名<font color="#FF昨日变化2主题帖子积分
日久生情, 积分 2486, 距离下一级还需 2514 积分
日久生情, 积分 2486, 距离下一级还需 2514 积分
在线时间677 小时
请问一下,
assetbundle = AssetBundle.CreateFromFile(Application.streamingAssetsPath +&/Main.assetbundle&); 为什么我执行这一行之后assetbundle 还是null????
71654/5000排名<font color="#FF昨日变化主题帖子积分
日久生情, 积分 1654, 距离下一级还需 3346 积分
日久生情, 积分 1654, 距离下一级还需 3346 积分
蛮牛币6522
在线时间386 小时
这个系列的讲解不错哦 谢谢分享 加油
11排名<font color="#FF昨日变化2主题帖子积分
蛮牛币2866
在线时间932 小时
ugui学习中,感谢momo分享
5673/1000排名<font color="#FF昨日变化主题帖子积分
熟悉之中, 积分 673, 距离下一级还需 327 积分
熟悉之中, 积分 673, 距离下一级还需 327 积分
蛮牛币1162
在线时间161 小时
momo还是很给力的,每次看他的文章都有不错的收获
3235/300排名<font color="#FF昨日变化5主题帖子积分
偶尔光临, 积分 235, 距离下一级还需 65 积分
偶尔光临, 积分 235, 距离下一级还需 65 积分
在线时间114 小时
本帖最后由 buzheteng 于
12:33 编辑
初学,看了LZ大神的MakeAtlas()工具代码,运行之后发现原本分别存放在各个文件夹下的PNG打包之后都到了同一个Resources/Sprite/目录。
试着改了改,保留了原有的分类文件夹。
发现能运行,不知有没有问题~
[C#] 纯文本查看 复制代码using UnityE
using System.C
using UnityE
using System.IO;
public class AtlasMaker : MonoBehaviour
//预先定义存放PNG图片和生成.prefab文件的目录(均为在Assets文件夹下的相对位置)
public static string PNG_DIR = &Atlas&;
public static string PREFAB_DIR = &/Resources/Sprite&;
//生成自定义菜单:
[MenuItem(&MyMenu/AtlasMaker&)]
static private void MakeAtlas()
//定义生成Prefab后的存放目录。
string spriteDir = Application.dataPath + PREFAB_DIR;
//如果Prefab存放目录不存在,则创建。
if (!Directory.Exists(spriteDir))
Directory.CreateDirectory(spriteDir);
//需要打包的PNG图片存放在Assets/Atlas或其子目录中。
DirectoryInfo rootDirInfo = new DirectoryInfo(Application.dataPath + &/& + PNG_DIR);
//使用两级Foreach循环遍历存放PNG图片的目录及文件。
foreach (DirectoryInfo dirInfo in rootDirInfo.GetDirectories())
foreach (FileInfo pngFile in dirInfo.GetFiles(&*.png&, SearchOption.AllDirectories))
string allPath = pngFile.FullN
//使用Substring(int i)方法取得的自字符串,包含&Assets\&
//如:Assets\Atlas\Hero\Hero_IDLE_1.png
string assetPath = allPath.Substring(allPath.IndexOf(&Assets&));
//按照文件相对路径(如Assets\Atlas\Hero\Hero_IDLE_1.png)载入资源,并赋值为精灵。
Sprite sprite = AssetDatabase.LoadAssetAtPath&Sprite&(assetPath);
//按照精灵名称创建游戏对象。
GameObject go = new GameObject(sprite.name);
go.AddComponent&SpriteRenderer&().sprite =
DirectoryInfo pngDir = pngFile.D//获得PNG图片的文件夹路径(如E:\downloads\unity\TestAdventure\Assets\Atlas\Hero)。
string pngStr = pngDir.ToString().Substring(pngDir.ToString().IndexOf(PNG_DIR) + PNG_DIR.Length);
if (!Directory.Exists(spriteDir + pngStr + &/&))
Directory.CreateDirectory(spriteDir + pngStr + &/&);
allPath = spriteDir + pngStr + &/& + sprite.name + &.prefab&;
string prefabPath = allPath.Substring(allPath.IndexOf(&Assets&));
PrefabUtility.CreatePrefab(prefabPath, go);
GameObject.DestroyImmediate(go);
发现的一个问题是,PNG_DIR = &Atlas&是可以的,但是PNG_DIR = &/Atlas&就会出毛病。。。why?
(36.15 KB, 下载次数: 0)
12:33 上传
[]: buzheteng 在网吧通宵,花了 3
61252/1500排名<font color="#FF昨日变化2主题帖子积分
蛮牛粉丝, 积分 1252, 距离下一级还需 248 积分
蛮牛粉丝, 积分 1252, 距离下一级还需 248 积分
蛮牛币2271
在线时间413 小时
谢谢分享& && && && && && && && && && && && && && &&&
5683/1000排名<font color="#FF昨日变化主题帖子积分
熟悉之中, 积分 683, 距离下一级还需 317 积分
熟悉之中, 积分 683, 距离下一级还需 317 积分
蛮牛币2185
在线时间355 小时
游戏蛮牛给予质量较高、影响力较大的unity相关技术开发者的荣誉称号
连续签到30天
社区QQ达人
使用QQ帐号登录论坛的用户2872人阅读
UISprite sprite = gameObject.GetComponent&UISprite&();
sprite.spriteName = &XXX&;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:499641次
积分:4543
积分:4543
排名:第5104名
原创:76篇
转载:79篇
评论:26条
(2)(1)(1)(1)(1)(1)(1)(1)(3)(3)(1)(7)(6)(3)(4)(14)(12)(1)(1)(5)(4)(7)(2)(12)(12)(11)(4)(12)(17)(1)(1)(1)(1)(1)unity3d更换spriterenderer中sprite的图片_中华文本库
第1页/共1页
unity3d 更换sprite renderer中sprite的图片
所更换图片尺寸与原图片相同
SpriteRenderer spr = gameObject.GetComponent&SpriteRenderer&();
Texture2D texture2d = (Texture2D)Resources.Load("herominired");//更换为红色主题英雄角色图片
Sprite sp = Sprite.Create(texture2d,spr.sprite.textureRect,new Vector2(0.5f,0.5f));//注意居中显示采用0.5f值
spr.sprite =
第1页/共1页
寻找更多 ""温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
我们已经走得太远,以至于忘记了为什么要出发
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1059)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Unity 2D实例开发入门教程',
blogAbstract:'翻译来自:/?p=1422&cpage=1老外写的教程,2d游戏入门相当不错。正在学习中……如果用以前版本的Unity做2D游戏,虽然能做,但是要费很多周折.比如你可以将一张纹理赋予一个”',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:0,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'我们已经走得太远,以至于忘记了为什么要出发',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}关注游戏葡萄
微信扫描二维码关注
游戏葡萄公众号
的其他文章
的其他文章
的其他文章
的其他文章
的其他文章
的其他文章
TalkingData
的其他文章
的其他文章
的其他文章
All Rights Reserved
赞助Sponsor
赞助Sponsor
阅读Articles
数据库Data
数据库Data
招聘Recruitment
联系我们Contact
友情链接Links
游戏葡萄订阅号

我要回帖

更多关于 unity sprite packer 的文章

 

随机推荐