Advertisement
PedroArthurr

Untitled

Jul 3rd, 2020
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.84 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class DetectarPlayer : MonoBehaviour
  6. {
  7.     public Transform cabecaInimigo;
  8.     [Range(1, 500)]
  9.     public float distanciaDeVisao = 10;
  10.     [SerializeField] LayerMask layersPlayer = 2;
  11.     [Range(5, 180)]
  12.     [SerializeField] float anguloDeVisao = 120;
  13.     LayerMask layerObstaculos;
  14.     [SerializeField] bool desenharEsfera = true;
  15.     [SerializeField] bool desenharFov = false;
  16.  
  17.     public List<Transform> inimigosVisiveis = new List<Transform>();
  18.     List<Transform> listaTemporariaDeColisoes = new List<Transform>();
  19.    
  20.     void Start()
  21.     {
  22.         layerObstaculos = ~layersPlayer;
  23.     }
  24.     void Update()
  25.     {
  26.         Vision();
  27.     #if UNITY_EDITOR
  28.         if (desenharFov) { OnDrawGizmos(); }
  29.     #endif
  30.     }
  31.  
  32.     void Vision() {
  33.        
  34.             Collider[] alvosNoRaioDeAlcance = Physics.OverlapSphere(cabecaInimigo.position, distanciaDeVisao, layersPlayer);
  35.             foreach (Collider targetCollider in alvosNoRaioDeAlcance)
  36.             {
  37.                 Transform alvo = targetCollider.transform;
  38.                 Vector3 direcaoDoAlvo = (alvo.position - cabecaInimigo.position).normalized;
  39.                 if (Vector3.Angle(cabecaInimigo.forward, direcaoDoAlvo) < (anguloDeVisao / 2.0f))
  40.                 {
  41.                     float distanciaDoAlvo = Vector3.Distance(transform.position, alvo.position);
  42.                     if (!Physics.Raycast(cabecaInimigo.position, direcaoDoAlvo, distanciaDoAlvo, layerObstaculos))
  43.                     {
  44.                         if (!alvo.transform.IsChildOf(cabecaInimigo.root))
  45.                         {
  46.                             if (!listaTemporariaDeColisoes.Contains(alvo))
  47.                             {
  48.                                 listaTemporariaDeColisoes.Add(alvo);
  49.                             }
  50.                             if (!inimigosVisiveis.Contains(alvo))
  51.                             {
  52.                                 inimigosVisiveis.Add(alvo);
  53.                             }
  54.                         }
  55.                     }
  56.                 }
  57.             }
  58.             for (int x = 0; x < inimigosVisiveis.Count; x++)
  59.             {
  60.                 Debug.DrawLine(cabecaInimigo.position, inimigosVisiveis[x].position, Color.blue);
  61.             }
  62.        
  63.         //remove da lista inimigos que não estão visiveis
  64.         for (int x = 0; x < inimigosVisiveis.Count; x++)
  65.         {
  66.             if (!listaTemporariaDeColisoes.Contains(inimigosVisiveis[x]))
  67.             {
  68.                 inimigosVisiveis.Remove(inimigosVisiveis[x]);
  69.             }
  70.         }
  71.         listaTemporariaDeColisoes.Clear();
  72.     }
  73.  
  74.     #if UNITY_EDITOR
  75.     void OnDrawGizmos() {
  76.         if (desenharEsfera)
  77.         {
  78.             Gizmos.color = Color.white;
  79.             Gizmos.DrawWireSphere(cabecaInimigo.position, distanciaDeVisao);
  80.         }
  81.         Gizmos.color = Color.green;
  82.         float angleToRay1 = (180.0f - anguloDeVisao) * 0.5f;
  83.         float angleToRay2 = anguloDeVisao + (180.0f - anguloDeVisao) * 0.5f;
  84.         Vector3 rayDirection1 = Quaternion.AngleAxis(angleToRay1, cabecaInimigo.up) * (-transform.right);
  85.         Vector3 rayDirection2 = Quaternion.AngleAxis(angleToRay2, cabecaInimigo.up) * (-transform.right);
  86.         Gizmos.DrawRay(cabecaInimigo.position, rayDirection1 * distanciaDeVisao);
  87.         Gizmos.DrawRay(cabecaInimigo.position, rayDirection2 * distanciaDeVisao);
  88.         //
  89.         UnityEditor.Handles.color = Color.green;
  90.         float angle = Vector3.Angle(transform.forward, rayDirection1);
  91.         Vector3 pos = cabecaInimigo.position + (cabecaInimigo.forward * distanciaDeVisao * Mathf.Cos(angle * Mathf.Deg2Rad));
  92.         UnityEditor.Handles.DrawWireDisc(pos, cabecaInimigo.transform.forward, distanciaDeVisao * Mathf.Sin(angle * Mathf.Deg2Rad));
  93.  
  94.     }
  95.     #endif
  96.  
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement