public class ControlaZumbi : MonoBehaviour, IMatavel
{
public GameObject Jogador;
private MovimentoPersonagem movimentaZumbi;
private AnimacaoPersonagem animacaoZumbi;
private Status statusZumbi;
public AudioClip SomDeMorte;
private Vector3 posicaoAleatoria;
private Vector3 direcao;
private float contadorVagar;
private float porcentagemGerarKitMedico = 0.1f;
public GameObject KitMedicoPrefab;
private ControlaInterface scriptControlaInterface;
[HideInInspector]
public GeradorZumbis meuGerador;
public float andar = 10;
// Start is called before the first frame update
void Start()
{
Jogador = GameObject.FindWithTag("Jogador");
animacaoZumbi = GetComponent<AnimacaoPersonagem>();
movimentaZumbi = GetComponent<MovimentoPersonagem>();
AleatorizarZumbi();
statusZumbi = GetComponent<Status>();
scriptControlaInterface = GameObject.FindObjectOfType(typeof(ControlaInterface)) as ControlaInterface;
}
void FixedUpdate ()
{
float distancia = Vector3.Distance(transform.position, Jogador.transform.position);
movimentaZumbi.Rotacionar(direcao);
animacaoZumbi.Movimentar(direcao.magnitude);
if(distancia > 15)
{
Vagar();
}
else if(distancia > 2.5)
{
Perseguir();
}
else
{
direcao = Jogador.transform.position - transform.position;
animacaoZumbi.Atacar(true);
}
void Vagar()
{
contadorVagar -= Time.deltaTime;
if(contadorVagar <=0)
{
posicaoAleatoria = AleatorizarPosicao();
contadorVagar += statusZumbi.tempoEntrePosicoesAleatroias + Random.Range(-1f, 1f);
}
bool ficouPertoOSuficiemte = Vector3.Distance(transform.position, posicaoAleatoria) <= 0.05;
if(ficouPertoOSuficiemte == false)
{
direcao = posicaoAleatoria - transform.position;
movimentaZumbi.Movimentar(direcao, statusZumbi.Velocidade);
}
}
void Perseguir()
{
direcao = Jogador.transform.position - transform.position;
movimentaZumbi.Movimentar(direcao, statusZumbi.Velocidade);
animacaoZumbi.Atacar(false);
}
Vector3 AleatorizarPosicao()
{
Vector3 posicao = Random.insideUnitSphere * andar;
posicao += transform.position;
posicao.y = transform.position.y;
return posicao;
}
}
void AtacaJogador()
{
int dano = Random.Range(20, 30);
Jogador.GetComponent<ControlaJogador>().TomarDano(dano);
}
void AleatorizarZumbi ()
{
int geraTipoZumbi = Random.Range(1, 28);
transform.GetChild(geraTipoZumbi).gameObject.SetActive(true);
}
public void TomarDano(int dano)
{
statusZumbi.Vida -= dano;
if(statusZumbi.Vida <=0)
{
Morrer();
}
}
public void Morrer()
{
Destroy(gameObject);
ControlaAudio.instancia.PlayOneShot(SomDeMorte);
VerificarGeracaoKitMedico(porcentagemGerarKitMedico);
scriptControlaInterface.AtualizarQuantidadeDeZumbisMortos();
meuGerador.DiminuirQuantidadeDeZumbisVivos();
}
void VerificarGeracaoKitMedico(float porcentagemGeracao)
{
if(Random.value <= porcentagemGeracao)
{
Instantiate(KitMedicoPrefab, transform.position, Quaternion.identity);
}
}
}