自Unity2017之后,Unity中的贴图格式已经没有Texture类型,而Sprite底层亦提供了texture属性访问,如果所加载的贴图资源并未打成图集,或者图集中仅有1张图片资源,则可以直接使用sprite.texture为材质球赋值
如果加载的Sprite是多张图片打成的图集,并且图集支持Read and Write Enabled,则可以通过动态创建Texture2D对象,并读取对应范围的像素的方式来实现从图集中取单个图片的操作,代码如下:
public static Texture2D Sprite2Texture(Sprite sp) {
Texture2D tex = null;
if (sp.rect.width != sp.texture.width) {
tex = new Texture2D((int)sp.rect.width, (int)sp.rect.height);
var colors = sp.texture.GetPixels ( (int)sp.textureRect.x, (int)sp.textureRect.y,
(int)sp.textureRect.width, (int)sp.textureRect.height);
tex.SetPixels(colors);
tex.Apply();
}
else {
tex = sp.texture;
}
return tex;
}
不过由于开启Read and Write Enabled需要占用多一倍的内存,所以一般图集都会关闭该选项,此时可以将整张图集贴图赋给材质,并调整贴图的缩放值和偏移量来实现显示指定贴图的目标,代码如下:
public static void SetTexture(Material mat, string propName, Sprite sp) {
float tillX = sp.rect.width / sp.texture.width;
float tillY = sp.rect.height / sp.texture.height;
Vector4 padding = UnityEngine.Sprites.DataUtility.GetPadding(sp);
float offsetX = (sp.textureRect.x - padding.x) / sp.texture.width;
float offsetY = (sp.textureRect.y - padding.y) / sp.texture.height;
int id = Shader.PropertyToID(propName);
mat.SetTexture(propName, sp.texture);
mat.SetTextureOffset(id, new Vector2(offsetX, offsetY));
mat.SetTextureScale(id, new Vector2(tillX, tillY));
}
网友评论