Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

crear un rango de visión para hacer visible objeto en Unity2D

Iniciado por Ness, Agosto 22, 2016, 05:32:33 AM

Tema anterior - Siguiente tema
Agosto 22, 2016, 05:32:33 AM Ultima modificación: Agosto 22, 2016, 06:51:14 AM por nestorjaviersolera
Necesito que mi jugador tenga un rango de visión limitado a  lo que tenga al frente y que solo sea visible si no hay un obstáculo delante, he probado con el uso de raycasting pero no se como calcular las esquinas.
 
Como con este tutorial:
 
http://www.redblobgames.com/articles/visibility/
 
 



   
eature=oembed" width="480">

 
 

Agosto 22, 2016, 04:09:31 PM #2 Ultima modificación: Agosto 23, 2016, 12:10:49 AM por Ness_ID
Cita de: GSG3D date=1471862135

      
         
eature=oembed" width="480">
      
   
   
       
   


 
 
del tutorial que pasaste he tratado de adaptarlo para que funcione son boxCollider2d o las de fisicas de 2D pero no me  ha  dado resultados, no me detecta los objetos que no sea en 3D.
 
 
 
 
 
este scrtip va en el objeto jugador
 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class FieldOfView : MonoBehaviour
{
    public float viweRadius;
    [Range(,360)]
    public float viweAngle;
    public LayerMask targerMask;
    public LayerMask obstaclemask;
 
    public Vector3 prueba1;
    public Vector3 prueba2;
    [HideInInspector]
    public List<Transform> visibleTargets = new List<Transform>();
    void Start()
    {
        StartCoroutine("FindTargetsWithDelay", 2f);
    }
    IEnumerator FindTargetsWithDelay(float delay)
    {
        while (true)
        {
            yield return new WaitForSeconds(delay);
            findVisibletargets();
        }
    }
    void findVisibletargets()
    {
        visibleTargets.Clear();
        Collider[] targetsInViewRadius = Physics.OverlapSphere(transform.position, viweRadius, targerMask);
        for (int i = ; i < targetsInViewRadius.Length; i++)
        {
            Transform target = targetsInViewRadius[i].transform;
            Vector3 dirToTarget = (target.position - transform.position).normalized;
            if (Vector3.Angle(transform.forward, dirToTarget) < viweAngle / 2)
            {
                float distotarget = Vector3.Distance(transform.position, target.position);
                if (!Physics2D.Raycast(transform.position, dirToTarget, distotarget, obstaclemask)) {
                    visibleTargets.Add(target);
                }
            }
        }
    }
 
    public Vector3 DirFromAngle(float AngleInDegrees, bool angleIsGlobal)
    {
        if (!angleIsGlobal)
        {
            AngleInDegrees += transform.eulerAngles.y;
        }
        return new Vector3(Mathf.Sin(AngleInDegrees *  Mathf.Deg2Rad),, Mathf.Cos(AngleInDegrees * Mathf.Deg2Rad));
    }
}

 
editor:
 

using UnityEngine;
using System.Collections;
using Unit***itor;
[CustomEditor (typeof(FieldOfView))]
public class FieldOfViewEditor : Editor {
    void OnSceneGUI()
    {
        FieldOfView fow = (FieldOfView)target;
        Handles.color = Color.white;
        Handles.DrawWireArc(fow.transform.position,new Vector3(0,1,0) , new Vector3(1,0,0), 360, fow.viweRadius);
        Vector3 viwerAngleA = fow.DirFromAngle(-fow.viweAngle/ 2, false);
        Vector3 viwerAngleB = fow.DirFromAngle(fow.viweAngle / 2, false);
        Handles.DrawLine(fow.transform.position, fow.transform.position +viwerAngleA * fow.viweRadius);
        Handles.DrawLine(fow.transform.position, fow.transform.position +viwerAngleB * fow.viweRadius);
        Handles.color = Color.red;
        foreach (Transform visibleTarger in fow.visibleTargets)
        {
            Handles.DrawLine(fow.transform.position, visibleTarger.position);
        }
    }
}

 
Dejo en el adjunto un el archivo que he estado trabajando.
 
//www.unityspain.com/applications/core/interface/file/attachment.php?id=9812" data-fileid="9812" rel="">ejemplo.rar

Agosto 23, 2016, 05:57:26 AM #3 Ultima modificación: Agosto 23, 2016, 07:17:48 PM por Ness
Este scritp lo probe   funciona pero solo como el anterior en unity3D:
 
 
 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public class FOV2DEyes : MonoBehaviour
{
public bool raysGizmosEnabled;
//public float updateRate = 0.02f;
public int quality = 4;
public int fovAngle = 90;
public float fovMaxDistance = 15;
public LayerMask cullingMask;
public List<RaycastHit> hits = new List<RaycastHit>();

int numRays;
float currentAngle;
Vector3 direction;
RaycastHit hit;

void Update()
{
   CastRays();
}

void Start()
{
   //InvokeRepeating("CastRays", 0, updateRate);
}

void CastRays()
{
   numRays = fovAngle * quality;
   currentAngle = fovAngle / -2;
   
   hits.Clear();
   
   for (int i = 0; i < numRays; i++)
   {
      direction = Quaternion.AngleAxis(currentAngle, transform.up) * transform.forward;
      hit = new RaycastHit();
      
      if(Physics.Raycast(transform.position, direction, out hit, fovMaxDistance, cullingMask) == false)
      {
         hit.point = transform.position + (direction * fovMaxDistance);
      }
      
      hits.Add(hit);
      currentAngle += 1f / quality;
   }
}

void OnDrawGizmosSelected()
{
   Gizmos.color = Color.cyan;
   
   if (raysGizmosEnabled && hits.Count() > 0)
   {
      foreach (RaycastHit hit in hits)
      {
         Gizmos.DrawSphere(hit.point, 0.04f);
         Gizmos.DrawLine(transform.position, hit.point);
      }
   }
}

}

 
 
 
van Juntos los Dos en el mismo objeto.
 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[RequireComponent(typeof(FOV2DEyes))]
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class FOV2DVisionCone : MonoBehaviour
{
public enum Status
{
   Idle,
   Su***ious,  
   Alert
}
public Status status;
public List<Material> materials;

Vector3[] newVertices;
    Vector2[] newUV;
    int[] newTriangles;
Mesh mesh;
MeshRenderer meshRenderer;
FOV2DEyes eyes;
List<RaycastHit> hits;
int i;
int v;

    void Start()
{      
   mesh = GetComponent<MeshFilter>().mesh;
   meshRenderer = GetComponent<MeshRenderer>();
   eyes = gameObject.GetComponent<FOV2DEyes>();
   
   meshRenderer.material = materials[0];
    }

void LateUpdate()
{
   UpdateMesh();
   
   UpdateMeshMaterial();
}

void UpdateMesh()
{
   hits = eyes.hits;
   
   if (hits == null || hits.Count == 0)
      return;
   
   if (mesh.vertices.Length != hits.Count + 1)
   {
      mesh.Clear();
      newVertices = new Vector3[hits.Count + 1];
      newTriangles = new int[(hits.Count - 1) * 3];
      
      i = 0;
      v = 1;
      while (i < newTriangles.Length)
      {
         if ((i % 3) == 0)
         {
            newTriangles = 0;
            newTriangles[i + 1] = v;
            newTriangles[i + 2] = v + 1;
            v++;
         }
         i++;
      }
   }
   
   newVertices[0] = Vector3.zero;
   for (i = 1; i <= hits.Count; i++)
   {
      newVertices = transform.InverseTransformPoint(hits[i-1].point);
   }
   newUV = new Vector2[newVertices.Length];
   i = 0;
        while (i < newUV.Length) {
            newUV = new Vector2(newVertices.x, newVertices.z);
            i++;
        }
   
        mesh.vertices = newVertices;
        mesh.triangles = newTriangles;
   mesh.uv = newUV;
   
   mesh.RecalculateNormals();
   mesh.RecalculateBounds();
}

void UpdateMeshMaterial()
{   
   for (i = 0; i < materials.Count; i++)
   {
      if (i == (int) status && meshRenderer.material != materials)
      {
         meshRenderer.material = materials;
      }
   }
}
}

 
 

investigando un  poco por internet me encontre con este  material ya averigüe es completamente gratis y open source, esta muy genial me sirve completamente para lo que necesito.
 
 
 
https://github.com/f15gdsy/2D-Light-of-Sight-Unity
 
 
 
http://forum.unity3d.com/threads/light-of-sight-2d-dynamic-lighting-open-source.295968/
 
 
 
autor:  f15gdsy y  gamer_woods.

Etiquetas: