/Assets/Invector-3rdPersonController/Basic Locomotion/Scripts/HeadTrack/Scripts/vLookTarget.cs

https://bitbucket.org/zornco/mech-runners · C# · 254 lines · 198 code · 38 blank · 18 comment · 62 complexity · 1109d113c9a1a3ed0d87366383b5a131 MD5 · raw file

  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public class vLookTarget : MonoBehaviour
  5. {
  6. [Header("Set this to assign a different point to look")]
  7. public Transform lookPointTarget;
  8. [Header("Area to check if is visible")]
  9. public Vector3 centerArea = Vector3.zero;
  10. public Vector3 sizeArea = Vector3.one;
  11. public bool useLimitToDetect = true;
  12. public float minDistanceToDetect = 2f;
  13. public VisibleCheckType visibleCheckType;
  14. [Tooltip("use this to turn the object undetectable")]
  15. public bool HideObject;
  16. public enum VisibleCheckType
  17. {
  18. None, SingleCast, BoxCast
  19. }
  20. void OnDrawGizmosSelected()
  21. {
  22. DrawBox();
  23. }
  24. void Start()
  25. {
  26. var layer = LayerMask.NameToLayer("HeadTrack");
  27. gameObject.layer = layer;
  28. }
  29. /// <summary>
  30. /// Point to look
  31. /// </summary>
  32. public Vector3 lookPoint
  33. {
  34. get
  35. {
  36. if (lookPointTarget)
  37. {
  38. return lookPointTarget.position;
  39. }
  40. else
  41. return transform.TransformPoint(centerArea);
  42. }
  43. }
  44. void DrawBox()
  45. {
  46. Gizmos.color = new Color(1, 0, 0, 1f);
  47. Gizmos.DrawSphere(lookPoint, 0.05f);
  48. if (visibleCheckType == VisibleCheckType.BoxCast)
  49. {
  50. var sizeX = transform.lossyScale.x * sizeArea.x;
  51. var sizeY = transform.lossyScale.y * sizeArea.y;
  52. var sizeZ = transform.lossyScale.z * sizeArea.z;
  53. var centerX = transform.lossyScale.x * centerArea.x;
  54. var centerY = transform.lossyScale.y * centerArea.y;
  55. var centerZ = transform.lossyScale.z * centerArea.z;
  56. Matrix4x4 rotationMatrix = Matrix4x4.TRS(transform.position + new Vector3(centerX, centerY, centerZ), transform.rotation, new Vector3(sizeX, sizeY, sizeZ) * 2f);
  57. Gizmos.matrix = rotationMatrix;
  58. Gizmos.color = new Color(0, 1, 0, 0.2f);
  59. Gizmos.DrawCube(Vector3.zero, Vector3.one);
  60. Gizmos.color = new Color(0, 1, 0, 1f);
  61. Gizmos.DrawWireCube(Vector3.zero, Vector3.one);
  62. }
  63. else if (visibleCheckType == VisibleCheckType.SingleCast)
  64. {
  65. var point = transform.TransformPoint(centerArea);
  66. Gizmos.color = new Color(0, 1, 0, 1f);
  67. Gizmos.DrawSphere(point, 0.05f);
  68. }
  69. }
  70. }
  71. #region Helper
  72. public static class vLookTargetHelper
  73. {
  74. struct LookPoints
  75. {
  76. public Vector3 frontTopLeft;
  77. public Vector3 frontTopRight;
  78. public Vector3 frontBottomLeft;
  79. public Vector3 frontBottomRight;
  80. public Vector3 backTopLeft;
  81. public Vector3 backTopRight;
  82. public Vector3 backBottomLeft;
  83. public Vector3 backBottomRight;
  84. }
  85. static LookPoints GetLookPoints(vLookTarget lookTarget)
  86. {
  87. LookPoints points = new LookPoints();
  88. var centerArea = lookTarget.centerArea;
  89. var sizeArea = lookTarget.sizeArea;
  90. var lookTransform = lookTarget.transform;
  91. points.frontTopLeft = new Vector3(centerArea.x - sizeArea.x, centerArea.y + sizeArea.y, centerArea.z - sizeArea.z);
  92. points.frontTopRight = new Vector3(centerArea.x + sizeArea.x, centerArea.y + sizeArea.y, centerArea.z - sizeArea.z);
  93. points.frontBottomLeft = new Vector3(centerArea.x - sizeArea.x, centerArea.y - sizeArea.y, centerArea.z - sizeArea.z);
  94. points.frontBottomRight = new Vector3(centerArea.x + sizeArea.x, centerArea.y - sizeArea.y, centerArea.z - sizeArea.z);
  95. points.backTopLeft = new Vector3(centerArea.x - sizeArea.x, centerArea.y + sizeArea.y, centerArea.z + sizeArea.z);
  96. points.backTopRight = new Vector3(centerArea.x + sizeArea.x, centerArea.y + sizeArea.y, centerArea.z + sizeArea.z);
  97. points.backBottomLeft = new Vector3(centerArea.x - sizeArea.x, centerArea.y - sizeArea.y, centerArea.z + sizeArea.z);
  98. points.backBottomRight = new Vector3(centerArea.x + sizeArea.x, centerArea.y - sizeArea.y, centerArea.z + sizeArea.z);
  99. points.frontTopLeft = lookTransform.TransformPoint(points.frontTopLeft);
  100. points.frontTopRight = lookTransform.TransformPoint(points.frontTopRight);
  101. points.frontBottomLeft = lookTransform.TransformPoint(points.frontBottomLeft);
  102. points.frontBottomRight = lookTransform.TransformPoint(points.frontBottomRight);
  103. points.backTopLeft = lookTransform.TransformPoint(points.backTopLeft);
  104. points.backTopRight = lookTransform.TransformPoint(points.backTopRight);
  105. points.backBottomLeft = lookTransform.TransformPoint(points.backBottomLeft);
  106. points.backBottomRight = lookTransform.TransformPoint(points.backBottomRight);
  107. return points;
  108. }
  109. /// <summary>
  110. /// Check if anny corner points of LookTarget area is visible from observer
  111. /// </summary>
  112. /// <param name="lookTarget">principal transform of lookTarget</param>
  113. /// <param name="from">observer point</param>
  114. /// <param name="layerMask">Layer to check</param>
  115. /// <param name="debug">Draw lines </param>
  116. /// <returns></returns>
  117. public static bool IsVisible(this vLookTarget lookTarget, Vector3 from, LayerMask layerMask, bool debug = false)
  118. {
  119. if (lookTarget.HideObject) return false;
  120. if (lookTarget.visibleCheckType == vLookTarget.VisibleCheckType.None)
  121. {
  122. if (lookTarget.useLimitToDetect && Vector3.Distance(from, lookTarget.transform.position) > lookTarget.minDistanceToDetect) return false;
  123. return true;
  124. }
  125. else if (lookTarget.visibleCheckType == vLookTarget.VisibleCheckType.SingleCast)
  126. {
  127. if (lookTarget.useLimitToDetect && Vector3.Distance(from, lookTarget.centerArea) > lookTarget.minDistanceToDetect) return false;
  128. if (CastPoint(from, lookTarget.transform.TransformPoint(lookTarget.centerArea), lookTarget.transform, layerMask, debug)) return true; else return false;
  129. }
  130. else if (lookTarget.visibleCheckType == vLookTarget.VisibleCheckType.BoxCast)
  131. {
  132. if (lookTarget.useLimitToDetect && Vector3.Distance(from, lookTarget.transform.position) > lookTarget.minDistanceToDetect) return false;
  133. LookPoints points = GetLookPoints(lookTarget);
  134. if (CastPoint(from, points.frontTopLeft, lookTarget.transform, layerMask, debug)) return true;
  135. if (CastPoint(from, points.frontTopRight, lookTarget.transform, layerMask, debug)) return true;
  136. if (CastPoint(from, points.frontBottomLeft, lookTarget.transform, layerMask, debug)) return true;
  137. if (CastPoint(from, points.frontBottomRight, lookTarget.transform, layerMask, debug)) return true;
  138. if (CastPoint(from, points.backTopLeft, lookTarget.transform, layerMask, debug)) return true;
  139. if (CastPoint(from, points.backTopRight, lookTarget.transform, layerMask, debug)) return true;
  140. if (CastPoint(from, points.backBottomLeft, lookTarget.transform, layerMask, debug)) return true;
  141. if (CastPoint(from, points.backBottomRight, lookTarget.transform, layerMask, debug)) return true;
  142. }
  143. return false;
  144. }
  145. /// <summary>
  146. /// Check if anny corner points of LookTarget area is visible from observer
  147. /// </summary>
  148. /// <param name="lookTarget">principal transform of lookTarget</param>
  149. /// <param name="from">observer point</param>
  150. /// <param name="debug">Draw lines </param>
  151. /// <returns></returns>
  152. public static bool IsVisible(this vLookTarget lookTarget, Vector3 from, bool debug = false)
  153. {
  154. if (lookTarget.HideObject) return false;
  155. LookPoints points = GetLookPoints(lookTarget);
  156. if (lookTarget.visibleCheckType == vLookTarget.VisibleCheckType.None)
  157. {
  158. return true;
  159. }
  160. else if (lookTarget.visibleCheckType == vLookTarget.VisibleCheckType.SingleCast)
  161. {
  162. if (CastPoint(from, lookTarget.transform.TransformPoint(lookTarget.centerArea), lookTarget.transform, debug)) return true; else return false;
  163. }
  164. else if (lookTarget.visibleCheckType == vLookTarget.VisibleCheckType.BoxCast)
  165. {
  166. if (CastPoint(from, points.frontTopLeft, lookTarget.transform, debug)) return true;
  167. if (CastPoint(from, points.frontTopRight, lookTarget.transform, debug)) return true;
  168. if (CastPoint(from, points.frontBottomLeft, lookTarget.transform, debug)) return true;
  169. if (CastPoint(from, points.frontBottomRight, lookTarget.transform, debug)) return true;
  170. if (CastPoint(from, points.backTopLeft, lookTarget.transform, debug)) return true;
  171. if (CastPoint(from, points.backTopRight, lookTarget.transform, debug)) return true;
  172. if (CastPoint(from, points.backBottomLeft, lookTarget.transform, debug)) return true;
  173. if (CastPoint(from, points.backBottomRight, lookTarget.transform, debug)) return true;
  174. }
  175. return false;
  176. }
  177. static bool CastPoint(Vector3 from, Vector3 point, Transform lookTarget, LayerMask layerMask, bool debug = false)
  178. {
  179. RaycastHit hit;
  180. if (Physics.Linecast(from, point, out hit, layerMask))
  181. {
  182. if (hit.transform != lookTarget.transform)
  183. {
  184. if (debug) Debug.DrawLine(from, hit.point, Color.red);
  185. return false;
  186. }
  187. else
  188. {
  189. if (debug) Debug.DrawLine(from, hit.point, Color.green);
  190. return true;
  191. }
  192. }
  193. if (debug) Debug.DrawLine(from, point, Color.green);
  194. return true;
  195. }
  196. static bool CastPoint(Vector3 from, Vector3 point, Transform lookTarget, bool debug = false)
  197. {
  198. RaycastHit hit;
  199. if (Physics.Linecast(from, point, out hit))
  200. {
  201. if (hit.transform != lookTarget.transform)
  202. {
  203. if (debug) Debug.DrawLine(from, hit.point, Color.red);
  204. return false;
  205. }
  206. else
  207. {
  208. if (debug) Debug.DrawLine(from, hit.point, Color.green);
  209. return true;
  210. }
  211. }
  212. if (debug) Debug.DrawLine(from, point, Color.green);
  213. return true;
  214. }
  215. }
  216. #endregion