2015-04-19 13 views
1

Проблема:Картина спрайт в единстве

Я хочу сделать прототип для чистки окон (я имею в виду очистки грязных окон) в единстве.

Я искал эту тему и обнаружил, что могу изменить пиксель на Texture2D.SetPixel().

Я пытаюсь сделать это с помощью этого метода. Сначала я включил чтение/запись текстуры и попробовал этот метод, но ничего не произошло в моем спрайте.

Так что я хочу спросить, можно ли изменить альфа спрайта, щелкнув мышью или коснуться, чтобы показать приведенный ниже спрайт оригинального!

Мой код:

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 для оптимизации изменяющихся пикселей спрайта


я нашел ANSW эр об изменении пикселей спрайта (живопись)

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"); 

} 

Еще одна проблема:

Finding пиксель спрайта:

В Unity3d мы имеем RaycastHit.textureCoord но это Безразлично» t существует в 2D. Я много искал эту проблему, но я не нашел ничего полезного.

Так что я хочу знать решение этой проблемы, и мне интересно, почему такой метод, как textureCoord в 3D, не существует в 2D.

Ответ:

Я нашел ответ снова, как вы видите, в предыдущем коде для нахождения пикселя на спрайт.

Тема: Finding pixel on sprite in Unity

ответ

0

Я работал с Написание и чтение Texture один раз (для царапания карты). Вы должны учитывать, что когда вы меняете пиксели спрайта, вы меняете пиксели на всю текстуру. Итак, скажем, что я изменяю пиксель 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

Проверьте это!

Я исправил ваш сценарий. Работает с различными размерами текстур. Различные места текстуры и размер камеры. Требуется box collider 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"); 

    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^