Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Proposta dos status pelo professor

Olá! O professor pediu para realizarmos a criação do status do inimigo e status do player via herança. Realizei a criação dos status para cada e fiz algumas mudanças no que foi feito no projeto até o momento. Por isso, gostaria de saber se o que fiz fez algum sentido e que melhorias posso fazer.

De início, pensei na ideia de que como o status que guarda a vida utiliza-lo para guardar os métodos de tomar dano e morrer. Com isso, em vez de utilizar a interface no ControlaJogador, passei para os scripts de status do jogador e de status do inimigo. Além disso, adicionei o tipo de zumbi no status do inimigo em vez de deixar no ControlaInimigo.

Script de status do Jogador:

public class StatusPlayer : Status, IMatavel
{
    public int Protection = 5;
    public string TypeWeapon = "Pistola";
    public Controlador_Interface scriptControladorInterface;
    public AudioClip DamageSound;

    new public void CalcularDano()
    {
        if (TypeWeapon == "Pistola") // Verifica Tipo Arma
            Damage = 1; 
    }

    public void TomarDano(int damage)
    {
        CurrentLife -= (damage - Protection);
        scriptControladorInterface.AtualizadorSlider(); // Chamando atualizador de barra de vida
        Controlador_Audio.instance.PlayOneShot(DamageSound); // Play som de dano
        if (CurrentLife <= 0)
        {
            Morrer();
        }
    }

   public void Morrer()
    {
        Time.timeScale = 0; // Pause Game
        GetComponent<Movimentacao_Player>().GameOver.SetActive(true); // Enviar aviso de game over
    }
}

Script de Status do Inimigo:

public class StatusEnemy : Status, IMatavel
{
    public int ZombieType;
    public AudioClip DeathZombieSound;
    public float counterWalk;
    public float timeToWalk = 4;

    void Start()
    {
        GenerateZombieType();
    }

    void GenerateZombieType()
    {
        ZombieType = Random.Range(1, 28); // Escolha aleatoria de skin
        transform.GetChild(ZombieType).gameObject.SetActive(true); // Ativar Skin zumbi
    }

    new public void CalcularDano()
    {
        Damage = Random.Range(20,31); // Aleatorizando dano
    }

    public void TomarDano(int dano)
    {
        CurrentLife -= dano;
        if (CurrentLife <= 0) // Verificar vida
        {
            Morrer();
        }
    }

    public void Morrer()
    {
        Destroy(gameObject); // Destruir zumbi
        Controlador_Audio.instance.PlayOneShot(DeathZombieSound); // Play som de morte
    }
}

Script Status:

public class Status : MonoBehaviour
{
    public float Life;
    [HideInInspector]
    public float CurrentLife;
    public float MovementSpeed;
    public int Damage;
    void Awake()
    {
        CurrentLife = Life;
    }

    public void CalcularDano() { }
}

Acabei utilizando o método de CalcularDano como herança para os outros status pois ambos iriam calcular o dano que os personagens vão realizar. Entretanto, como são formas diferentes de cálculo, seria melhor utilizar uma interface para colocar o método em ambos em vez de puxar do script de Status? Ou utilizar métodos próprios com nomes diferentes?

Outra coisa que eu pensei, mas para realizar um pouco mais a frente, seria bom criar um status para a arma e me basear no dano que dou ao inimigo a partir dela e não a partir do status do jogador? Meio que abrindo portas para o uso de diferentes tipo de armas no jogo e mudando algumas propriedades como fire rate, dano etc.

1 resposta
solução!

Oi, Mateus, tudo bem?

Acho que tudo o que você falou faz sentido sim, o método e a classe status se ela for só de base pode ser até abstract em C#. Porque é uma implementação incompleta até ele ser herdado e implementado. O proprio Status pode herdar o IMatavel, já que terá implementação nos outros scripts também.

Sobre a arma é legal sim, porque aí você pode ter dano, número de balas, e tudo mais diferente para cada arma que for usar.