Jump to content
UnitySpain
Sign in to follow this  
Doctor

Get Enemigo más cercano

Recommended Posts

Veamos, esta vez traigo el propio ejemplo de docs, Unity3D..... Me salta este error, a pesar de que lo he copiado exactamente igual:

Cita

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

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    }

 

 

Share this post


Link to post
Share on other sites

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

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

A ver si hay suerte

 

Share this post


Link to post
Share on other sites
On 26/10/2016 at 0:55, hammer said:

no 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:

Cita

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

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)

Share this post


Link to post
Share on other sites

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()

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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...

Edited by Doctor

Share this post


Link to post
Share on other sites

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;
}

 

Edited by Doctor

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...