Noticias

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

Mejor manera para un script healthBar

Iniciado por joserico, Junio 06, 2016, 04:36:51 PM

Tema anterior - Siguiente tema
Por qué os liáis con una barra con scale y clamp. Utilizad un image con fill horizontal y asignarle un valor entre 0 y 1:
 
https://docs.unity3d.com/ScriptReference/UI.Image-fillAmount.html
 
Luego, no llames al script de morir desde el healthbar, que no tiene mucho sentido. El hb debería devolver el valor de cuánta health tiene y otro script llamar al "morir". O si quieres utiliza un delegate. 

Junio 07, 2016, 08:30:23 PM #16 Ultima modificación: Junio 07, 2016, 08:30:59 PM por joserico
Gracias @iRobb sé que mi cabeza no piensa como un programador sino como un diseñador y pensaba que era una buena solución :(


Al final he hecho lo que me has comentado en ambos scripts quedando algo así
 

float health = gameObject.GetComponent<HealthBar>().curHealth;
if (health <= 0)
{
    die();
}

 
Muchas gracias de verdad!

@pioj de buen rollo (como siempre) ... estare encantado de que me enseñes si algun dia vuelvo a nacer

Lo que te recomiendo hacer:
 
FÁCIL :  Utilizar SendMessage si te deja desde el tipo Component la parte fácil utilizar.
 
DIFÍCIL : Utilizar eventos.
 
Los eventos son algo muy útil, te recomiendo que aprendas a utilizarlos y que hagas mucho uso de los mismo.
 
¿Como lo harías?
 
Bien para crear un evento necesitamos de un delegado que el "Header" de nuestro evento.
 

public delegate void DelegateDie(GameObject obj);

 
y con este delegado creamos el evento.
 

public event DelegateDie EventDied;

 
¿Cómo se utilizar?
 
Los eventos tiene una forma muy simple de ser utilizados, podemos hacerlo de múltiples maneras, las mas comunes en la práctica son, funciones Lambda, Delegados Neutros, o métodos.
 

public class HealtBar : MonoBehaviour
{
private int _maxHealt = 100;
private int _currentHealt = 100;
public delegate void DelegateDie(GameObject obj);
public event DelegateDie EventDie;
public void ApplyDamage(int value)
{
   _currentHealt -= value;
   if(_currentHealt < 1)
        {   
             if(EventDie != null) EventDie(gameObject);
        }
}
}
public class Actor : MonoBehaviour
{
private HealtBar _healtBar = null;

    private void Start()
    {
   this._healtBar = GetComponent<HealtBar>();
        this._healtBar.EventDie += OnDie;  
    }
    public virtual void OnDie(GameObject obj)
    {
   print("Healt Bar nos informa que el Objeto "+obj.name+" Esta muerto");
    }
}

 
¿Se entiende?
 
Espero que sea de ayuda, si necesitas algo házmelo saber :)

Es mejor con eventos y delegates como dice @francoe1
 
Además el sendmessage creo que utiliza reflection internamente, por tanto añade sobrecarga.

Etiquetas: