unity 图片放大缩小放不了图片

Unity之路&(十四)-解决Atlas图集混乱
一、使用NGUI制作图集,步骤如下:
1. 在Unity菜单中,选择 NGUI -& Open the Atlas
Maker,出现如下页面后,在“Create按钮”右侧编辑框中填写要创建的图集名称“A”
2.编辑好后,点击“Create按钮”,此时“Select下拉按钮”右侧会自动显示你创建好的图集名称“A”,若没有自动显示,则点击“Select下拉按钮”选中步骤2创建好的图集“A”
3.将图片集成放入图集“A”中:
在Project视图中,将要加入到Atlas中的图片选中(若该图片不在Atlas中,需首先将该图片拖入Project试图中),此时你会看到以下选中框中多了一个条目“icon_144”,(若“icon_144”已存在,则Add将会是Update)
4.点击“Add/Update All”按钮,成功将“icon_144”添加至图集中
二、当向图集中增加图片时,有时会出现图集混乱,如何解决?
这是由于添加图片时如下框中的设置和图集之前的设置不同,所以才会导致混乱。
解决方案:
1. 如果不记得之前是如何设置的,那就将Padding,Trim Alpha,PMA Shader,Unity
Packer等选项全部勾掉(变为未选则状态)。
貌似主要PMA Shader与 Unity Packer在起作用
2. 点击“Add/Update All”按钮。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。 项目开发笔记 (七)
很多APP中都会有个人信息,或者个人帐号 都会有设置头像功能,国内的很多APP更加是如此(很多人的帐号密码泄密,正是由于到处注册帐号,举个我当年密码泄漏的例子,在很多年的某一天 我在某个网吧的嘟嘟牛系统注册了一个帐号,当时毫无安全意识,直接用个人密码作为嘟嘟牛的密码,很多年后的今天 我在嘟嘟牛的用户数据库里找到了我当年的个人所有信息…嘟嘟牛的数据库怎么会流出来?A.黑客把嘟嘟牛黑掉,把数据库拿到地下交易市场卖,B.嘟嘟牛的某个数据库程序员离职 顺带把数据库带出来,C.公司倒闭,倒卖数据榨干最后一点价值等等..),言归正传,目前我在参与一个类APP项目的优化工作.使用Unity开发.也有这种..设置用户头像的需求
Unity Version: 5.x or 4.x
本文内容非纯干货,如果不想看可以直接下载Sample –
难点主要在几个地方:
Unity与iOS/Android原生代码之间的调用
iOS/Android 对摄像机的调用与图片截取
iOS/Android 对图片的IO操作
Unity与iOS/Android原生代码之间的调用
Unity对原生的调用支持相对还是很好的.也非常简单.
对于Android
主要的方法是通过获取主Activity对象,然后调用主Activity中的pubilc信息,举个栗子
AndroidJavaClass androidActivityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
m_NativeObj = androidActivityClass.GetStatic("currentActivity");
m_NativeObj.Call(
"SettingAvaterFormMobile",
// Java函数名
strObjectName,
// 传入的参数
strFuncName,
// 传入的参数
strFileName);
// 传入的参数
上面即调用主Activity上的SettingAvaterFormMobile函数.
Android原生代码要给Unity调用 还需要配置一些基本内容:
1.在Android项目的生成文件夹bin下命令行生成Jar包
在确认Android项目代码无误的情况下,到项目目录bin\classes下,打开命令行定位到这里,然后使用命令生成jar文件
jar -cvf xxx.jar * // xxx为文件名 可随意设置
2.Android项目需要取得原生jar包放到Unity项目文件夹Assets\Plugins\Android\bin目录(没有就自行创建) ,再取 AndroidManifest.xml,res文件夹 ,放到 Assets\Plugins\Android文件夹下.如图:
3.对于Android项目源码包的获取,Unity4.x 和 5.x方法不一样,如果是Unity5 需要把项目目录bin\classes下编译的R.java生成文件删掉.
由于iOS开发可以OC与C/C++之间无缝调用,所以其实调用iOS原生函数 是通过调用C/C++函数中转的.方法非常简单.在C#脚本端声明一个C++函数,即可直接调用:
//-------------------------------------------------------------------------
[DllImport("__Internal")]
private static extern
void SettingAvaterFormiOS(string strObjectName, string strFuncName, string strFileName);
//-------------------------------------------------------------------------
#elif UNITY_IPHONE
SettingAvaterFormiOS(strObjectName, strFuncName, strFileName);
//-------------------------------------------------------------------------
若需要调用一个Android项目的NDK开发的C++函数,原理也是一样的.
iOS原生代码要给Unity调用 还需要配置一些基本内容:
把自行编写的iOS代码复制到Unity项目文件夹文件夹Assets\Plugins\IOS\下(没有就自行创建),如图
iOS/Android 对摄像机的调用与图片截取
对于Andorid
Android打开照相机和打开相册选取照片非常简单,网上代码一吨:
// 打开摄像机获取图片
if(v.getId() == m_OpenCameraID)
eResult = CommonUtil.ENUM_RESULT.eResult_C
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(
MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File(Environment.getExternalStorageDirectory(), m_ImageFileName)));
m_contextAct.startActivityForResult(intent, eResult.ordinal());
// 打开相册选取图片
else if(v.getId() == m_GetPictureID)
eResult = CommonUtil.ENUM_RESULT.eResult_P
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);
m_contextAct.startActivityForResult(intent, eResult.ordinal());
iOS打开照相机和打开相册选取照片非常简单,网上代码也一吨:
//-------------------------------------------------------------------------
// 关键实现
- (void)showPicker:(UIImagePickerControllerSourceType)type
UIImagePickerController *picker = [[[UIImagePickerController alloc] init] autorelease];
picker.delegate =
picker.sourceType =
// 打开摄像机或者打开相册
picker.allowsEditing = YES;// 图片是否可编辑
if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
Class popoverClass = NSClassFromString( @"UIPopoverController" );
if( !popoverClass )
_popoverViewController = [[popoverClass alloc] initWithContentViewController:picker];
[_popoverViewController setDelegate:self];
[_popoverViewController presentPopoverFromRect:CGRectMake( 0, 0, 128, 128 )
inView:UnityGetGLViewController().view
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
UIViewController *vc = UnityGetGLViewController();
[vc presentModalViewController:picker animated:YES];
//-------------------------------------------------------------------------
iOS/Android 对图片的IO操作
获取的图片文件,可大可小,我们不能直接传string回Unity,所以可以事先保存到本地目录下.最佳的目录是Application.persistentDataPath.
对于Android
这个目录就是:"/mnt/sdcard/Android/data/" + packageID + "/files".(packageID为APP包名)保存图片文件代码片段:
FileOutputStream fOut =
String strPackgeName = getApplicationInfo().packageN
String path = "/mnt/sdcard/Android/data/" + strPackgeName + "/files";
File destDir = new File(path);
if (!destDir.exists())
destDir.mkdirs();
fOut = new FileOutputStream(path + "/" + m_ImageFileName) ;
catch (FileNotFoundException e)
e.printStackTrace();
photo.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
catch (IOException e)
e.printStackTrace();
fOut.close();
catch (IOException e)
e.printStackTrace();
这个目录就是:Application/packageID/Documents.(packageID为APP包名)
NSString * DocumentsPath =
[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSFileManager *fileManager =
[NSFileManager defaultManager];
[fileManager createDirectoryAtPath:DocumentsPath
withIntermediateDirectories:YES
attributes:nil
error:nil];
[fileManager createFileAtPath:[DocumentsPath stringByAppendingString:m_pstrFileName]
contents:imgData attributes:nil];
如此获取的图片就保存到了指定的目录中.这个时候只要告诉回调到Unity通知一下 即可.
设置了用户头像,一般都会有上传头像到服务器的功能,关于C#上传图片到服务器网上也也有一吨的版本,但是Unity官方文档中的是如下:
//-------------------------------------------------------------------------
IEnumerator __UploadPNG()
var bytes = m_texture2D.EncodeToPNG();
var form = new WWWForm();
form.AddField("frameCount", Time.frameCount.ToString());
form.AddBinaryData("avatarPicture", bytes, "avatar.png", "image/png");
// m_ImageUpDownURL URL上传接口
var w = new WWW(m_ImageUpDownURL, form);
if (!string.IsNullOrEmpty(w.error))
Debug.Log(w.error);
Debug.Log("Finished Uploading Image");
//-------------------------------------------------------------------------关于unity图片大小问题的论证 - 简书
关于unity图片大小问题的论证
图片大小对比图:
对比图片.png
x512,160x120都可以压缩
勾选mipmaps不可压缩
勾选mipmap
PS压缩后显示无明显变化,内存占用没有差异
2.Android:
x512,160x120有透明通道[RGBA32]都可以压缩
160x120[RGB24]无透明通道不可以压缩
无透明通道
PS压缩后显示边缘有轻微模糊,不影响使用,内存占用没有差异
512x512可以压缩
160x120有无透明通道都不可以压缩
不可以压缩
PS压缩后显示边缘有轻微模糊,不影响使用,内存占用没有差异
1.PS压缩无明显差异,建议用.
2.建议使用图片都用幂次方正方形[512x512],目前需要的平台下都可以压缩.
3.4的倍数如160x120如果有透明通道在安卓下可以压缩,
4.mipmap使用需要幂次方正方形[512x512]
5.ios平台只支持幂次方正方形压缩,
背景和目的 本文的背景是《独立防线》(Killer)项目已进行到了一定阶段。虽然之前定下了UI制作规范,但中途也更新了规范,但程序和美术没有具体面对面沟通,也没有阐述规范的原因和落地方法。所以,本文目的是为UI美术同事介绍:1、手游性能相关的标准是什么;2、具体制作时需要注...
背景和目的 本文的背景是《独立防线》(Killer)项目已进行到了一定阶段。虽然之前定下了UI制作规范,但中途也更新了规范,但程序和美术没有具体面对面沟通,也没有阐述规范的原因和落地方法。 所以,本文目的是为UI美术同事介绍:1、手游性能相关的标准是什么;2、具体制作时需要...
如何制作透明背景的图片? 首先,只有GIF才可以使用透明,所以在保存文件的时候不要选择保存或另存为,而是直接选“输出GIF”然后,选择透明色,如果你需要透明的部分都是白色就选白色,依次类推做图片时把背景图片隐藏调然后再Save for Web就可以透明了。 在GIF图上写上...
最近在做Unity的内存优化,代码几乎没有可以优化的地方了,那么只有从图片素材进行。 看出来区别了吧!无论怎么比较,就是 2次方的正方形最优! 在项目中,尽可能是使用ETC1和PVRTV4等GPU直接支持的图片格式,不仅内存占用低、性能也更好;当出现质量不及格时,再逐步的提...
Unity3D引擎对纹理的处理:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式。在Texture2D的设置选项中,你可以针对不同的平台,设置不同的压缩格式,如IOS设置成PVRTC4,Android平台设置成RGBA16等...
走过迷人深秋,来到微冷的初冬。阳光以成为久违的奢侈品。 我们还是一样每天走着,不能停留,一路向前。有人说:“向前一步便是成功”,我又有什么理由不前行呢。每一天都有其忙不完的事。学习、工作、感情,我们都不能放下,是一生的追求。寻寻觅觅,我已走过二十来个春秋,寒暑交替已成为习惯...
日常生活中经常进行各种各样的户外运动,在户外因为环境多变,经常会遇到迷路。这是很难避免出现的情况。迷途后,最迫切需要的是一颗冷静的平常心。可千万别慌张,大自然有很多天然的指南针,会帮助你辨别方向。 —— 漫游家,心随自然 登高望远。 发现迷失方向后,先登高望远,俗话说的好:...
翻开古今中外的社会发展历史,无不是不同的思想与潮流进行了激烈碰撞、决斗的历史,在决斗的过程中,谁掌握了决斗的主动权谁就拥有了话语权。
在风平浪静时大家谈笑风生,但在决定国家,民族,个人的荣誉,命运,感情的面前,决斗就不可避免的发生,剑舞脖颈,枪指头脑,拦腰摔下,...
生来娇小 脆弱的嫩芽 倔强的生长 在满园奇芳中 小心翼翼的开着 只恐惊扰了他人 终究长成了 一颗悲戚的心 日日夜夜 反复思量 顾影自怜 然举步维艰 却不可停步 用尽了一生的芳华去追寻 用尽了一世的时光去觅得 兜兜转转 终于长成了今天的样子 骄傲的熠熠生辉的模样 这样的自己 真美
幼儿园四年、小学六年、初中三年、高中三年,到现在我的大学过去了快一年,能真真切切感受到的,就是肉体在一天天成长,年龄在一天天变大! 那些奋笔疾书、悬梁刺股从来就没有出现过我的生活,或者说大多数人的生活。15被浏览7,544分享邀请回答0添加评论分享收藏感谢收起41 条评论分享收藏感谢收起写回答随笔 - 13&
文章 - 0&评论 - 2&trackbacks - 0
假设有一张png/tga图集,导入到Unity,放置目录"Assets/Resources/UI"(UI文件夹可替换成其他的,重要的是要在"Assets/Resources/"路径下),默认为如下设置:
为了可以使用Unity自带的精灵切割,要将纹理类型改成"Sprite","Sprite Mode"改成"Multiple","Format"改成"Truecolor",点击"Apply"按钮进行应用。
接着,点击"Sprite Editor"打开精灵编辑器,点击左上角的"Slice"按钮,弹出切片设置,再次点击里面的"Slice"按钮,就会自动对图片进行切割,如下图所示:
在对切割不完整的地方进行修正后,点击右上角的"Apply"按钮,进行保存。可以看到Project视图下这个图集,已经被分割出许多小图了,如下图所示:
接下来,因为要对图片进行读写操作,要更改图片的属性才能进行,否则会提示如下:
UnityException: Texture 'testUI' is not readable, the texture memory can not be accessed from scripts. You can make the texture readable in the Texture Import Settings.
将图片纹理类型更改为"Advanced",将"Read/Write Enabled"属性进行打勾,如下图所示:
创建一个脚本文件,代码如下:
using UnityE
using UnityE
public class TestSaveSprite
[MenuItem("Tools/导出精灵")]
static void SaveSprite()
string resourcesPath = "Assets/Resources/";
foreach (Object obj in Selection.objects)
string selectionPath = AssetDatabase.GetAssetPath(obj);
// 必须最上级是"Assets/Resources/"
if (selectionPath.StartsWith(resourcesPath))
string selectionExt = System.IO.Path.GetExtension(selectionPath);
if (selectionExt.Length == 0)
// 从路径"Assets/Resources/UI/testUI.png"得到路径"UI/testUI"
string loadPath = selectionPath.Remove(selectionPath.Length - selectionExt.Length);
loadPath = loadPath.Substring(resourcesPath.Length);
// 加载此文件下的所有资源
Sprite[] sprites = Resources.LoadAll&Sprite&(loadPath);
if (sprites.Length & 0)
// 创建导出文件夹
string outPath = Application.dataPath + "/outSprite/" + loadP
System.IO.Directory.CreateDirectory(outPath);
foreach (Sprite sprite in sprites)
// 创建单独的纹理
Texture2D tex = new Texture2D((int)sprite.rect.width, (int)sprite.rect.height, sprite.texture.format, false);
tex.SetPixels(sprite.texture.GetPixels((int)sprite.rect.xMin, (int)sprite.rect.yMin,
(int)sprite.rect.width, (int)sprite.rect.height));
tex.Apply();
// 写入成PNG文件
System.IO.File.WriteAllBytes(outPath + "/" + sprite.name + ".png", tex.EncodeToPNG());
Debug.Log("SaveSprite to " + outPath);
Debug.Log("SaveSprite Finished");
在Unity编辑器将会看到Tools菜单下多了"导出精灵"项,选中图集,然后点击"导出精灵"菜单项,即可导出子图成功。如下图所示:
阅读(...) 评论()}

我要回帖

更多关于 unity 控制物体缩放 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信