Packobilly 6 Report post Posted January 20, 2020 Buenas tardes. Tengo un objeto bala, que hace un spawn en el spawnpoint del player colocado a tal efecto. Al probar el juego, y antes de morir el player, todo va bien; esto es, la bala se instancia en el sitio correcto, con su velocidad correcta, y desaparece al transcurrir el lifetime. Una vez que el player muere, cambia el tag de player a untagged, para evitar que los enemigos sigan interaccionando con él; hago un fundido de pantalla y reaparece en el spawnpoint al comienzo del nivel, recuperando su tag de player de nuevo. Todo bien. El problema es que ahora (tras el respawning), al disparar la bala queda paralizada en el aire, y en consola aparece el mensaje (tan común a veces, pero esta vez no doy con la tecla): "NullReferenceException: Object reference not set to an instance of an object. Bullet_Manager. Update()...cs:25" La línea 25 es la del if (player.faceRight && !player.verticalLook)... y el caso es que si quito esta línea, el error me lo vuelve a dar (tras morir el player, claro) en el siguiente if. Sé que está complicado, pero si alguien arrojase un atisbo de luz para continuar el proyecto, estaría eternamente agradecido. Gracias de antemano! public class Bullet_Manager : MonoBehaviour { public float speed; public float lifeTime; Rigidbody2D rb; public GameObject impactPrefab; public int damageValue = 1; PlayerController player; void Start() { rb = GetComponent<Rigidbody2D>(); player = GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerController>(); if (player.faceRight && !player.verticalLook) { rb.velocity = new Vector2(speed, rb.velocity.y); } else if (!player.faceRight && !player.verticalLook) { rb.velocity = new Vector2(-speed, rb.velocity.y); Vector3 bulletScale = transform.localScale; bulletScale.x *= -1; transform.localScale = bulletScale; } else if (player.faceRight && player.verticalLook || !player.faceRight && player.verticalLook) { rb.velocity = new Vector2(rb.velocity.x, speed); transform.Rotate(new Vector3(0f, 0f, 90f)); } Destroy(gameObject, lifeTime); } private void OnTriggerEnter2D(Collider2D col) { Instantiate(impactPrefab, transform.position, Quaternion.identity); Destroy(gameObject); } } Share this post Link to post Share on other sites
Alex 43 Report post Posted January 20, 2020 Ahora estoy ocupado y no puedo ver el código muy bien pero, creo que es porque tu script se ejecuta en start (Eso del player =...) Y como dices, tu jugador cambia de tag, puede que este dando el error porque al iniciar el void Start la supuesta linea de "player =.." queda nula porque aún no se a encontrado al "Player". Te recomiendo omitir eso de cambiar el tag en tu script, si estas usando colliders y tienes algo como esto: if (collision = GameObject.tag("Player")) { *Codigo.......* } //Agrega un Else para que no te aviente el error de los enemigos en la consola. else { //Si esta parte está vacía, no te saldrá un error. //Puedes usar un: Debug.Log("no encuentro al jugador"); //Para que te salte el mensaje en la consola } Como te digo, no puedo darte un respuesta clara ahora, pero tu error puede ser por lo del tag. Share this post Link to post Share on other sites
Igor 336 Report post Posted January 20, 2020 la bala da dolor de cabeza.... si le disparas en la cabeza? y si disparas a la pierna da cojera? jeje ahora en serio: seguramente es que la variable "player" que "buscas" en la funcion "Start", despues del cambio de "tag" es "null", osea, que la funcion "FindGameObjectaWithTag no encuentra el objeto en cuestion. asegurate que despues del respawn el player recupera su tag correctamente. puedes poner esto despues del FindGameObjectWithTag para ver si el gameObject es "null" if (player == null) { Debug.Log("objeto nulo"); } si sale el mensaje en la consola significa que el objeto no ha sido encontrado, y segurente es por el cambio de tag Share this post Link to post Share on other sites
Packobilly 6 Report post Posted January 21, 2020 19 hours ago, Igor said: la bala da dolor de cabeza.... si le disparas en la cabeza? y si disparas a la pierna da cojera? jeje Ja, ja ja! Solucionado, señores. Creando un layer de no colisión para el player, se consigue el mismo efecto sin tener que modificar el tag al morir. De esta forma, la bala no pierde la cabeza. Gracias a este foro, y sobre todo a gente como vosotros, podemos seguir aprendiendo. Share this post Link to post Share on other sites