public static Selectable FindNextSelectable(Selectable selectable, Transform transform, List <Selectable> allSelectables, Vector3 direction) { RectTransform rectTransform = transform as RectTransform; if (rectTransform == null) { return(null); } direction = direction.normalized; Vector2 vector = Quaternion.Inverse(transform.rotation) * direction; Vector2 vector2 = transform.TransformPoint(UITools.GetPointOnRectEdge(rectTransform, vector)); bool flag = direction == Vector3.left || direction == Vector3.right; float num = float.PositiveInfinity; float num2 = float.PositiveInfinity; Selectable selectable2 = null; Selectable selectable3 = null; Vector2 point = vector2 + vector * 999999f; for (int i = 0; i < allSelectables.Count; i++) { Selectable selectable4 = allSelectables[i]; if (!(selectable4 == selectable) && !(selectable4 == null)) { if (selectable4.navigation.mode != Navigation.Mode.None) { if (selectable4.IsInteractable() || ReflectionTools.GetPrivateField <Selectable, bool>(selectable4, "m_GroupsAllowInteraction")) { RectTransform rectTransform2 = selectable4.transform as RectTransform; if (!(rectTransform2 == null)) { Rect worldSpaceRect = UITools.GetWorldSpaceRect(rectTransform2); float num3; if (MathTools.LineIntersectsRect(vector2, point, worldSpaceRect, out num3)) { if (flag) { num3 *= 0.25f; } if (num3 < num2) { num2 = num3; selectable3 = selectable4; } } Vector2 v = rectTransform2.rect.center; Vector2 to = selectable4.transform.TransformPoint(v) - vector2; float num4 = Mathf.Abs(Vector2.Angle(vector, to)); if (num4 <= 75f) { float sqrMagnitude = to.sqrMagnitude; if (sqrMagnitude < num) { num = sqrMagnitude; selectable2 = selectable4; } } } } } } } if (!(selectable3 != null) || !(selectable2 != null)) { return(selectable3 ?? selectable2); } if (num2 > num) { return(selectable2); } return(selectable3); }
public static Selectable FindNextSelectable( Selectable selectable, Transform transform, List <Selectable> allSelectables, Vector3 direction) { RectTransform rectTransform1 = transform as RectTransform; if (Object.op_Equality((Object)rectTransform1, (Object)null)) { return((Selectable)null); } ((Vector3) ref direction).Normalize(); Vector2 dir = Vector2.op_Implicit(direction); Vector2 vector2_1 = Vector2.op_Implicit(UITools.GetPointOnRectEdge(rectTransform1, dir)); bool flag = Vector2.op_Equality(dir, Vector2.op_Multiply(Vector2.get_right(), -1f)) || Vector2.op_Equality(dir, Vector2.get_right()); float num1 = float.PositiveInfinity; float num2 = float.PositiveInfinity; Selectable selectable1 = (Selectable)null; Selectable selectable2 = (Selectable)null; Vector2 vector2_2 = Vector2.op_Addition(vector2_1, Vector2.op_Multiply(dir, 999999f)); for (int index = 0; index < allSelectables.Count; ++index) { Selectable allSelectable = allSelectables[index]; if (!Object.op_Equality((Object)allSelectable, (Object)selectable) && !Object.op_Equality((Object)allSelectable, (Object)null)) { Navigation navigation = allSelectable.get_navigation(); if (((Navigation) ref navigation).get_mode() != null && (allSelectable.IsInteractable() || (int)ReflectionTools.GetPrivateField <Selectable, bool>((M0)allSelectable, "m_GroupsAllowInteraction") != 0)) { RectTransform transform1 = ((Component)allSelectable).get_transform() as RectTransform; if (!Object.op_Equality((Object)transform1, (Object)null)) { Rect rect1 = UITools.InvertY(UITools.TransformRectTo((Transform)transform1, transform, transform1.get_rect())); float num3; if (MathTools.LineIntersectsRect(vector2_1, vector2_2, rect1, ref num3)) { if (flag) { num3 *= 0.25f; } if ((double)num3 < (double)num2) { num2 = num3; selectable2 = allSelectable; } } RectTransform rectTransform2 = transform1; Transform transform2 = transform; Rect rect2 = transform1.get_rect(); Vector3 vector3 = Vector2.op_Implicit(((Rect) ref rect2).get_center()); Vector2 vector2_3 = Vector2.op_Subtraction(Vector2.op_Implicit(UnityTools.TransformPoint((Transform)rectTransform2, transform2, vector3)), vector2_1); if ((double)Mathf.Abs(Vector2.Angle(dir, vector2_3)) <= 75.0) { float sqrMagnitude = ((Vector2) ref vector2_3).get_sqrMagnitude(); if ((double)sqrMagnitude < (double)num1) { num1 = sqrMagnitude; selectable1 = allSelectable; } } } } } } if (!Object.op_Inequality((Object)selectable2, (Object)null) || !Object.op_Inequality((Object)selectable1, (Object)null)) { return(selectable2 ?? selectable1); } return((double)num2 > (double)num1 ? selectable1 : selectable2); }