如何在 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;
}

一旦我们得到纹理坐标,我们就可以使用 Texture2DGetPixel() 来获得颜色

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