unity中sprite是啥意思
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity中sprite是啥意思相关的知识,希望对你有一定的参考价值。
unity中sprite是图片精灵的意思;图片精灵是用来绘制图集的控件,精灵可以在一张大图中去截取一部分(大图就是整体图像集合(Atlas),而截取的小图就是一个精灵),然后给精灵命名,使用时通过精灵的名称就能直接绘制,并且精灵还可以用来制作动画。
我们用来做sprite 的图片,通常会留有很多空白的地方,我们在画完了sprite之后,这些地方很可能就没有什么作用了。如果想避免这些资源上的浪费,我们可以把各个sprite做成图集,把图片上的空间尽量利用得充实一点。这时候,我们就需要一个制作图集的工具。
首先,Unity默认是在编辑器环境下不打开图集打包工具的,只有在Build的时候才会执行自动打包图集。Edit – Project Setting – Editor.既然这个功能是这样自动化,那为什么一开始是禁用状态,需要我们手动去editor setting里面设置打开呢?
原因是这个功能在unity打开工程的时候会先花一些时间运算图集,如果你需要计算的sprite很多,那么打开就会慢一些。计算好的图集会放在缓存文件夹Project\\Library\\AtlasCache里面,如果把这里的内容删掉,那么unity将会再次运算图集。
没有设置 Packing Tag,那Unity应该不知道怎么去打包图集.所以要把你要打包的图片.设置packingtag放在Resources中的图片,Unity不会打包到图集中。
参考技术A unity中sprite是图片精灵的意思;图片精灵是用来绘制图集的控件,精灵可以在一张大图中去截取一部分(大图就是整体图像集合(Atlas),而截取的小图就是一个精灵),然后给精灵命名,使用时通过精灵的名称就能直接绘制,并且精灵还可以用来制作动画。 参考技术B 回答
你好,很高兴为你解答。Unity 团结一致;联合;统一;完整;完美;和谐;协调;(情节、时间和地点的)统一性,一致性;三一律。Unity是实时3D互动内容创作和运营平台。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助Unity将创意变成现实。Unity平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。希望我的回答对您有帮助。
参考技术C 图片精灵的意思(Flash引擎里也有图片精灵对象),将导入的图片类型设置为Sprite即可拖到场景面板里,带有随屏幕大小自动缩放功能,还可以加Collider进行射线检测,简单实用。本回答被提问者和网友采纳Unity Sprite 切割图集并且获得任一子图(sprite/Texture)
首先,Unity中的Sprite Editor 可以将一张大图切割成多个sprite。然而如果想要从这么多切割好的子sprite获取某一个sprite 要如何操作呢?本篇文章总结了两个方法以获取图集中的某个子图。
一. 切割图集
- 这一步,使用Unity的SpriteEditor切割你的图集,如果不会使用SpriteEditor请参考这篇文章:Unity的2D图集处理,并切割出一张张小图片_0完美对称0的博客-CSDN博客_unity裁剪图片在我们找资源的时候,有时候会遇到那种把一堆图片放进一张png图片里面的情况,在做2D游戏的时候,我们往往需要将里面的一块块小图片切割出来使用,那么问题就来了,怎么切割呢,现在我们提供一张小图片,给大家演示一下:那么我们现在把图片导入到Unity中,选中图片你会看到左边的Inspector界面然后,选择Texture Type类型为Advanced,如下面左图:将Read/Wrihttp://blog.csdn.net/hongyouwei/article/details/45011315
二. 从切割好的图集中获取某一子图
1. 方法一:将切割好的sprite 转成 png 文件,并且存放在一个新建的文件夹中。然后使用一个List 记录这个文件夹中所有png文件的路径,需要返回哪一个图片,就通过AssetDatabase 来获取这一个图片。代码如下:
//将分割好的sprite转换成Texture 并且返回一个texture文件
public static Texture2D GetChildTexture(Texture2D image, int num)
List<string> paths = new List<string>();//存放所有转化的png文件路径
string rootPath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(image));//获取路径名称
string path = rootPath + "/" + image.name + ".PNG";//图片路径名称
//Debug.Log(path);
TextureImporter texImp = AssetImporter.GetAtPath(path) as TextureImporter;//获取图片入口
AssetDatabase.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.height; y++)//Y轴像素
for (int x = (int)metaData.rect.x; x < metaData.rect.x + metaData.rect.width; 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 = newTexture;
var pngData = myimage.EncodeToPNG();
string output_path = rootPath + "/" + image.name + "/" + metaData.name + ".PNG";//子图片输出路径
File.WriteAllBytes(output_path, pngData); //输出子PNG图片
paths.Add(output_path);
// 刷新资源窗口界面
AssetDatabase.Refresh();
Texture2D output_image = AssetDatabase.LoadAssetAtPath<Texture2D>(paths[num]);
Debug.Log(output_image.name);
return output_image;
2. 方法二: 直接获取切割好的sprite图集中的所有子sprite, 返回某一sprite。代码如下:
AssetDatabase.LoadAllAssetsAtPath(): 在编辑器模式下load 资源
Resources.LoadAll<T>() : 加载的资源必须放在Resources文件夹下
AssetBundle 动态加载资源的话,需要先给资源create AssetBundle, 然后再使用相关方法批量Load 资源。
//返回一个子sprite
public static Sprite GetChildSprite(Texture2D image, int num)
string rootPath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(image));//获取路径名称
string path = rootPath + "/" + image.name + ".PNG";//图片路径名称
Object[] sprites = AssetDatabase.LoadAllAssetsAtPath(path);
//Object[] sprites = Resources.LoadAll<Sprite>(path);
Sprite output_sprite = (Sprite)sprites[num];
Debug.Log(output_sprite.name);
return output_sprite;
三. 调用函数
可以扩展编辑器来调用GetChildTexture()的函数,因为这个方法涉及到在编辑器下转化sprite -> Texture。GetChildSprite() 方法会返回一个Sprite,具体情况具体分析。
[MenuItem("Assets/SpriteSlicer/SpriteSlice")]
public static void SpliceSprite()
Texture2D input_image = Selection.activeObject as Texture2D;
Texture2D output_image = GetChildTexture(input_image, 10);
Sprite output_image2 = GetChildSprite(input_image,15);
总结
本文探究了在Unity编辑器模式下如何切割图集,并且获得图集中的某一sprite。动态加载sprite需要使用AssetBundle加载,本文暂时并未实现,持续更新中。
* 使用了 using UnityEditor 的脚本只能发在Editor文件夹下。不然会有报错。
以上是关于unity中sprite是啥意思的主要内容,如果未能解决你的问题,请参考以下文章
unity2d sprite sheet 和 sprite packer 有啥区别?
unity5中怎样实时更换Sprite Renderer中的Sprite