AI có tầm nhìn (Field of View)
C# Code
using UnityEngine;
using System.Collections;
public class AIFieldOfView : MonoBehaviour
{
public float viewRadius = 10f;
[Range(0, 360)]
public float viewAngle = 90f;
public LayerMask targetMask; // Layer của Player
public LayerMask obstacleMask; // Layer của các vật cản (tường, cột,...)
[HideInInspector]
public Transform visibleTarget;
void Update()
{
FindVisibleTargets();
}
void FindVisibleTargets()
{
visibleTarget = null;
Collider[] targetsInViewRadius = Physics.OverlapSphere(transform.position, viewRadius, targetMask);
for (int i = 0; i < targetsInViewRadius.Length; i++)
{
Transform target = targetsInViewRadius[i].transform;
Vector3 dirToTarget = (target.position - transform.position).normalized;
// Kiểm tra xem mục tiêu có nằm trong góc nhìn không
if (Vector3.Angle(transform.forward, dirToTarget) < viewAngle / 2)
{
float dstToTarget = Vector3.Distance(transform.position, target.position);
// Kiểm tra xem có vật cản nào giữa AI và mục tiêu không
if (!Physics.Raycast(transform.position, dirToTarget, dstToTarget, obstacleMask))
{
visibleTarget = target; // Nhìn thấy mục tiêu
Debug.Log("Player spotted!");
return;
}
}
}
}
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));
}
}AI chỉ có thể 'nhìn thấy' và phát hiện người chơi nếu họ nằm trong một hình nón phía trước mặt nó. Hữu ích cho các game stealth.