使用setPixel()时出现错误的结果

时间:2015-01-30 19:25:20

标签: unity3d

我现在使用Texture2D上的setPixel()处理问题几天了。

我正在做的是获取鼠标位置或触摸位置(在Android上),然后在setPixel()中使用透明色。但结果我发生在其他地方,而不是鼠标所在的地方......

public class EarshPic : MonoBehaviour {
     public SpriteRenderer sr;
     public SpriteRenderer srO;
     public Camera c;
     // Use this for initialization
     void Start () {

         CreateCover();//This method is working fine
     }

     private void CreateCover()
     {
         Color color = new Color(0.5F, 0.5f, 0.5F, 1.0F); 
         int x = srO.sprite.texture.width;
         int y = srO.sprite.texture.height;
         Texture2D tmpTexture = new Texture2D(srO.sprite.texture.width,
         srO.sprite.texture.height);

         for (int i = 0; i < tmpTexture.width; i++)
         {
             for (int j = 0; j < tmpTexture.height; j++)
             {
                 tmpTexture.SetPixel(i, j, color);
             }
         }

         tmpTexture.Apply(true);

         sr.sprite = Sprite.Create(tmpTexture, srO.sprite.rect, 
                       new Vector2(0.5f, 0.5f),srO.sprite.pixelsPerUnit);

     }

     // I have problem in that method
     // Vector2 v =  mousePostion or touchpostion 

     void Eraser(Vector2 v)
     {
         Color color = new Color(0.5F, 0.5f, 0.5F, 0.0F);
         sr.sprite.texture.SetPixel(v.x, v.y, color);

         sr.sprite.texture.Apply(true);
     }

     // Update is called once per frame
     void Update () {
         if(Input.mousePosition!=null)
         {

             Eraser(Input.mousePosition);
         }
         if (Input.touchCount == 1)
         {
             Touch touch = Input.GetTouch(0);
             switch (touch.phase)
             {

                 case TouchPhase.Moved:
                     Eraser(touch.position);
                     break;

             }

         }
     }
 }

1 个答案:

答案 0 :(得分:1)

问题

您正在混合不同的坐标。如果纹理不是完全屏幕大小的话就是这种情况。您的点击是在屏幕坐标中,您正在使用它来设置纹理坐标中的透明度。

解决方案

这个需要使用带有碰撞器和纹理的3D模型。对于2D场景,您可以使用框并将其纹理设置为2D精灵。我不知道任何更简单的方法,但希望有。

您必须先将屏幕位置转换为世界坐标光线。这可以使用Camera.ScreenPointToRay完成。

然后你需要Physics.Raycast那条光线来检查它与之相交的三维模型对撞机的哪个位置。

可以使用RaycastHit.textureCoord将交点更改为纹理坐标。在上一个链接中,您可以找到整个过程的完整代码示例。