美文网首页
使用Sprite动态赋值贴图

使用Sprite动态赋值贴图

作者: 神图 | 来源:发表于2021-09-17 18:41 被阅读0次

    自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动态赋值贴图

          本文链接:https://www.haomeiwen.com/subject/mjqinftx.html