MouseCursorRayHit.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using System;
  4. using System.Collections.Generic;
  5. namespace O3DWB
  6. {
  7. public class MouseCursorRayHit
  8. {
  9. #region Private Variables
  10. private GridCellRayHit _gridCellRayHit;
  11. private List<GameObjectRayHit> _sortedObjectRayHits;
  12. private bool _wasParticleSystemHit = false;
  13. private bool _wasLightObjectHit = false;
  14. private GameObjectRayHit _closestLightObjectHit = null;
  15. private GameObjectRayHit _closestParticleSystemObjectHit = null;
  16. #endregion
  17. #region Public Properties
  18. public GridCellRayHit GridCellRayHit { get { return _gridCellRayHit; } }
  19. public List<GameObjectRayHit> SortedObjectRayHits { get { return _sortedObjectRayHits; } }
  20. public GameObjectRayHit ClosestObjectRayHit { get { return _sortedObjectRayHits.Count != 0 ? _sortedObjectRayHits[0] : null; } }
  21. public bool WasACellHit { get { return _gridCellRayHit != null; } }
  22. public bool WasAnObjectHit
  23. {
  24. get
  25. {
  26. _sortedObjectRayHits.RemoveAll(item => item.HitObject == null);
  27. return _sortedObjectRayHits.Count != 0;
  28. }
  29. }
  30. public bool WasParticleSystemHit { get { return _wasParticleSystemHit; } }
  31. public bool WasLightObjectHit { get { return _wasLightObjectHit; } }
  32. public bool WasAnythingHit { get { return WasACellHit || WasAnObjectHit; } }
  33. #endregion
  34. #region Constructors
  35. public MouseCursorRayHit(GridCellRayHit gridCellRayHit, List<GameObjectRayHit> sortedObjectRayHits)
  36. {
  37. _gridCellRayHit = gridCellRayHit;
  38. _sortedObjectRayHits = sortedObjectRayHits != null ? new List<GameObjectRayHit>(sortedObjectRayHits) : new List<GameObjectRayHit>();
  39. int firstLightHit = _sortedObjectRayHits.FindIndex(item => item.HitObject.HasLight());
  40. int firstParticleSystemHit = _sortedObjectRayHits.FindIndex(item => item.HitObject.HasParticleSystem());
  41. if (firstLightHit >= 0)
  42. {
  43. _wasLightObjectHit = true;
  44. _closestLightObjectHit = _sortedObjectRayHits[firstLightHit];
  45. }
  46. if(firstParticleSystemHit >= 0)
  47. {
  48. _wasParticleSystemHit = true;
  49. _closestParticleSystemObjectHit = _sortedObjectRayHits[firstParticleSystemHit];
  50. }
  51. }
  52. #endregion
  53. #region Public Methods
  54. public GameObject GetClosestHitParticleSystemOrLightObject()
  55. {
  56. if(WasAnObjectHit && (WasLightObjectHit || WasParticleSystemHit))
  57. {
  58. GameObject closestHitObject = _closestLightObjectHit != null ? _closestLightObjectHit.HitObject : null;
  59. if (closestHitObject == null ||
  60. (_closestParticleSystemObjectHit != null && _closestLightObjectHit.HitEnter > _closestParticleSystemObjectHit.HitEnter))
  61. closestHitObject = _closestParticleSystemObjectHit.HitObject;
  62. return closestHitObject;
  63. }
  64. return null;
  65. }
  66. public List<GameObject> GetAllObjectsSortedByHitDistance()
  67. {
  68. if (!WasAnObjectHit) return new List<GameObject>();
  69. var allObjects = new List<GameObject>();
  70. foreach (var objectHit in _sortedObjectRayHits) allObjects.Add(objectHit.HitObject);
  71. return allObjects;
  72. }
  73. #endregion
  74. }
  75. }
  76. #endif