mocha01

FOV

Apr 21st, 2022
1,010
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.00 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class FieldOfView : MonoBehaviour
  6. {
  7.  
  8.     public float fov = 360f;
  9.     public int numAristas = 360;
  10.     public float anguloInicial = 0;
  11.     public float distanciaVision = 8f;
  12.     public LayerMask layerMask;
  13.  
  14.     private Mesh mesh;
  15.     private Vector3 origen;
  16.     private Camera currentCamera;
  17.     private void Start()
  18.     {
  19.         currentCamera = Camera.main;
  20.         mesh = new Mesh();
  21.         GetComponent<MeshFilter>().mesh = mesh;
  22.         origen = Vector3.zero;
  23.     }
  24.  
  25.     private void LateUpdate()
  26.     {
  27.         UpdateMesh();
  28.     }
  29.  
  30.     private void GenerarMesh()
  31.     {
  32.  
  33.         Vector3[] vertices;
  34.         int[] triangles;
  35.  
  36.         vertices = new Vector3[]
  37.         {
  38.             new Vector3 (0,0,0),
  39.             new Vector3 (1,0,0),
  40.             new Vector3 (0,-1,0)
  41.         };
  42.  
  43.         triangles = new int[] {
  44.             0, 1, 2
  45.         };
  46.  
  47.         mesh.vertices = vertices;
  48.         mesh.triangles = triangles;
  49.  
  50.     }
  51.  
  52.     private void UpdateMesh()
  53.     {
  54.         float anguloActual = anguloInicial;
  55.         float incrementoAngulo = fov / numAristas;
  56.  
  57.         Vector3[] vertices = new Vector3[numAristas + 1];
  58.         int[] triangulos = new int[numAristas * 3];
  59.  
  60.         vertices[0] = transform.localPosition;
  61.  
  62.         int indiceVertices = 1;
  63.         int indiceTriangulos = 0;
  64.  
  65.         for (int i = 0; i < numAristas; i++)
  66.         {
  67.             Vector3 verticeActual;
  68.             RaycastHit2D raycastHit2D = Physics2D.Raycast(origen, GetVectorFromAngle(anguloActual), distanciaVision, layerMask);
  69.            
  70.             if (raycastHit2D.collider == null)
  71.             {
  72.                 // No hit
  73.                 verticeActual = transform.localPosition + GetVectorFromAngle(anguloActual) * distanciaVision;
  74.             }
  75.             else
  76.             {
  77.                 // Hit object
  78.                 verticeActual = currentCamera.transform.InverseTransformPoint(raycastHit2D.point);
  79.             }
  80.  
  81.             vertices[indiceVertices] = verticeActual;
  82.  
  83.             if (i > 0)
  84.             {
  85.                 triangulos[indiceTriangulos + 0] = 0;
  86.                 triangulos[indiceTriangulos + 1] = indiceVertices - 1;
  87.                 triangulos[indiceTriangulos + 2] = indiceVertices;
  88.  
  89.                 indiceTriangulos += 3;
  90.             }
  91.  
  92.             indiceVertices++;
  93.             anguloActual -= incrementoAngulo;
  94.         }
  95.  
  96.         // Formamos el último triángulo
  97.         triangulos[indiceTriangulos + 0] = 0;
  98.         triangulos[indiceTriangulos + 1] = indiceVertices - 1;
  99.         triangulos[indiceTriangulos + 2] = 1;
  100.  
  101.  
  102.         mesh.vertices = vertices;
  103.         mesh.triangles = triangulos;
  104.     }
  105.  
  106.     Vector3 GetVectorFromAngle(float angle)
  107.     {
  108.         float angleRad = angle * (Mathf.PI / 180f);
  109.         return new Vector3(Mathf.Cos(angleRad), Mathf.Sin(angleRad));
  110.     }
  111.  
  112.     public void SetOrigin(Vector3 newOrigin)
  113.     {
  114.         origen = newOrigin;
  115.     }
  116. }
Advertisement
Add Comment
Please, Sign In to add comment