public bool RayCastUI(out Vector3 hitPos, out Vector3 hitNormal, out Button hitButton)
{
// Defaults
hitPos = Vector3.zero;
hitNormal = Vector3.zero;
hitButton = null;
// Do the raycast
RaycastHit hitInfo;
Vector3 uiRayCastOrigin = Camera.main.transform.position;
Vector3 uiRayCastDirection = Camera.main.transform.forward;
if (Physics.Raycast(uiRayCastOrigin, uiRayCastDirection, out hitInfo, RayCastLength, UILayerMask))
{
Canvas canvas = hitInfo.collider.gameObject.GetComponent<Canvas>();
if (canvas != null)
{
GraphicRaycaster canvasRaycaster = canvas.gameObject.GetComponent<GraphicRaycaster>();
if (canvasRaycaster != null)
{
// Cast only against this canvas
PointerEventData pData = new PointerEventData(EventSystem.current);
pData.position = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f);
pData.delta = Vector2.zero;
pData.scrollDelta = Vector2.zero;
List<UnityEngine.EventSystems.RaycastResult> canvasHits = new List<UnityEngine.EventSystems.RaycastResult>();
canvasRaycaster.Raycast(pData, canvasHits);
for (int i = 0; i < canvasHits.Count; ++i)
{
Button button = canvasHits[i].gameObject.GetComponent<Button>();
if (button != null)
{
hitPos = uiRayCastOrigin + uiRayCastDirection * canvasHits[i].distance;
hitNormal = canvasHits[i].gameObject.transform.forward;
hitButton = button;
return true;
}
}
// No buttons, but hit canvas object
hitPos = hitInfo.point;
hitNormal = hitInfo.normal;
return true;
}
}
}
return false;
}