Advertisement
MatiGe

Field of View

Dec 13th, 2022
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.62 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class FOV : MonoBehaviour
  6. {
  7. public float viewRadius;
  8. [Range(0, 360)]
  9. public float viewAngle;
  10.  
  11. public LayerMask targetMask;
  12. public LayerMask walls;
  13.  
  14. public GameObject visibleTarget;
  15.  
  16. public bool canSee { get; private set; }
  17.  
  18. public Soldier soldier;
  19. public Vector2 DirFromAngle(float angleInDegrees, bool angleIsGlobal)
  20. {
  21. if (!angleIsGlobal)
  22. {
  23. angleInDegrees += transform.eulerAngles.y;
  24. }
  25. return new Vector2(Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), Mathf.Cos(angleInDegrees * Mathf.Deg2Rad));
  26. }
  27.  
  28. public Transform bj;
  29. void FindVisibleTarget()
  30. {
  31. Collider2D[] targetInViewRadius = Physics2D.OverlapCircleAll(transform.position, viewRadius, targetMask);
  32.  
  33. if ( targetInViewRadius.Length > 0)
  34. {
  35. Transform target = targetInViewRadius[0].transform;
  36. Vector2 dirToTarget = (target.position - transform.position).normalized;
  37.  
  38. if (Vector2.Angle(transform.up, dirToTarget) < viewAngle / 2)
  39. {
  40. float distToTarget = Vector2.Distance(transform.position, target.position);
  41.  
  42. if (!Physics2D.Raycast(transform.position, dirToTarget, distToTarget, walls))
  43. {
  44.  
  45. canSee = true;
  46.  
  47. }
  48.  
  49. else
  50. {
  51. canSee = false;
  52. }
  53.  
  54. }
  55. else
  56. {
  57. canSee = false;
  58. }
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65. }
  66. else if (canSee)
  67. {
  68. canSee = false;
  69. }
  70. }
  71. // Start is called before the first frame update
  72. void Start()
  73. {
  74. visibleTarget = GameObject.FindGameObjectWithTag("BJ");
  75. StartCoroutine(FOVCheck());
  76. bj = GameObject.FindWithTag("BJ").transform;
  77. }
  78.  
  79. private IEnumerator FOVCheck()
  80. {
  81. WaitForSeconds wait = new WaitForSeconds(0.2f);
  82.  
  83. while (true)
  84. {
  85. yield return wait;
  86. FindVisibleTarget();
  87. }
  88. }
  89.  
  90. private void OnDrawGizmos()
  91. {
  92. Gizmos.color = Color.white;
  93. UnityEditor.Handles.DrawWireDisc(transform.position, Vector3.forward, viewRadius);
  94.  
  95. Vector3 angle01 = DirectionFromAngle(-transform.eulerAngles.z, -viewAngle / 2);
  96. Vector3 angle02 = DirectionFromAngle(-transform.eulerAngles.z, viewAngle / 2);
  97.  
  98. Gizmos.color = Color.yellow;
  99. Gizmos.DrawLine(transform.position, transform.position + angle01 * viewRadius);
  100. Gizmos.DrawLine(transform.position, transform.position + angle02 * viewRadius);
  101.  
  102. if(canSee)
  103. {
  104. Gizmos.color = Color.green;
  105. Gizmos.DrawLine(transform.position, visibleTarget.transform.position);
  106. }
  107.  
  108. }
  109.  
  110. private Vector2 DirectionFromAngle(float eulerY, float angleInDegrees)
  111. {
  112. angleInDegrees += eulerY;
  113. return new Vector2(Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), Mathf.Cos(angleInDegrees * Mathf.Deg2Rad));
  114. }
  115.  
  116. // Update is called once per frame
  117. void Update()
  118. {
  119. if(canSee == true)
  120. {
  121. Debug.Log("Enemy Spotted!");
  122. soldier.patrol = false;
  123. soldier.rb.velocity = Vector2.zero;
  124. soldier.enemySighted = true;
  125. }
  126. else
  127. {
  128. soldier.patrol = true;
  129. soldier.enemySighted = false;
  130. }
  131.  
  132. if(soldier.dead)
  133. {
  134. Destroy(this);
  135. }
  136. }
  137. }
  138.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement