31 [RequireComponent(typeof(RectTransform))]
32 [RequireComponent(typeof(
Image))]
33 [AddComponentMenu(
"UI/Extensions/Raycast Mask")]
34 public class RaycastMask : MonoBehaviour, ICanvasRaycastFilter
37 private Sprite _sprite;
41 _image = GetComponent<Image>();
46 _sprite = _image.sprite;
48 var rectTransform = (RectTransform)transform;
49 Vector2 localPositionPivotRelative;
50 RectTransformUtility.ScreenPointToLocalPointInRectangle((RectTransform)transform, sp, eventCamera, out localPositionPivotRelative);
53 var localPosition =
new Vector2(localPositionPivotRelative.x + rectTransform.pivot.x * rectTransform.rect.width,
54 localPositionPivotRelative.y + rectTransform.pivot.y * rectTransform.rect.height);
56 var spriteRect = _sprite.textureRect;
57 var maskRect = rectTransform.rect;
65 case Image.Type.Sliced:
67 var border = _sprite.border;
69 if (localPosition.x < border.x)
71 x = Mathf.FloorToInt(spriteRect.x + localPosition.x);
73 else if (localPosition.x > maskRect.width - border.z)
75 x = Mathf.FloorToInt(spriteRect.x + spriteRect.width - (maskRect.width - localPosition.x));
79 x = Mathf.FloorToInt(spriteRect.x + border.x +
80 ((localPosition.x - border.x) /
81 (maskRect.width - border.x - border.z)) *
82 (spriteRect.width - border.x - border.z));
85 if (localPosition.y < border.y)
87 y = Mathf.FloorToInt(spriteRect.y + localPosition.y);
89 else if (localPosition.y > maskRect.height - border.w)
91 y = Mathf.FloorToInt(spriteRect.y + spriteRect.height - (maskRect.height - localPosition.y));
95 y = Mathf.FloorToInt(spriteRect.y + border.y +
96 ((localPosition.y - border.y) /
97 (maskRect.height - border.y - border.w)) *
98 (spriteRect.height - border.y - border.w));
102 case Image.Type.Simple:
106 x = Mathf.FloorToInt(spriteRect.x + spriteRect.width * localPosition.x / maskRect.width);
107 y = Mathf.FloorToInt(spriteRect.y + spriteRect.height * localPosition.y / maskRect.height);
115 return _sprite.texture.GetPixel(x, y).a > 0;
117 catch (UnityException)
119 Debug.LogWarning(
"Mask texture not readable, set your sprite to Texture Type 'Advanced' and check 'Read/Write Enabled'");
System.Drawing.Image Image
bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
Credit Erdener Gonenc - @PixelEnvision.