复制一个纹理为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;
有纰漏欢迎留言