Noticias

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

Vidas en Unity

Iniciado por aliciamartinez, Junio 18, 2018, 11:06:23 AM

Tema anterior - Siguiente tema


   
eature=oembed" width="480">

 
 

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

@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.

Etiquetas: