当使用图集 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;
}
}