当使用图集 SpriteAtlas 时, 从中获取的 Sprite 的 texture 是图集中整张图片,为了给 RawImage 设置 Texture,有两种方式:
方式1:使用以下扩展函数,其原理是给 RawImage 设置整张纹理,然后设置 uvRect 使之只显示 Sprite 对应部分。这种方式的优点是,SpriteAtlas 不需要设置 read/write,从而不额外增加内存消耗
/// <summary>/// 对RawImage组件,通过Sprite来设置其Texture (支持sprite是从图集中来的方式)/// </summary>/// <param name="rawImage"></param>/// <param name="sprite"></param>public static void SetTextureBySprite(this RawImage rawImage, Sprite sprite){rawImage.texture = sprite.texture; //这个texture是整个图集上的一大张TexturerawImage.uvRect = sprite.textureRect;}
方式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 而不能是Tightif ((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;}}