2015-04-19 116 views
1

问题:绘画精灵

我要让原型清洁窗户(我的意思是清洗脏的窗户)的统一。

我在寻找这个主题,发现我可以通过Texture2D.SetPixel()更改像素。

我尝试通过这种方法来实现,首先我启用了纹理的读/写并尝试这种方法,但是我的精灵没有发生任何事情。

所以我想问一下,如果有可能改变被鼠标点击的精灵的alpha或触摸来显示原始的精灵的下面的精灵!

我的代码:

private RaycastHit2D hitInfo; 
    private SpriteRenderer spriteRendererComponent; 
    private Color zeroAlpha; 

    // Use this for initialization 
    void Start() 
    { 
     spriteRendererComponent = transform.GetComponent<SpriteRenderer>(); 
     zeroAlpha = Color.blue; 
    } 

    // Update is called once per frame 
    void Update() { 
     if (Input.GetMouseButton(0)) 
     { 
      MouseClick(); 
     } 
    } 

    public void MouseClick() 
    { 
     Vector2 mousePosition = Vector2.zero; 
     mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); 
     hitInfo = Physics2D.Raycast(mousePosition, Vector2.zero); 
     if (hitInfo) 
     { 
      spriteRendererComponent.sprite.texture.SetPixel((int)hitInfo.point.x, (int)hitInfo.point.y, zeroAlpha); 
      spriteRendererComponent.sprite.texture.Apply(); 
     } 
    } 

答:

可以使用this thread雪碧的变化像素


我发现写回信的优化呃关于改变精灵的像素(绘画)

public float radius; 
public Color InitialColor; 

private RaycastHit2D hitInfo; 

// Use this for initialization 
void Start() 
{ 

} 

// Update is called once per frame 
void Update() 
{ 
    if (CustomInput.ControlStay()) 
    { 
     hitInfo = CustomInput.ClickednTouched().hitInfo; 
     if (hitInfo) 
     { 
      UpdateTexture(); 
     } 
    } 
} 

public Texture2D CopyTexture2D(Texture2D copiedTexture2D) 
{ 
    float differenceX; 
    float differenceY; 

    //Create a new Texture2D, which will be the copy 
    Texture2D texture = new Texture2D(copiedTexture2D.width, copiedTexture2D.height); 

    //Choose your filtermode and wrapmode 
    texture.filterMode = FilterMode.Bilinear; 
    texture.wrapMode = TextureWrapMode.Clamp; 

    //Center of hit point circle 
    int m1 = (int)((hitInfo.point.x + 2.5f)/5 * copiedTexture2D.width); 
    int m2 = (int)((hitInfo.point.y + 2.5f)/5 * copiedTexture2D.height); 

    for (int x = 0; x < texture.width; x++) 
    { 
     for (int y = 0; y < texture.height; y++) 
     { 
      differenceX = x - m1; 
      differenceY = y - m2; 

      //INSERT YOUR LOGIC HERE 
      if (differenceX * differenceX + differenceY * differenceY <= radius * radius) 
      { 
       //This line of code and if statement, turn all texture pixels within radius to zero alpha 
       texture.SetPixel(x, y, InitialColor); 
      } 
      else 
      { 
       //This line of code is REQUIRED. Do NOT delete it. This is what copies the image as it was, without any change 
       texture.SetPixel(x, y, copiedTexture2D.GetPixel(x, y)); 
      } 
     } 
    } 

    //This finalizes it. If you want to edit it still, do it before you finish with Apply(). Do NOT expect to edit the image after you have applied. 
    texture.Apply(); 

    return texture; 
} 

public void UpdateTexture() 
{ 
    SpriteRenderer mySpriteRenderer = gameObject.GetComponent<SpriteRenderer>(); 
    Texture2D newTexture2D = CopyTexture2D(mySpriteRenderer.sprite.texture); 

    //Get the name of the old sprite 
    string tempName = mySpriteRenderer.sprite.name; 
    //Create a new sprite 
    mySpriteRenderer.sprite = Sprite.Create(newTexture2D, mySpriteRenderer.sprite.rect, new Vector2(0.5f, 0.5f)); 
    //Name the sprite, the old name 
    mySpriteRenderer.sprite.name = tempName; 

    //Update the material 
    //If you have multiple sprites, you will want to do this in a loop 
    //mySpriteRenderer.material.mainTexture = newTexture2D; 
    //mySpriteRenderer.material.shader = Shader.Find("Unlit/Transparent"); 

} 

另一个问题:在精灵

查找像素:

在Unity3d我们RaycastHit.textureCoord,但它不”在2D中不再存在。我正在寻找这个问题,很多,但我没有找到有用的东西。

所以我想知道这个问题的解决方案,我想知道为什么方法像3D纹理图案不存在于二维。

答:

我又找到答案,你在前面的代码中看到关于精灵寻找像素。

主题:Finding pixel on sprite in Unity

回答

0

我曾与写入和读出一个纹理一次(一刮卡)。 您必须考虑到,当您更改Sprite的像素时,您将更改整个纹理的像素。所以我们假设我改变了像素1x1,如果我在同一个纹理中有一组精灵,它很可能不会改变我的精灵中的像素1x1。所以你必须考虑精灵的偏移并重新定位你想要改变的像素。 尝试做类似这样的事情:

public void MouseClick() 
{ 
    Vector2 offset = new Vector2(XXX, YYY); 
    Vector2 mousePosition = Vector2.zero; 
    mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); 
    hitInfo = Physics2D.Raycast(mousePosition, Vector2.zero); 
    if (hitInfo) 
    { 
     spriteRendererComponent.sprite.texture.SetPixel((int)hitInfo.point.x + offset.x, (int)hitInfo.point.y + offset.y, zeroAlpha); 
     spriteRendererComponent.sprite.texture.Apply(); 
    } 
} 
0

看看这个!

我修复了您的脚本。适用于不同的纹理尺​​寸。不同的纹理位置和相机尺寸。要求箱对撞机2d。

using UnityEngine; 
using System.Collections; 

public class ExampleClass : MonoBehaviour 
{ 
    public float radius; 
    public Color InitialColor; 

    private RaycastHit2D hitInfo; 

    // Update is called once per frame 
    void Update() 
    { 
     if (Input.GetMouseButton(0)) 
     { 
      hitInfo = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero); 
      if (hitInfo) 
      { 
       UpdateTexture(); 
      } 
     } 
     if (Input.GetMouseButtonUp(0)) 
     { 
      Resources.UnloadUnusedAssets(); 
     } 
    } 

    public Texture2D CopyTexture2D(Texture2D copiedTexture2D) 
    { 
     float differenceX; 
     float differenceY; 

     //Create a new Texture2D, which will be the copy 
     Texture2D texture = new Texture2D(copiedTexture2D.width, copiedTexture2D.height); 

     //Choose your filtermode and wrapmode 
     texture.filterMode = FilterMode.Bilinear; 
     texture.wrapMode = TextureWrapMode.Clamp; 

     //Center of hit point circle 
     int m1 = (int)((hitInfo.point.x - hitInfo.collider.bounds.min.x) * (copiedTexture2D.width/hitInfo.collider.bounds.size.x)); 
     int m2 = (int)((hitInfo.point.y - hitInfo.collider.bounds.min.y) * (copiedTexture2D.height/hitInfo.collider.bounds.size.y)); 

     //Vector2 extremeScreenPoint = Camera.main.ScreenToWorldPoint(new Vector2(0, 0)); 
     //Debug.Log("extremeScreenPoint= " + extremeScreenPoint.x 
     //     + " hitInfo.point.x =" + hitInfo.point.x 

     // //+ " mousePosition =" + Camera.main.ScreenToWorldPoint(Input.mousePosition).x 
     //    + " bounds.min =" + hitInfo.collider.bounds.min .x 
     //    + " bounds.max =" + hitInfo.collider.bounds.max .x 
     //          + " size =" + hitInfo.collider.bounds.size.x 
     //          + " hit =" + (hitInfo.point.x - hitInfo.collider.bounds.min.x) 
     //          + " pixels =" + (hitInfo.point.x - hitInfo.collider.bounds.min.x) * (copiedTexture2D.width/hitInfo.collider.bounds.size.x) 
     // ); 



     for (int x = 0; x < texture.width; x++) 
     { 
      for (int y = 0; y < texture.height; y++) 
      { 
       differenceX = x - m1; 
       differenceY = y - m2; 



       //INSERT YOUR LOGIC HERE 
       if (differenceX * differenceX + differenceY * differenceY <= radius * radius) 
       { 
        //This line of code and if statement, turn all texture pixels within radius to zero alpha 
        texture.SetPixel(x, y, InitialColor); 
       } 
       else 
       { 
        //This line of code is REQUIRED. Do NOT delete it. This is what copies the image as it was, without any change 
        texture.SetPixel(x, y, copiedTexture2D.GetPixel(x, y)); 
       } 
      } 
     } 

     //This finalizes it. If you want to edit it still, do it before you finish with Apply(). Do NOT expect to edit the image after you have applied. 
     texture.Apply(); 
     //DestroyImmediate(copiedTexture2D, true); 
     return texture; 
    } 

    public void UpdateTexture() 
    { 
     SpriteRenderer mySpriteRenderer = gameObject.GetComponent<SpriteRenderer>(); 
     Texture2D newTexture2D = CopyTexture2D(mySpriteRenderer.sprite.texture); 

     //Get the name of the old sprite 
     string tempName = mySpriteRenderer.sprite.name; 
     //Create a new sprite 
     mySpriteRenderer.sprite = Sprite.Create(newTexture2D, mySpriteRenderer.sprite.rect, new Vector2(0.5f, 0.5f)); 
     //Name the sprite, the old name 
     mySpriteRenderer.sprite.name = tempName; 

     //Update the material 
     //If you have multiple sprites, you will want to do this in a loop 
     //mySpriteRenderer.material.mainTexture = newTexture2D; 
     //mySpriteRenderer.material.shader = Shader.Find("Unlit/Transparent"); 

    } 
}