Jump to content
Packobilly

ANSWERED SCRIPT DE BALA QUE DA DOLOR DE CABEZA...

Recommended Posts

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

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.

Edited by pioj
Alex, pls, acostúmbrate a usar el <> para pegar código...
  • Like 1

Share this post


Link to post
Share on other sites

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

  • Like 1

Share this post


Link to post
Share on other sites
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.

Edited by nomoregames
Marca como "solucionado"

Share this post


Link to post
Share on other sites

×
×
  • Create New...