使用图集SpriteAtlas时,根据其中的Sprite,给 RawImage 设置 texture 的两种方法

当使用图集 SpriteAtlas 时, 从中获取的 Sprite 的 texture 是图集中整张图片,为了给 RawImage 设置 Texture,有两种方式:

方式1:使用以下扩展函数,其原理是给 RawImage 设置整张纹理,然后设置 uvRect 使之只显示 Sprite 对应部分。这种方式的优点是,SpriteAtlas 不需要设置 read/write,从而不额外增加内存消耗

        /// <summary>
        /// 对RawImage组件,通过Sprite来设置其Texture (支持sprite是从图集中来的方式)
        /// </summary>
        public static void SetTextureBySprite(this RawImage rawImage, Sprite sprite)
        {
            rawImage.texture = sprite.texture; //这个texture是整个图集上的一大张Texture
            float w = sprite.texture.width;
            float h = sprite.texture.height;
            rawImage.uvRect = new Rect(sprite.textureRect.x / w, sprite.textureRect.y / h, sprite.textureRect.width / w, sprite.textureRect.height / h);
        }

方式2:新建一个Texture,从精灵中使用 GetPixels 的方式获取对应区域上的图像。这种方式需要图集设置 read/write,因此比较消耗内存

        /// <summary>
        /// 从精灵创建相应的纹理, 如果是单纹理的直接取,如果是图集的,则要求图集设置 Read/Write Enabled,并且精灵设置为 Full Rect 而不能是Tight
        /// </summary>
        public static Texture2D CreateTextureBySprite(Sprite sprite)
        {

            if ((int)(sprite.rect.width) != sprite.texture.width)
            {
                //图集, 要求图集设置 Read/Write Enabled (尽量不要用 Texture,全部使用 Sprite,否则打开 Read/Write 后双倍内存),并且精灵设置为 Full Rect 而不能是Tight
                if ((int)sprite.rect.width != (int)sprite.textureRect.width || (int)sprite.rect.height != (int)sprite.textureRect.height)
                {
                    Debug.LogErrorFormat("CreateTextureBySprite: sprite [{0}] must be FULL RECT,请在精灵属性设置,不能是Tight,否则宽度高度不对! \r\n sprite.rect: width={1}, height={2}; textureRect: x={3}, y={4}, width={5}, height={6}",
                         sprite.name, (int)sprite.rect.width, (int)sprite.rect.height,
                         (int)sprite.textureRect.x,
                         (int)sprite.textureRect.y,
                         (int)sprite.textureRect.width,
                         (int)sprite.textureRect.height);
                }
                Texture2D newText = new Texture2D((int)sprite.rect.width, (int)sprite.rect.height);
                Color[] newColors = sprite.texture.GetPixels((int)sprite.textureRect.x,
                                                             (int)sprite.textureRect.y,
                                                             (int)sprite.textureRect.width,
                                                             (int)sprite.textureRect.height);

                newText.SetPixels(newColors);
                newText.Apply();
                return newText;
            }
            else
            {
                return sprite.texture;
            }
        }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值