Jump to content
UnitySpain
Sign in to follow this  
Doctor

Problema Object reference not set

Recommended Posts

Buenas a todos, después de ir solucionando varios problemas, me he topado con este. En este caso es un puntero hacia donde apuntar, de manera que si este se mueve, el proyectil le siga, pero nada más empezar ya he tenido problemas, ya que lo fácil sería poner una variable gameobject donde colocar el gameobject "Puntero" pero el prefab Proyectil no me deja colocar ningún gameobject ni transform en la casilla del inspector tras crear la variable (debe ser prefab para poder clonarlo luego al disparar) ... así que he tratado de buscar el objeto puntero una vez se desencadena el script, pero aquí salta el problema, ya que me dice: NullReferenceException: Object reference not set to an instance of an object Proyectil.Update () (at Assets/_Resources/Scripts/Proyectil.js:77)

Gracias de antemano.

var objVel : int = 10; //velocidad


if(Sigue == true)
	{
		var Pg = GameObject.FindWithTag("Punterolaser");  //el gameobject, tambien he intentado buscarlo con Find directamente (mismo resultado)
    	var Objetivo : Transform = Pg.transform;  //esta es la línea 77 donde sale el error
    	var Distancia = Vector3.Distance (transform.position , Objetivo.position);
    	if(Distancia != DistanciaExplota)
    		{

    		var Haciaobj : Vector3 = Objetivo.position - transform.position;
    		transform.LookAt(Objetivo);
    		transform.Translate(Haciaobj * objVel * Time.deltaTime);

    		}
    	else           
    		{
    		Instantiate(explosion, transform.position, Quaternion.identity);
    		DestroyProyectil();
    		}
    }

 

Edited by pioj
uso de tags y normas del foro

Share this post


Link to post
Share on other sites

Comprueba que el Gameobject que buscas tenga el Tag "Punterolaser" (o en si usas Find que tenga el nombre que le pasas como parametro), comprueba que este activo cuando llamas a FindWithTag, si no esta activo no lo encuentra y comprueba que este en la escena cuando llamas a FindWithTag, por si es un objeto que creas de forma dinámica. Si nos das mas información (como una captura de pantalla en el momento de la ejecución) te podremos ayudar mejor.

Share this post


Link to post
Share on other sites

Hola Esr,

Hasta ayer no tuve tiempo de volver a mirar el código y tras dejar de pensar en él un tiempo pude ver que el objeto estaba inactivo por otra parte del script y me había olvidado de volverlo a activar, aún así solucionado ese paso el misil no seguía al puntero laser, así que lo modifiqué como paso a poner más abajo aunque el problema ahora es que parece que no coloca la explosión cuando está cerca así que se pone a dar vueltas alrededor del objeto. He tratado de solucionarlo colocando un evento OnCollisionEnter... pero me extraña mucho que no llegue nunca al else if(Distancia <= DistanciaExplota)...

 

//Cambiadas algunas variables, rehice una parte.


if(Sigue == true)
	{
		var Pg = GameObject.FindWithTag("Punterolaser"); 
    	var Objetivo : Transform = Pg.transform;  //Solucionado... Pg como Objeto inactivo.
    	var Distancia = Vector3.Distance (transform.position , Objetivo.position);
    	if(Distancia > DistanciaExplota) 
    		{
			transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Objetivo.position - transform.position), rotationSpeed*Time.deltaTime);
    		transform.position += transform.forward * moveSpeed * Time.deltaTime;
			//Ahora si funciona aquí. Por si acaso probé a hacer un Do While, pero lo bloquea todo
    		}
    	else //No se da este estamento.          
    		{
    		Instantiate(explosion, transform.position, Quaternion.identity);
    		DestroyProyectil();
    		}
    }
//Solución de parcheo: Creado un OnCollisionEnter para instanciar la explosión cuando toque lo que sea.

 

Share this post


Link to post
Share on other sites

Si lo has arreglado con un OnCollisionEnter no tendrás problema, pero la forma en el que yo solucionaría eso seria poniendo un Debug.Log justo antes del if que muestre el valor de distancia y el de distanciaExplota. Puede ser que distancia explota sea un valor demasiado pequeño y nunca llegue a entrar por el else. 

Share this post


Link to post
Share on other sites

Pues voy a echarle un vistazo con el Debug y te diré, porque funcionar funciona ya, pero me ha dejado extrañado.

EDITO: Acabo de probarlo y el valor más pequeño que me ha devuelto de Distancia es 0.9

 

Edited by Doctor

Share this post


Link to post
Share on other sites

El valor lo he cambiado entre 0 y 10 varias veces ya a la desesperada, pero creo que en este caso no ha sido un problema del script sino algún fallo raro, porque este script va en el misil (prefab), he duplicado el prefab y sólo he cambiado el nombre de misil por misil2.... sin tocar nada más... y ya funciona al acercarse a la distancia que quiera sin usar el colissionenter... vamos, que el script no era...

Share this post


Link to post
Share on other sites

Hola, podrias subir la funcion DestroyProyectil()? Una vez me pasaba algo asi pero era porque la explosion se encontraba enparentada con el proyectil, entonces al destruirlo tambien desaparecia.

 

Esto ponelo en Start(), no hay necesidad de hacerlo en cada cuadro, ahora si el "Objetivo" va cambiando retiro lo dicho

var Pg = GameObject.FindWithTag("Punterolaser"); 
var Objetivo : Transform = Pg.transform;  

Share this post


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

×
×
  • Create New...