C# 改变精灵纹理像素会产生巨大的灰色方块
我有一个32x32的精灵,我试图访问和修改的像素数据 要做到这一点,我只需获取精灵的纹理,基于旧纹理创建新纹理,然后更改新纹理的像素值。然后,我用修改后的纹理创建一个新的精灵,并将SpriteRenderer的sprite参数更改为新精灵 然而,当我实际运行我的脚本时,我得到的是一个巨大的灰色正方形,很容易是原来32x32精灵的10倍大小。我对unity很陌生,所以我不知道为什么会发生这种情况。任何洞察都会很好C# 改变精灵纹理像素会产生巨大的灰色方块,c#,unity3d,C#,Unity3d,我有一个32x32的精灵,我试图访问和修改的像素数据 要做到这一点,我只需获取精灵的纹理,基于旧纹理创建新纹理,然后更改新纹理的像素值。然后,我用修改后的纹理创建一个新的精灵,并将SpriteRenderer的sprite参数更改为新精灵 然而,当我实际运行我的脚本时,我得到的是一个巨大的灰色正方形,很容易是原来32x32精灵的10倍大小。我对unity很陌生,所以我不知道为什么会发生这种情况。任何洞察都会很好 private Sprite sprite; private Tex
private Sprite sprite;
private Texture2D texture;
// Use this for initialization
void Start ()
{
sprite = this.gameObject.GetComponent<SpriteRenderer>().sprite;
texture = sprite.texture;
Texture2D newTexture = modifyTexture(texture);
SpriteRenderer sr = this.gameObject.GetComponent<SpriteRenderer>();
sr.sprite = Sprite.Create(newTexture, new Rect(0, 0, newTexture.width, newTexture.height), new Vector2(0, 0), 10);
}
public Texture2D modifyTexture(Texture2D baseTexture)
{
Texture2D newTexture = new Texture2D(baseTexture.width, baseTexture.height);
int x = 0;
while(x < newTexture.width)
{
int y = 0;
while(y < newTexture.height)
{
Color currentPixel = baseTexture.GetPixel(x,y);
Color modifiedPixel = currentPixel;
modifiedPixel.r = (float)(modifiedPixel.r + 0.10);
modifiedPixel.b = (float)(modifiedPixel.b + 0.10);
modifiedPixel.g = (float)(0.10);
newTexture.SetPixel(x, y, modifiedPixel);
y++;
}
x++;
}
Debug.Log(newTexture.GetPixel(5, 5).ToString());
return newTexture;
}
私人精灵;
私有纹理2D纹理;
//用于初始化
无效开始()
{
sprite=this.gameObject.GetComponent().sprite;
纹理=精灵纹理;
Texture2D newTexture=修改纹理(纹理);
spriteender sr=this.gameObject.GetComponent();
sr.sprite=sprite.Create(newTexture,newrect(0,0,newTexture.width,newTexture.height),newvector2(0,0,10);
}
公共纹理2D modifyTexture(纹理2D基本纹理)
{
Texture2D newTexture=新纹理2d(baseTexture.width,baseTexture.height);
int x=0;
而(x
修改纹理像素后,必须调用函数将修改后的像素上载到图形卡
public Texture2D modifyTexture(Texture2D baseTexture)
{
Texture2D newTexture = new Texture2D(baseTexture.width, baseTexture.height);
int x = 0;
while (x < newTexture.width)
{
int y = 0;
while (y < newTexture.height)
{
Color currentPixel = baseTexture.GetPixel(x, y);
Color modifiedPixel = currentPixel;
modifiedPixel.r = (float)(modifiedPixel.r + 0.10);
modifiedPixel.b = (float)(modifiedPixel.b + 0.10);
modifiedPixel.g = (float)(0.10);
newTexture.SetPixel(x, y, modifiedPixel);
y++;
}
x++;
}
//Upload changes to Graphics graphics card
newTexture.Apply();
Debug.Log(newTexture.GetPixel(5, 5).ToString());
return newTexture;
}
public Texture2D modifyTexture(Texture2D baseTexture)
{
Texture2D newTexture=新纹理2d(baseTexture.width,baseTexture.height);
int x=0;
而(x
调用Apply
修复了着色问题,像素现在更新为正确的颜色。然而,新的精灵仍然比原来的大很多,你知道如何解决这个问题吗?当前的问题是如何使用sprite.Create
。增加或减少当前为10
的挤出参数。将其更改为80或大约5,然后看看会发生什么。此外,轴点应为0.5f
而不是0.0
。可能是这样的:Sprite.Create(newexture,newrect(0,0,newexture.width,newexture.height),newvector2(0.5f,0.5f),80)代码>或Sprite.Create(newTexture,new Rect(0,0,newTexture.width,newTexture.height),新矢量2(0.5f,0.5f),3)代码>调整挤出参数,直到得到所需的内容挤出参数的具体功能是什么?我早些时候在谷歌上搜索过,但它没有变得更清晰。我的错。它实际上是pixelsPerUnit
参数,而不是pixelsPerUnit
。extrude参数位于该参数之后,但此处不需要该参数,您也不使用该参数。文档中说明了pixelsPerUnit是精灵中对应于世界空间中一个单位的像素数。有关参数其余部分的含义,请参见。