Noticias

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

Get Enemigo más cercano

Iniciado por Doctor, Octubre 27, 2016, 12:39:12 AM

Tema anterior - Siguiente tema
Octubre 27, 2016, 12:39:12 AM Ultima modificación: Octubre 29, 2016, 06:38:27 PM por pioj
Veamos, esta vez traigo el propio ejemplo de docs, Unity3D..... Me salta este error, a pesar de que lo he copiado exactamente igual:
 



   
      BCE0022: Cannot convert 'UnityEngine.GameObject' to 'UnityEngine.GameObject[]'. (Error en el código de abajo en la línea 5)
   

[/quote]
 
Se supone que debería funcionar pero parece que no detecta el array como array, sino como un gameobject único ¿o me equivoco? ¿A alguien se le ocurre algo?
 
 
 

1    // Find the name of the closest enemy
2    function FindClosestEnemy () : GameObject {
3       // Find all game objects with tag Enemy
4        var gos : GameObject[];
5        gos = GameObject.FindGameObjectsWithTag("Enemy");
6        var closest : GameObject;
7        var distance = Mathf.Infinity;
8        var position = transform.position;
9        // Iterate through them and find the closest one
10        for (var go : GameObject in gos)  {
11            var diff = (go.transform.position - position);
12            var curDistance = diff.sqrMagnitude;
13            if (curDistance < distance) {
14                closest = go;
15                distance = curDistance;
16            }
17        }
18        return closest;    
19    }

 
 
 
 

no se si en javascript sera igual,pero puedes probar esto
 

gos = GameObject.FindGameObjectsWithTag("Enemy") as GameObject[];

 
A ver si hay suerte
 
 

Octubre 27, 2016, 01:12:19 AM #2 Ultima modificación: Octubre 29, 2016, 06:38:47 PM por pioj
Cita de: hammer date=1477522503no se si en javascript sera igual,pero puedes probar esto
   
   

gos = GameObject.FindGameObjectsWithTag("Enemy") as GameObject[];

   
      A ver si hay suerte
   
   
       
   


Bueno, ahora compilar compila, pero salta este error:
 



   
      NullReferenceException: Object reference not set to an instance of an object (En la línea 10 del código de arriba)
   

[/quote]
 
Y si ya antes estaba perdido, ahora lo estoy más. (Tengo en la escena 2 objetos con el tag "Enemy" y he comprobado que esté escrito de la misma forma)

Yo en C# pondría esto:
 

var gos = GameObject.FindGameObjectsWithTag("Enemy");
if(gos!=null)
{
foreach(var g in gos)
{
   g.transform.Translate(1, 1, 1); //por ejemplo
}
}

 
y por supuesto debugar. Mete un breakpoint y mira qué contiene la variable "gos" tras asignarle lo que devuelve FindGameObjectsWithTag()

Pues parece que este todo bien, como dice musaranya solo te queda poner Debug.Log ,prueba a ver si llega a entrar alguna vec en el for, mira la longitud del array con gos.length y  si hay algo dentro de cada posicion, a ver si consigues saber que esta pasando
 
 

Octubre 29, 2016, 03:52:10 PM #5 Ultima modificación: Octubre 29, 2016, 03:53:40 PM por Doctor
Siento no haber contestado antes pero apenas he tenido tiempo estos últimos días.
 
 
 
Exactamente al introducir "if(gos != null)" Compila y entra el juego y precisamente porque nada más empezar hace lo que se veía venir... Es decir, no hace nada, pilla el GameObject como null y al introducir el Debug.Log arroja un "Object reference not set to an instance of an object"... Raro porque sólo hay dos enemigos (GameObject) en el mapa y ambos tienen correctamente la etiqueta. Puedo solucionarlo saltándome esta parte y haciendo directamente un "var gos = GameObject.FindGameObjectWithTag("Enemy");" sin especificarlo como array, introduciendo una distancia mínima de ataque y hacer que actúe hacia el enemigo que más rabia le de... pero ya se ha vuelto algo personal ¬¬
 
 
 
Vamos, si hago que gos sea un array, GameObject = null...

Octubre 29, 2016, 04:44:44 PM #6 Ultima modificación: Octubre 29, 2016, 05:45:34 PM por Doctor
Acabo de idear otra forma, aunque sigo sin saber porqué coge el gameobject como null.... Esta nueva forma sería algo así:
 
¿Qué os parece? (Edito tras probarlo: Funciona perfectamente sin importar cuántos haya)
 

var Raizenemigos : Transform; //GameObject donde están agrupados todos los enemigos del área
function FindClosestEnemy() : Transform{  //Cambiado de GameObject a Transform
var closest : Transform; //Idem, cambiado a Transform
var distance = Mathf.Infinity;
var position = transform.position;
for(var child : Transform in Raizenemigos)
{
if(child.tag == "Enemy") //Sólo el GameObject principal de cada enemigo tiene esta etiqueta para no confundir
   {
   Debug.Log(child.name); //Ahora si devuelve cada uno de ellos
                //Y aquí el resto del script para verificar distancias
               var diff = (child.position - position);
               var curDistance = diff.sqrMagnitude;
               if (curDistance < distance) {
                   closest = child; //Entonces child es el más cercano
                   distance = curDistance;
                  }
   }
}
return closest;
}

 
 

Etiquetas: