/// <summary> /// Perform a Unity Graphics Raycast to determine which uGUI element is currently being gazed at, if any. /// </summary> /// <param name="pointerData"></param> /// <param name="prioritizedLayerMasks"></param> private void RaycastGraphics(PointerData pointerData, LayerMask[] prioritizedLayerMasks) { Debug.Assert(UIRaycastCamera != null, "Missing UIRaycastCamera!"); RaycastResult raycastResult = default; bool overridePhysicsRaycast = false; RayStep rayStep = default; int rayStepIndex = 0; if (pointerData.Pointer.Rays == null) { Debug.LogError($"No valid rays for {pointerData.Pointer.PointerName} pointer."); return; } if (pointerData.Pointer.Rays.Length <= 0) { Debug.LogError($"No valid rays for {pointerData.Pointer.PointerName} pointer"); return; } // Cast rays for every step until we score a hit for (int i = 0; i < pointerData.Pointer.Rays.Length; i++) { if (RaycastGraphicsStep(pointerData, pointerData.Pointer.Rays[i], prioritizedLayerMasks, out overridePhysicsRaycast, out raycastResult)) { rayStepIndex = i; rayStep = pointerData.Pointer.Rays[i]; break; } } // Check if we need to overwrite the physics raycast info if ((pointerData.CurrentPointerTarget == null || overridePhysicsRaycast) && raycastResult.isValid && raycastResult.module != null && raycastResult.module.eventCamera == UIRaycastCamera) { newUiRaycastPosition.x = raycastResult.screenPosition.x; newUiRaycastPosition.y = raycastResult.screenPosition.y; newUiRaycastPosition.z = raycastResult.distance; Vector3 worldPos = UIRaycastCamera.ScreenToWorldPoint(newUiRaycastPosition); var hitInfo = new RaycastHit { point = worldPos, normal = -raycastResult.gameObject.transform.forward }; pointerData.UpdateHit(raycastResult, hitInfo, rayStep, rayStepIndex); } }
/// <summary> /// Perform a Unity Graphics Raycast to determine which uGUI element is currently being gazed at, if any. /// </summary> /// <param name="pointer"></param> /// <param name="graphicEventData"></param> /// <param name="prioritizedLayerMasks"></param> /// <param name="hitResult"></param> private void RaycastGraphics(IMixedRealityPointer pointer, PointerEventData graphicEventData, LayerMask[] prioritizedLayerMasks, PointerHitResult hitResult) { Debug.Assert(UIRaycastCamera != null, "Missing UIRaycastCamera!"); if (!UIRaycastCamera.nearClipPlane.Equals(0.01f)) { UIRaycastCamera.nearClipPlane = 0.01f; } if (pointer.Rays == null) { Debug.LogError($"No valid rays for {pointer.PointerName} pointer."); return; } if (pointer.Rays.Length <= 0) { Debug.LogError($"No valid rays for {pointer.PointerName} pointer"); return; } // Cast rays for every step until we score a hit float totalDistance = 0.0f; for (int i = 0; i < pointer.Rays.Length; i++) { if (RaycastGraphicsStep(graphicEventData, pointer.Rays[i], prioritizedLayerMasks, out var raycastResult)) { if (raycastResult.isValid && raycastResult.distance < pointer.Rays[i].Length && raycastResult.module != null && raycastResult.module.eventCamera == UIRaycastCamera) { totalDistance += raycastResult.distance; newUiRaycastPosition.x = raycastResult.screenPosition.x; newUiRaycastPosition.y = raycastResult.screenPosition.y; newUiRaycastPosition.z = raycastResult.distance; var worldPos = UIRaycastCamera.ScreenToWorldPoint(newUiRaycastPosition); var normal = -raycastResult.gameObject.transform.forward; hitResult.Set(raycastResult, worldPos, normal, pointer.Rays[i], i, totalDistance); return; } } totalDistance += pointer.Rays[i].Length; } }
/// <summary> /// Perform a Unity Graphics Raycast to determine which uGUI element is currently being gazed at, if any. /// </summary> /// <param name="pointer"></param> /// <param name="prioritizedLayerMasks"></param> private void RaycastGraphics(PointerData pointer, LayerMask[] prioritizedLayerMasks) { Debug.Assert(pointer.Details.Point != Vector3.zero, "Invalid pointer source start point found to raycast from!"); Debug.Assert(UIRaycastCamera != null, "You must assign a UIRaycastCamera on the FocusProvider before you can process uGUI raycasting."); RaycastResult raycastResult = default(RaycastResult); bool overridePhysicsRaycast = false; RayStep rayStep = default(RayStep); int rayStepIndex = 0; Debug.Assert(pointer.Pointer.Rays != null, "No valid rays for pointer"); Debug.Assert(pointer.Pointer.Rays.Length > 0, "No valid rays for pointer"); // Cast rays for every step until we score a hit for (int i = 0; i < pointer.Pointer.Rays.Length; i++) { if (RaycastGraphicsStep(pointer, pointer.Pointer.Rays[i], prioritizedLayerMasks, out overridePhysicsRaycast, out raycastResult)) { rayStepIndex = i; rayStep = pointer.Pointer.Rays[i]; break; } } // Check if we need to overwrite the physics raycast info if ((pointer.CurrentPointerTarget == null || overridePhysicsRaycast) && raycastResult.isValid && raycastResult.module != null && raycastResult.module.eventCamera == UIRaycastCamera) { newUiRaycastPosition.x = raycastResult.screenPosition.x; newUiRaycastPosition.y = raycastResult.screenPosition.y; newUiRaycastPosition.z = raycastResult.distance; Vector3 worldPos = UIRaycastCamera.ScreenToWorldPoint(newUiRaycastPosition); var hitInfo = new RaycastHit { point = worldPos, normal = -raycastResult.gameObject.transform.forward }; pointer.UpdateHit(raycastResult, hitInfo, rayStep, rayStepIndex); } }