使用Sprite动态赋值贴图

自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));
}

你可能感兴趣的:(使用Sprite动态赋值贴图)