Bom, eu estava acompanhando as aulas e achei interessante tambem controlar a quantidade de munição do jogador. Que pode ser considerado um Status da Arma, carregada, descarregada e carregando.(Eu não fui até o final do 3 curso hehe)
Então Henrique, se tiver um tempo para dar uma olhada no código e me mandar um feedback. E para quem quiser implementar algo desse tipo.
Aqui uma imagem de como ficou: https://i.imgur.com/JOL0zGT.png
Primeiro eu editei a caixa da munição fechada, para ficar menor e com duas caixinhas. Depois criei dois scripts: IControlaMunicao e ControlaMunicao. E usei os scripts ControlaStatus, ControlaUI e ControlaInimigo.
[Editado]: Feita alterações para melhorar o controle da munição nos Scripts ControlaArma, ControlaUI e ControlaStatus.
Os códigos ficaram da seguinte forma:
IControlaMunicao
public interface IControlaMunicao
{
void RecargaMunicao(int quantidadeDeMunicao);
}
ControlaMunicao
public class ControlaMunicao : MonoBehaviour
{
private int tempoDeDestruicao = 5;
void Start()
{
Destroy(gameObject, tempoDeDestruicao);
}
int MunicaoAleatoria()
{
int QuantidadeDeMunicao = Random.Range(5, 10);
return QuantidadeDeMunicao;
}
private void OnTriggerEnter(Collider objetoDeColisao)
{
if (objetoDeColisao.tag == "Jogador")
{
objetoDeColisao.GetComponent<ControlaArma>().RecargaMunicao(MunicaoAleatoria());
Destroy(gameObject);
}
}
}
ControlaArma
public class ControlaArma : MonoBehaviour, IControlaMunicao {
public GameObject Bala;
public GameObject CanoDaArma;
public AudioClip SomDoTiro;
public ControlaStatus ControlaStatus;
private ControlaUI scripControlaUI;
void Start ()
{
ControlaStatus = GetComponent<ControlaStatus>();
scripControlaUI = GameObject.FindObjectOfType(typeof(ControlaUI)) as ControlaUI;
}
// Update is called once per frame
void Update () {
if (Input.GetButtonDown("Fire1") && ControlaStatus.Municao > 0 )
{
ControlaAudio.instancia.PlayOneShot(SomDoTiro);
Instantiate(Bala, CanoDaArma.transform.position, CanoDaArma.transform.rotation);
ControlaStatus.Municao --;
scripControlaUI.AtualizarQuantidadeDeMunicao(ControlaStatus.Municao, ControlaStatus.MunicaoReserva);
}else if(ControlaStatus.Municao == 0 && ControlaStatus.MunicaoReserva >= 1)
{
ControlaStatus.Municao += ControlaStatus.MunicaoReserva;
if (ControlaStatus.Municao > ControlaStatus.MunicaoInicial)
{
ControlaStatus.Municao = ControlaStatus.MunicaoInicial;
}
ControlaStatus.MunicaoReserva -= ControlaStatus.MunicaoInicial;
if(ControlaStatus.MunicaoReserva < 0)
{
ControlaStatus.MunicaoReserva = 0;
}
scripControlaUI.AtualizarQuantidadeDeMunicao(ControlaStatus.Municao, ControlaStatus.MunicaoReserva);
}
}
public void RecargaMunicao(int quantidadeDeMunicao)
{
ControlaStatus.Municao += quantidadeDeMunicao;
if (ControlaStatus.Municao > ControlaStatus.MunicaoMaxima)
{
ControlaStatus.Municao = ControlaStatus.MunicaoMaxima;
}
scripControlaUI.AtualizarQuantidadeDeMunicao(ControlaStatus.Municao);
}
}
ControlaStatus
public class ControlaStatus : MonoBehaviour {
public int VidaInicial = 10;
[HideInInspector]
public int Vida;
public float Velocidade = 10;
[HideInInspector]
public int MunicaoInicial = 9;
[HideInInspector]
public int MunicaoMaxima = 60;
[HideInInspector]
public int Municao;
[HideInInspector]
public int MunicaoReserva;
void Awake () {
Vida = VidaInicial;
Municao = MunicaoInicial;
MunicaoReserva = MunicaoInicial;
}
}
ControlaUI
public void AtualizarQuantidadeDeMunicao(int municao, int municaoreserva)
{
ControleDaMunicaoAtual.text = string.Format(" {0}|{1} ", municao, municaoreserva);
}