使用 setPixel() 时的错误结果

Wrong result when using setPixel()

几天来我一直在处理 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;

             }

         }
     }
 }

问题

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

解决方案

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

您必须先将屏幕位置转换为世界坐标射线。这可以通过 Camera.ScreenPointToRay.

来完成

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

可以使用RaycastHit.textureCoord将交点更改为纹理坐标。在之前的link中,你可以找到整个过程的完整代码示例。