如何在 Unity 中检测精灵中的透明区域
How can I detect transparent areas in a sprite in Unity
我有一个 1024x1024 像素的精灵,其中有一些透明区域。我正在使用 Sprite Renderer 在游戏场景中渲染它。有什么方法可以检查鼠标悬停在鼠标位置的像素点是否透明
我们可以投射光线并获得我们命中点的世界位置,这里我假设你的 SpriteRenderer
有一个对撞机。
private RaycastHit CastRay()
{
RaycastHit hit;
Ray ray = _camera.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(ray, out hit);
return hit;
}
然后我们需要一种方法将那个世界space转换成纹理坐标
public Vector2 TextureSpaceCoord(Vector3 worldPos) {
float ppu = _sprite.pixelsPerUnit;
Vector2 localPos = transform.InverseTransformPoint(worldPos) * ppu;
var texSpacePivot = new Vector2(_sprite.rect.x, _sprite.rect.y) + _sprite.pivot;
Vector2 texSpaceCoord = texSpacePivot + localPos;
return texSpaceCoord;
}
一旦我们得到纹理坐标,我们就可以使用 Texture2D
的 GetPixel()
来获得颜色
private void PickColor()
{
RaycastHit hit = CastRay();
if (hit.collider != null)
{
Vector2 coord = TextureSpaceCoord(hit.point);
Color selectedColor = _sprite.texture.GetPixel((int) coord.x, (int) coord.y);
// Here you can check if color is transparent
if(selectedColor == Color.clear){
// do stuff
}
}
}
您可以在 Update()
中调用 PickColor()
,_camera
将是 Camera.main
,而 _sprite
将是您 SpriteRenderer
我有一个 1024x1024 像素的精灵,其中有一些透明区域。我正在使用 Sprite Renderer 在游戏场景中渲染它。有什么方法可以检查鼠标悬停在鼠标位置的像素点是否透明
我们可以投射光线并获得我们命中点的世界位置,这里我假设你的 SpriteRenderer
有一个对撞机。
private RaycastHit CastRay()
{
RaycastHit hit;
Ray ray = _camera.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(ray, out hit);
return hit;
}
然后我们需要一种方法将那个世界space转换成纹理坐标
public Vector2 TextureSpaceCoord(Vector3 worldPos) {
float ppu = _sprite.pixelsPerUnit;
Vector2 localPos = transform.InverseTransformPoint(worldPos) * ppu;
var texSpacePivot = new Vector2(_sprite.rect.x, _sprite.rect.y) + _sprite.pivot;
Vector2 texSpaceCoord = texSpacePivot + localPos;
return texSpaceCoord;
}
一旦我们得到纹理坐标,我们就可以使用 Texture2D
的 GetPixel()
来获得颜色
private void PickColor()
{
RaycastHit hit = CastRay();
if (hit.collider != null)
{
Vector2 coord = TextureSpaceCoord(hit.point);
Color selectedColor = _sprite.texture.GetPixel((int) coord.x, (int) coord.y);
// Here you can check if color is transparent
if(selectedColor == Color.clear){
// do stuff
}
}
}
您可以在 Update()
中调用 PickColor()
,_camera
将是 Camera.main
,而 _sprite
将是您 SpriteRenderer