HitTestContext.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. namespace FairyGUI
  4. {
  5. /// <summary>
  6. ///
  7. /// </summary>
  8. public class HitTestContext
  9. {
  10. //set before hit test
  11. public static Vector3 screenPoint;
  12. public static Vector3 worldPoint;
  13. public static Vector3 direction;
  14. public static bool forTouch;
  15. public static Camera camera;
  16. public static int layerMask = -1;
  17. public static float maxDistance = Mathf.Infinity;
  18. public static Camera cachedMainCamera;
  19. static Dictionary<Camera, RaycastHit?> raycastHits = new Dictionary<Camera, RaycastHit?>();
  20. /// <summary>
  21. ///
  22. /// </summary>
  23. /// <param name="camera"></param>
  24. /// <param name="hit"></param>
  25. /// <returns></returns>
  26. public static bool GetRaycastHitFromCache(Camera camera, out RaycastHit hit)
  27. {
  28. RaycastHit? hitRef;
  29. if (!raycastHits.TryGetValue(camera, out hitRef))
  30. {
  31. Ray ray = camera.ScreenPointToRay(screenPoint);
  32. if (Physics.Raycast(ray, out hit, maxDistance, layerMask))
  33. {
  34. raycastHits[camera] = hit;
  35. return true;
  36. }
  37. else
  38. {
  39. raycastHits[camera] = null;
  40. return false;
  41. }
  42. }
  43. else if (hitRef == null)
  44. {
  45. hit = new RaycastHit();
  46. return false;
  47. }
  48. else
  49. {
  50. hit = (RaycastHit)hitRef;
  51. return true;
  52. }
  53. }
  54. /// <summary>
  55. ///
  56. /// </summary>
  57. /// <param name="camera"></param>
  58. /// <param name="hit"></param>
  59. public static void CacheRaycastHit(Camera camera, ref RaycastHit hit)
  60. {
  61. raycastHits[camera] = hit;
  62. }
  63. /// <summary>
  64. ///
  65. /// </summary>
  66. public static void ClearRaycastHitCache()
  67. {
  68. raycastHits.Clear();
  69. }
  70. }
  71. }