Problema GetComponent en Unity 5

squa1o

Buenas, resulta que me estoy volviendo loco con un problema al que no encuentro solución por más que lo intento. Tengo un Enemigo con un Script llamado EnemyHealth donde guarda la vida que tiene. El player tira un raycast desde su arma y si golpea a un enemigo, accede al script EnemyHealth y llama a una función para quitarle vida. El script FUNCIONA y es el siguiente:

 if(Physics.Raycast (shootRay, out shootHit, range, shootableMask))
        {
            EnemyHealth enemyHealth = shootHit.collider.GetComponent <EnemyHealth> ();

        if(enemyHealth != null)
        {

            enemyHealth.TakeDamage (damagePerShot, shootHit.point);
		}

        
    }

Cuando disparo y les doy, les quito vida sin problemas. Mi problema viene cuando cojo ese mismo código y se lo pongo a una torreta en vez de al player, que el getcomponent me da null siempre. Con Debug.log he visto que el raycast de la torreta impacta correctamente sobre el enemigo pero no es capaz de acceder a su script, al contrario que el player.

A la desesperada he probado a hacer enemyHealth publica y arrastrar al enemigo manualmente a su casilla y con el player si me lo coge. Con la torreta en cambio, me deja soltarlo encima (no me sale el símbolo de prohibido) pero no lo acepta, en cuanto lo suelto desaparece. :psyduck:

Si alguno es capaz de ver qué es lo que falla tendrá mi gratitud eterna y mi primer hijo xD

Keldon

Primero deberías de cerciorarte de que el el componente EnemyHealth esta en el mismo objeto que el collider.

:ninjaedit: había dicho una barbaridad jajaja

1 respuesta
squa1o

#2 Sí que lo está, de hecho ese código con el mismo enemigo, en el player va y en la torreta no.

1 respuesta
YaW

Pon fotos de como tienes el enemigo y la torreta, su jerarquia y los componentes de cada elemento de la jerarquia. Así sin más datos es imposible saber donde está el error

1 2 respuestas
Keldon

#3 Asegurate de que el raycast impacta sobre el collider correcto, que puede ser que este impactando si, pero en otro collider que se te haya quedado dentro de esa torreta por despiste.

Por si acaso prueba a hacer esto, justo después de que se detecte el impacto del rayo pones

Debug.Log(ShootHit.collider.gameObject.name);

, debería de salir el mismo objecto que contiene tanto el collider como tu script.

Si sigue dandote ese error cambia esta linea

EnemyHealth enemyHealth = shootHit.collider.GetComponent <EnemyHealth> ( )

y pon

shootHit.collider.gameObject.GetComponent...etc

Si aun así sigues con el mismo error pon alguna captura como ha dicho #4 por que mas no se me ocurre.

1 respuesta
squa1o

#5 En #1 ya dije que he comprobado con debug.log que impacta en el enemigo correctamente, el problema es que no accede al scrip EnemyHealth no sé por qué :S Lo de meter "gameObject" después del collider no me ha funcionado, sigue haciendo lo mismo.

#4 Ahí van fotos de todo lo que creo que es "relevante":

YaW

En las fotos que has puesto no aparece por ningún lado el script EnemyHealth en la torreta, ni en el padre ni en el hijo

1 respuesta
squa1o

#7 Igual me explicado mal :S EnemyHealth lo tiene el enemigo, la torreta lo que intenta es acceder a él con el getcomponent en el script "TurretShooting" de "PiezasQueGiran"

1 respuesta
Keldon

#8 Insisto en lo mismo haz una captura con un debug que saque el nombre del objecto con el que impacta ese rayo.

En la primera imagen no se llega a ver en que capa tienes al objeto "enemigo", tiene que estar en la misma capa en la que lanzas el raycast, que en este caso es shootableMask o algo así.

Un consejo que te doy para futuros proyectos o incluso para este, es que dividas colliders por un lado, geometría por otro y estas dos cosas dentro de un padre que contenga el comportamiento de ese conjunto.

1 respuesta
squa1o

#9

Enemigo está en la capa Shootable, de todas formas creo que si el problema fuera de enemigo también se lo daría al player no? (el mismo código en el player funciona y en la torreta no)

Muchas gracias por vuestras respuestas hasta ahora!

Keldon

Pues la verdad es que es muy raro. He hecho una pequeña prueba por mi cuenta y no tengo ningún problema haciendo basicamente lo mismo.

Por probar yo probaría a borrar el objeto Enemigo completamente (incluso el prefabricado si tuviese) y lo crearía de nuevo por si acaso se le hubiese ido la cabeza a unity.

Y ya que estas de pruebas, antes de borrar nada pasa ese script a una esfera simple tal cual la creas con el collider con el que viene etc etc.

Hasta luego ya nos contaras.

1 respuesta
squa1o

#11 He probado a crear una esfera, meterle sólo los scripts necesarios para que se mueva y tenga vida, y un rigidbody para la colisión y pasa exactamente lo mismo, la torreta le dispara y el raycast le golpea correctamente pero no es capaz de pillar su componente EnemyHealth pero si le disparas con el player sí que funciona :cry: :cry: :cry: :cry: Estoy totalmente fuera de ideas xDD :(

YaW

Intenta simplificar el proyecto al máximo dejando solo lo necesario para reproducir el bug y sube el proyecto por aquí para que le echemos un vistazo, sin tenerlo delante y poder trastear es imposible saber lo qué puede estar pasando :/

Keldon

La verdad es que me parece muy raro. Prueba a poner un debug de la variable enemyHealth justo debajo de donde pusiste la anterior y mira a ver que te muestra por que ya te digo por mas que intento replicar el bug en mi proyecto no hay manera, me sale todo correcto y sin problemas.

squa1o

Ala, problema solucionado al volver a montar el proyecto desde 0 sin haber cambiado nada a priori :psyduck: Gracias Unity por ser tan especial ;(

Y gracias Yaw y Keldon por echar una mano! :D
(estas gracias son de verdad, no como las de unity :P)

1

Usuarios habituales

  • squa1o
  • Keldon
  • YaW