using System.Collections; using System.Collections.Generic; using UnityEngine; public class fieldOfView : MonoBehaviour { [SerializeField] private float viewRadius; [SerializeField] [Range(0, 360)] private float viewAngle; public Transform target; public LayerMask playerMask; public LayerMask obstacleMask; private void Update() { FindPlayer(); } void FindPlayer() { Collider[] targetInViewRadius = Physics.OverlapSphere(transform.position, viewRadius, playerMask); for (int i = 0; i < targetInViewRadius.Length; i++) { target = targetInViewRadius[i].transform; Vector3 dirToTarget = (target.position - transform.position).normalized; if (Vector3.Angle(transform.forward, dirToTarget) < viewAngle/2) { float distToTarget = Vector3.Distance(transform.position, target.position); if (!Physics.Raycast(transform.position,dirToTarget, distToTarget,obstacleMask)) { print( "enemy saw the target"); } } } } public Vector3 DirFromAngle(float angleInDegrees, bool angleIsGlobal) { if (!angleIsGlobal) { angleInDegrees += transform.eulerAngles.y; } return new Vector3(Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), 0 , Mathf.Cos(angleInDegrees * Mathf.Deg2Rad)); } private void OnDrawGizmos() { Gizmos.DrawWireSphere(transform.position, viewRadius); Vector3 viewAngleA = DirFromAngle(-viewAngle / 2, false); Vector3 viewAngleB = DirFromAngle(viewAngle / 2, false); Gizmos.DrawLine(transform.position, transform.position + viewAngleA * viewRadius); Gizmos.DrawLine(transform.position, transform.position + viewAngleB * viewRadius); Gizmos.DrawLine(transform.position, target.position); } }