为什么有些长长的unity 图片压缩一放到unity里就变短了呢

Unity5.x 使用GUI Texture 载入图片后显示太大的,使用PixelInsert也无法修正的原因 - 博客频道 - CSDN.NET
narutojzm1的博客
分类:游戏编程
Unity5.x&使用GUI&Texture&载入图片后显示太大的,使用PixelInsert也无法修正的原因
目的:使用GUITexture载入一个图片到游戏界面上.
首先,在Unity5.x上,已经无法直接在GameObject菜单栏中找到GameObject-&CreateOther-&GUITexture这么一个现成的UI对象。
需要先CreateEmpty,然后点击Component-&Rendering-&GUI&Texture,这样的方式来创建。
然后,我创建后发现了这么一个问题:
我的图像本来大小是128*128
载入后,如下图:
就变成了这么大,然后我就开始检查GUITexture的组件属性:
,我一看Pixel&Insert里边也没有错啊。没错位置是0,0;大小是:128,128。
然后我注意到了下面这个Transform基本属性:
经过研究,问题就出在Scale上。
首先,至少Transform在对象作为一个GUI时的含义,是与普通的物件有区别的。于是我就将Scale全改为了0,效果如下:
现在就是正儿八经的128*128像素了,pixelInsert的w和h就正确地起作用了。为什么Scale必须是0?
我分析是因为Scale一旦不为0,那么当前这个对象就会进行缩放,缩放之后自然w和h就显得不准了。
然后,Transform的Position的含义也有所改变,不再是用的三维世界的度量单位米,而是变成了比例。比如x=0.5,y=0.5,就意味着,把GUITexture放在屏幕中间喽。
当然,你如果把postion设置为0,0,0,单纯用pixelInsert的x/y去调整GUITexture的位置也可以,比如左上角的GUITexture我可以设置x/y为(10,&200),如下图
缺点的就是,如果整个游戏界面的大小变化了,那么你的GUITexture还会在从左上角向上160像素的位置,也就不一定是最上方那个位置了,这样界面就乱套了。
也就是我,我认为,在对象为GUITexture时Transform.position相当于C#/java中的锚点。
如果我想把图片放在左上角,我会这样设置:
这样,不管界面大小怎么变,我的图片永远都在最上方向下130个像素的地方。
所以,通过position皆可以灵活的设置图片大致方位,然后通过pixelinsert的x/y设置微调位置,通过pixelinsert的w/h设置图片像素大小。就都刚刚好。
补充说明一点,上述关于Scale设置为0的方法是有理论依据的,请看链接/Components/class-GuiTexture.html
To use it effectively, you need to set the scale of the GUI Texture's Transform to (0, 0, 0). Now, the Pixel Inset is in full control of the texture's size and you can set the Pixel Inset values to be the exact pixel size of your Texture.
为了有效地使用它(PixelInsert),你需要设定GUI纹理变换属性(Transform)里的大小(scale)设置为(0,0,0)。现在,像素嵌入是完全控制纹理的大小,你可以设置你的像素嵌入值为你的纹理确切的像素大小。
narutojzm1
排名:千里之外
(3)(6)(4)(7)(49)(14)(4)unity(7)
& & & & NGUI应该算是unity中用的最多的组件。Uisprite是一个好同志,辛勤的帮助游戏引擎提高渲染效率。但我不太理解,为毛Uisprite的transform组件的localSize是需要设置成图片原本的大小才能正常的显示出来,为什么不是让localsize = new vector3(1,1,1)就好了呢?
& & & &这样也带来一个问题,游戏中一个带有sprite的gameobject在切换成到其他的sprite的时候,还会保持原来的sprite的transform属性不变,这样有些图片就可能在切换的过程中变得比例失调。比如看下面的两张图,我们游戏中的主角换了个动作之后,就因为图片的大小不一致而发生了拉伸。
& & & &于是,每次切换都要重新设置sprite的localSize。那从哪里可以知道sprite的大小呢,其实在sprite组件里面是没有相关的属性的,这个属性藏在sprite对应的altas中。于是,我就写了下面一段代码。专门用于切换sprite时的大小调整。代码也挺简单,应该很容易懂。
using UnityE
using System.C
public class SpriteHelper : MonoBehaviour
//调整uisprite
public static void adjustScale(UISprite uiSprite)
//依据spritename找到uiatlas中的sprite
UIAtlas.Sprite sprite = uiSprite.atlas.GetSprite(uiSprite.spriteName);
uiSprite.transform.localScale = new Vector3(sprite.outer.width, sprite.outer.height, 0);
//调整uitexture
public static void adjustScale(UITexture uiTexture)
Texture texture = uiTexture.mainT
uiTexture.transform.localScale = new Vector3(texture.width, texture.height, 0);
& & & &好啦,现在完美解决了
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8778次
排名:千里之外
原创:13篇
(2)(4)(1)(1)(5)求救,为什么我高质量的贴图显示出来的像素却极低!_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:57,293贴子:
求救,为什么我高质量的贴图显示出来的像素却极低!收藏
用的的是2d相机,不知道为什么~
火星时代unity3d,争当游戏大触,月薪过万小意思,手绘技能,概念设计,商业应用一步到位,你与u3d游戏特效设计师只差一步,赶快点击吧!
贴图属性,maxSize
4楼正解,修改一下图片的maxsize
修改图片,在u3d里面。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或如何显示图片的一部分?
如图:726 || this.offsetHeight>700){if(this.offsetWidth/726 > this.offsetHeight/700){this.width=726;}else{this.height=700;}}" style="max-width:726max-height:700" title="点击查看原图" onclick="if(this.parentNode.tagName!='A') window.open('/forum/attachment/Mon_0_59d7d8fcfa69971.png');" />这是一张由N个图标组合成的一个纹理图,我想在屏幕上显示其中某个图标(比如第二行第三个),请问该怎么实现?最好说的详细一些,谢谢!
要评论请先&或者&
你可以用类似2dtooltik这样的第三方的插件来实现,也可以用unity自带的GetPixels SetPixels做
NGUI也可以做 & 不过要手动的将小图块的坐标位置自己打出来-,- 因为你这个不是用TexturePacker弄的
可以使用Material类中的:mainTextureOffset()方法和mainTextureScale()方法共同来完成.mainTextureOffset()方法是用来设置偏移的;mainTextureScale()方法是用来设置放缩的.具体用法可以参考: 和
& 学习了。不错。
是直接显示为UI吧?public Texture2D BigM
private int bm_X = 2;
private int bm_Y = 2;
private int bm_width = 10;
private int bm_height = 10;
// Use this for initialization
void Start () {
SetPixel();
void OnGUI(){
GUI.DrawTexture(new Rect(100,100,500,500),BigMap);
void SetPixel(){
Color[] color = BigMap.GetPixels(bm_X,bm_Y,bm_width,bm_height);
BigMap.SetPixels(bm_X,bm_Y,bm_width,bm_height,color);
BigMap.Apply();
}试试看行不行 我没运行过 吃饭去了
同意4楼的答案
:你可以用类似2dtooltik这样的第三方的插件来实现,也可以用unity自带的GetPixels SetPixels做 ( 11:04) 总感觉Unity自带的GetPixels和SetPixels效率很低,你有2DToolkit的插件包么,有的话给我发一个呗。邮箱:,谢谢!
:NGUI也可以做
不过要手动的将小图块的坐标位置自己打出来-,- 因为你这个不是用TexturePacker弄的 ( 11:25) 我知道NGUI自带一个Atlas制作器,应该和TexturePacker的制作原理是一样的吧。TexturePacker弄的和这张图有什么不一样么?

我要回帖

更多关于 unity3d 图片压缩格式 的文章

 

随机推荐