update small
This commit is contained in:
52
Assets/Scripts/AI NPC/FieldOfView.cs
Normal file
52
Assets/Scripts/AI NPC/FieldOfView.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user