使用 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中,你可以找到整个过程的完整代码示例。
几天来我一直在处理 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中,你可以找到整个过程的完整代码示例。