61 lines
1.9 KiB
C#
61 lines
1.9 KiB
C#
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);
|
|
}
|
|
}
|