Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Temas recientes

respawnear al morir?

Iniciado por Lucky-chan, Abril 03, 2019, 08:01:02 PM

Tema anterior - Siguiente tema
Buenos días a tod@s, hoy tengo otro problema, he estado varios días investigando y buscando pero no he logrado hacer que esta "funcion(?)" funcione (valga la redundancia) es algo básico creo, simplemente un "Level Manager" que controla los checkpoints y la muerte del personaje, luego los checkpoints que simplemente se encargan de ajustar la nueva posición de resurrección, básicamente lo que sucede es que no he encontrado como hacer que cuando la "HP" llegue a 0 el pj muera, pero por la mala forma en que construí el sistema del HP hace que desconozca como llamar la float en la sección que necesito, aquí los scripts y como siempre gracias por la ayuda.
 

   void Update()
    {
        if (HPBar.getHP/.HP == 0)//aqui es donde intento conseguir la FLoat
        {
            LevelManager.RespawnPlayer();
        }


  // esta es toda la script de la barra de HP, básicamente todo el tema del Hp lo manejo por esta script que va a la barra
Slider Barra;
    public LevelManager levelManager;
    private float MaxHP = 3f;
    private float Hp;
    public bool Dead;
    public GameObject player;
    // Start is called before the first frame update
    void Awake()
    {
        levelManager = FindObjectOfType<LevelManager>();
        Barra = GetComponent<Slider>();
    }
    public void Start()
    {
        Barra.maxValue = MaxHP;
        Barra.value = MaxHP;
    }
    // Update is called once per frame
    public void update()
    {
        Barra.value = Hp;
    }
    public void TakeDamage(float amount)
    {
        Barra.value = Mathf.Clamp(Barra.value-amount, 0f, MaxHP);
        if (Barra.value == 0)
        {
            StartCoroutine(Espera());
            levelManager.RespawnPlayer();
            Hp += 3f;
        }
    }
    IEnumerator Espera()
    {
        yield return new WaitForSeconds(2);
    }
}


//esta es la script del Level manager
public GameObject ChekkuPointo;
    public GameObject Player;
 
    public void RespawnPlayer()
    {
        Player.transform.position = ChekkuPointo.transform.position;
    }
}

 
como siempre estoy segura que se logra de manera estúpidamente fácil pero no lo logro 

Hola,
 
 
 
yo soy novato en Unity, y muy bien no se lo que estas haciendo pero... Visto como programador, te lanzo esta pregunta.
 
 
 
Puede ser que el primer if de todos no se cumpla nunca?? Es decir que si tu tienes vida (me lo invento) 10 y te quitan 11 el HP sera  -1 no 0 ya no entra en ese IF.
 
No se si puede ser por eso pero si no controlas eso en ningún lado puede que vayan por ahí los tiros.
 
Saludos!

Cita de: TrikerLh date=1554500201Hola,
   
   
       
   
   
      yo soy novato en Unity, y muy bien no se lo que estas haciendo pero... Visto como programador, te lanzo esta pregunta.
   
   
       
   
   
      Puede ser que el primer if de todos no se cumpla nunca?? Es decir que si tu tienes vida (me lo invento) 10 y te quitan 11 el HP sera  -1 no 0 ya no entra en ese IF.
   
   
      No se si puede ser por eso pero si no controlas eso en ningún lado puede que vayan por ahí los tiros.
   
   
      Saludos!
   


Gracias veré si es eso

Cita de: Lucky-chan date=1554314462if (HPBar.getHP/.HP == 0)//aqui es donde intento conseguir la FLoat
   


Este IF es una cerdada, es verdad... Además es muy difícil que un valor float sea "0 puro", siempre se acaba quedando con algún decimal...
 
Hay un truco para asegurar que se cumpla más veces, y es usando el Mathf.Approximately(valor1,valor2). Pruébalo...

Cita de: pioj date=1554918149Mathf.Approximately
   


No conocía ese método, supuestamente compara con Epsilon, yo tenía algo así ( si tolerancia = Epsilon queda igual):
 

public static class Utilities
{
public static bool isCloseTo(Vector3 input, Vector3 target, float tolerance)
{
   return Vector3.Distance(input, target) <= tolerance;
}
public static bool isCloseTo(float input, float target, float tolerance)
{
   return Mathf.Abs(target - input) <= tolerance;
}
}

 
 

Cita de: pioj date=1554918149Este IF es una cerdada, es verdad... Además es muy difícil que un valor float sea "0 puro", siempre se acaba quedando con algún decimal...
   
   
      Hay un truco para asegurar que se cumpla más veces, y es usando el Mathf.Approximately(valor1,valor2). Pruébalo...
   


Si bien la condición para comprar flotantes no está bien formulada, anterior a esta declaración tiene un Clamp, por lo que debería funcionar siempre y cuando la salud disminuya a un valor negativo.

La programación no es mi fuerte pero con un:
 

if (HPBar.getHP/.HP <= 0)

 
¿No debería valer?
 
 
 
saludos
 
 
 
P.D: He conseguido poder ver el foro desde el curro así que me vereis más por aquí, jeje

Etiquetas: