Jump to content
UnitySpain
Sign in to follow this  
aliciamartinez

Vidas en Unity

Recommended Posts

No estaría mal que indicaras que es un tutorial para explicar cómo haces las vidas en tu juego...

Gracias por el aporte!

Share this post


Link to post
Share on other sites

@aliciamartinez espero ser constructivo en mi respuesta, vi el "tutorial" de principio a fin, y la verdad es que es un nivel bastante principiante pero noto el interés de intentar aprender.

1º Las lógicas de los componentes tienen que ser objetivas, nunca debes mezclar la lógica del jugador con la interfaz de usuario.

2º La escritura debe ser parecida a las convenciones más conocidas, para obtener una mejor calidad de código, para esto existen convenciones de diseño, de lógica, etc.

3º Tienes que ponerte siempre como meta que un sistema funcional es aquel que no requiere de estar modificando el código para que siga funcionando, en tu caso, cada vez que quieras agregar un corazón vas a tener que volver a crear toda la lógica nuevamente.

4º Busca y lee sobre implementaciones o técnicas para casos simples de videojuegos que te serán de mucha ayuda.

 

Te muestro mas o menos como lo haría.
 - La lógica -

public class HeartControl : MonoBehaviour
{
    [SerializeField]
    private int _health = 3;
    public int Health { get { return _health; } }

    public event Action<int> EventChange = delegate { };

    public void TakeDamage()
    {
        _health -= 1;
        EventChange.Invoke(_health);
    }
}

- El controlador para UI -

public class HeartUIControl : MonoBehaviour
{
    [SerializeField]
    private HeartControl _heartControl = null;
    private List<HeartUIElement> _hearts = new List<HeartUIElement>();

    private void Awake()
    {
        _hearts.AddRange(transform.GetComponentInChildrens<HeartUIElement>());
    }

    private void Start()
    {
        Show(_heartControl.Health);
        _heartControl.EventChange += Show;
    }

    public void Show(int length)
    {
        int count = 0;
        _hearts.ForEach(x =>
        {
            if(count < length)
                x.Show();
            else
                x.Hide();                
            count ++:
        });
    }
}

public class HeartUIElement : MonoBehaviour
{
    protected CanvasGroup _cg { get; set; }

    private void Awake()
    {
        _cg = GetComponent<CanvasGroup>();
        if(_cg == null)
            _cg = gameObject.AddComponent<CanvasGroup>();
    }

    public virtual void Show()
    {
        _cg.alpha = 1;
        _cg.interactable = true;
    }

    public virtual void Hide()
    {
        _cg.alpha = 0;
        _cg.interactable = false;
    }
}

Esto podría mejorar si se utiliza interfaces o mejor aun si directamente migras a ECS -

Sigue practicando :) Saludos.

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...