我现在使用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;
}
}
}
}
答案 0 :(得分:1)
您正在混合不同的坐标。如果纹理不是完全屏幕大小的话就是这种情况。您的点击是在屏幕坐标中,您正在使用它来设置纹理坐标中的透明度。
这个需要使用带有碰撞器和纹理的3D模型。对于2D场景,您可以使用框并将其纹理设置为2D精灵。我不知道任何更简单的方法,但希望有。
您必须先将屏幕位置转换为世界坐标光线。这可以使用Camera.ScreenPointToRay完成。
然后你需要Physics.Raycast那条光线来检查它与之相交的三维模型对撞机的哪个位置。
可以使用RaycastHit.textureCoord将交点更改为纹理坐标。在上一个链接中,您可以找到整个过程的完整代码示例。