52 lines
1.6 KiB
C#
52 lines
1.6 KiB
C#
|
|
using System.Collections;
|
||
|
|
using UnityEngine;
|
||
|
|
|
||
|
|
public class FieldOfView : MonoBehaviour
|
||
|
|
{
|
||
|
|
[Range(0, 360)]
|
||
|
|
public float viewAngle = 90f;
|
||
|
|
public float viewRadius = 20f;
|
||
|
|
public LayerMask obstacleLayerMask;
|
||
|
|
public LayerMask targetLayerMask;
|
||
|
|
|
||
|
|
[HideInInspector] public bool canSeePlayer = false;
|
||
|
|
[HideInInspector] public Vector3 lastKnownPlayerPosition;
|
||
|
|
|
||
|
|
void Start()
|
||
|
|
{
|
||
|
|
StartCoroutine(FindTargetWithDelay(0.1f));
|
||
|
|
}
|
||
|
|
|
||
|
|
IEnumerator FindTargetWithDelay(float delay)
|
||
|
|
{
|
||
|
|
while (true)
|
||
|
|
{
|
||
|
|
yield return new WaitForSeconds(delay);
|
||
|
|
FindVisibleTargets();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private void FindVisibleTargets()
|
||
|
|
{
|
||
|
|
canSeePlayer = false;
|
||
|
|
var colliders = Physics.OverlapSphere(transform.position, viewRadius, targetLayerMask);
|
||
|
|
|
||
|
|
for (int i = 0; i < colliders.Length; i++)
|
||
|
|
{
|
||
|
|
var target = colliders[i].transform;
|
||
|
|
var direction = (target.position - transform.position).normalized;
|
||
|
|
var angle = Vector3.Angle(transform.forward, direction);
|
||
|
|
|
||
|
|
if (angle < viewAngle / 2)
|
||
|
|
{
|
||
|
|
float distanceToTarget = Vector3.Distance(transform.position, target.position);
|
||
|
|
if (!Physics.Raycast(transform.position, direction, distanceToTarget, obstacleLayerMask))
|
||
|
|
{
|
||
|
|
canSeePlayer = true;
|
||
|
|
lastKnownPlayerPosition = target.position;
|
||
|
|
Debug.DrawLine(transform.position, target.position, Color.blue, 1f);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|