复制一个纹理为SpriteAtlas的Sprite的纹理,大小和原始相同

复制一个纹理为SpriteAtlas的Sprite的纹理,大小和原始相同

之前没做过关于texture的东西。

在打包的资源中有一个预设所有的图是打包在一起的。很多Sprite组成的图形。

在游戏加载后,需要对一些图层做处理,这时候需要处理贴图,但是又不想动原始的图。
复制Sprite里的贴图遇到很多问题。

Sprite.rect 大小可能比 Sprite.textureRect大得多,有时又有textureRectOffset,开始new的图形只是textureRect,发现比原始图像小,圆心在中心位置,所以出现了错位。

又想改坐标,但是发现别的地方有问题,最好不要动位置。

还是复制一个一模一样大小的纹理好一些。

很多问题找了文档,也没看懂

关于Sprite.textureRect的
https://docs.unity3d.com/ScriptReference/Sprite-textureRect.html

Sprite.textureRect
Leave feedback
public Rect textureRect;
Description
Get the rectangle this sprite uses on its texture. Raises an exception if this sprite is tightly packed in an atlas.

关于textureRectOffset的
https://docs.unity3d.com/ScriptReference/Sprite-textureRectOffset.html

Sprite.textureRectOffset
Leave feedback
public Vector2 textureRectOffset;
Description
Gets the offset of the rectangle this sprite uses on its texture to the original sprite bounds. If sprite mesh type is FullRect, offset is zero.

关于SetPixels的
https://docs.unity3d.com/ScriptReference/Texture2D.SetPixels.html

public void SetPixels(int x, int y, int blockWidth, int blockHeight, Color[] colors, int miplevel = 0);
Description
Set a block of pixel colors.

This function is an extended version of SetPixels above; it does not
modify the whole mip level but modifies only blockWidth by blockHeight
region starting at x,y. The colors array must be
blockWidth*blockHeight size, and the modified block must fit into the
used mip level.

这能看懂?反正我没看懂!! 也没搜到相关问题~~

自己研究丰衣足食吧~

贴上来做一个记录。

//复制一个纹理为SpriteAtlas的Sprite的纹理,大小和原始相同。
    static Color ConstClearColor = Color.clear;
    /// <summary>
    /// 
    /// </summary>
    /// <param name="sp">sp是当前的Sprite</param>
    /// <returns></returns>
    public static Texture2D CopyTextureFrom(Sprite sp)
    {
        //这里是rect的大小,可能比textureRect的大小更大一些.
        Texture2D texture = new Texture2D((int)sp.rect.width, (int)sp.rect.height);
        
        //这里是因为texture默认不是透明的,灰色的,这里给他一个透明填充。
        //有其他更加效率高的写法再替换掉.
        Color[] xxx = new Color[texture.width* texture.height];
        for (int i = 0; i < xxx.Length; i++)
        {
            xxx[i] = ConstClearColor;
        }
        texture.SetPixels(xxx);

        //这里是获取到对应在Atlas里的纹理.
        Color[] pixelBuffer = sp.texture.GetPixels((int)sp.textureRect.x, (int)sp.textureRect.y, (int)sp.textureRect.width, (int)sp.textureRect.height);

        //这个blockWidth和Height的用法是自己猜的,没找到相关的帖子,官网文档写的也含糊不是很懂.
        //自己猜测就是在这个位置填充这个大小的纹理
        texture.SetPixels((int)sp.textureRectOffset.x, (int)sp.textureRectOffset.y, (int)sp.textureRect.width, (int)sp.textureRect.height, pixelBuffer, 0);
        texture.Apply();

        return texture;
    }

调用:

nowSpriteRenderer1 = nowTrans1.GetComponent<SpriteRenderer>();
        Sprite sp = nowSpriteRenderer1.sprite;// NowSpriteAtlas.GetSprite(nowTrans1.name);
        Texture2D txt = CDrawTexture.CopyTextureFrom(sp);
        sp = Sprite.Create(txt, new Rect(0,0,txt.width,txt.height), new Vector2(0.5f, 0.5f)); //
        nowSpriteRenderer1.sprite = sp;

有纰漏欢迎留言

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值