Unity中如何从Sprite Atlas获取单个Sprite的独立Texture2D?
如何从Sprite Atlas中获取对应Sprite的原始独立Texture2D?
我将多个带有独立Texture2D文件的Sprite(blue、green、red)打包进了Sprite Atlas,但通过以下代码获取到的是整张贴图集的Texture2D,而非blue对应的原始独立Texture2D:
Sprite blueSprite = Resources.Load<Sprite>("blue"); Texture2D blueTexture = blueSprite.texture; // 返回的是包含所有Sprite的图集纹理
解决方法:
直接加载原始Texture2D
如果原始的blue Texture2D文件仍保留在项目中(且未被设置为仅用于图集打包、仍可被Resources/Addressables访问),可以直接加载该Texture2D,无需通过Sprite:Texture2D blueOriginalTexture = Resources.Load<Texture2D>("blue");注意:若Sprite Atlas设置中启用了Remove Unused Sprite Assets,或构建项目时原始资源被剥离,此方法可能失效。
从图集纹理中裁剪生成独立Texture2D
若原始Texture2D无法直接访问,可从Sprite对应的图集纹理区域裁剪出对应内容,生成新的Texture2D:Sprite blueSprite = Resources.Load<Sprite>("blue"); Texture2D atlasTexture = blueSprite.texture; // 创建与Sprite尺寸一致的新纹理 Texture2D croppedTexture = new Texture2D((int)blueSprite.rect.width, (int)blueSprite.rect.height, atlasTexture.format, false); croppedTexture.wrapMode = TextureWrapMode.Clamp; // 使用RenderTexture裁剪对应区域 RenderTexture tempRT = RenderTexture.GetTemporary(croppedTexture.width, croppedTexture.height); Vector2 scale = new Vector2(blueSprite.rect.width / atlasTexture.width, blueSprite.rect.height / atlasTexture.height); Vector2 offset = new Vector2(blueSprite.rect.x / atlasTexture.width, blueSprite.rect.y / atlasTexture.height); Graphics.Blit(atlasTexture, tempRT, scale, offset); // 读取像素并应用 RenderTexture.active = tempRT; croppedTexture.ReadPixels(new Rect(0, 0, tempRT.width, tempRT.height), 0, 0); croppedTexture.Apply(); // 释放临时资源 RenderTexture.ReleaseTemporary(tempRT); RenderTexture.active = null; // croppedTexture即为对应blue的独立纹理
注意:本问题与查找Sprite Atlas中的Sprite不同,核心需求是获取原始独立Texture2D而非Sprite对象。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

