/// Credit Simon (darkside) Jackson /// Sourced from - My head namespace UnityEngine.UI.Extensions { public static class UIExtensionMethods { public static Canvas GetParentCanvas(this RectTransform rt) { RectTransform parent = rt; Canvas parentCanvas = rt.GetComponent(); int SearchIndex = 0; while (parentCanvas == null || SearchIndex > 50) { parentCanvas = rt.GetComponentInParent(); if (parentCanvas == null) { parent = parent.parent.GetComponent(); SearchIndex++; } } return parentCanvas; } public static Vector2 TransformInputBasedOnCanvasType(this Vector2 input, Canvas canvas) { if (canvas.renderMode == RenderMode.ScreenSpaceOverlay) { return canvas.GetEventCamera().ScreenToWorldPoint(input); } else { return input; } } public static Vector3 TransformInputBasedOnCanvasType(this Vector2 input, RectTransform rt) { var canvas = rt.GetParentCanvas(); if (input == Vector2.zero || canvas.renderMode == RenderMode.ScreenSpaceOverlay) { return input; } else { // Needs work :S Vector2 movePos; RectTransformUtility.ScreenPointToLocalPointInRectangle( rt, input, canvas.GetEventCamera(), out movePos); Vector3 output = canvas.transform.TransformPoint(movePos); return output; } } public static Camera GetEventCamera(this Canvas input) { return input.worldCamera == null ? Camera.main : input.worldCamera; } } }