Por alguma razão meu zumbi continua bugando virando insanamente de um lado para outro. Eu sinceramente não consigo entender o por que :/ Já tentei mudar o código várias vezes e o resultado é o mesmo. Só é resolvido o problema se eu aumentar o tamanho da distancia de 0.05 para 1.1 como está no código.
Obs: Esse Timer é uma classe separada que criei para refatorar a parte de contagem e poder usar em outros lugares também, a cada 6 segundos ela chama o método SetRandomDir().
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Zombie : BasicEntity
{
public int strenght = 1;
private GameObject player;
private Vector3 dir;
private CharacterMovement characterMovement;
private BodiesFeedback bodiesFeedback;
private Animation_Controller animController;
private Timer timer;
private AudioSource audioPlayer;
public AudioClip attack;
public AudioClip death;
void Start()
{
player = GameObject.FindWithTag("Player").gameObject;
audioPlayer = GetComponent<AudioSource>();
animController = GetComponent<Animation_Controller>();
characterMovement = GetComponent<CharacterMovement>();
bodiesFeedback = GetComponent<BodiesFeedback>();
bodiesFeedback.SetBodyRenderer(SortZombie());
timer = GetComponents<Timer>()[1];
SetRandomDir();
}
void FixedUpdate()
{
float distance =
Vector3.Distance(transform.position, player.transform.position);
bool collidingWithPlayer = (distance <= 2.5);
if (distance > 15)
{
WalkWithoutDirection();
}
else if (!collidingWithPlayer)
{
FollowPlayer();
}
animController.Atacking(collidingWithPlayer);
}
public void Attack()
{
audioPlayer.PlayOneShot(attack);
Player curPlayer = player.GetComponent<Player>();
curPlayer.Damage(this.strenght);
}
private void FollowPlayer()
{
Vector3 diff = player.transform.position - transform.position;
dir = diff.normalized;
characterMovement.Walk(dir, spd);
characterMovement.Rotate(dir);
animController.Walking(dir.magnitude);
}
private void WalkWithoutDirection()
{
if (Vector3.Distance(transform.position, dir) >= 1.1)
{
Vector3 steps = dir - transform.position;
steps.y = 0;
characterMovement.Walk(steps.normalized, spd);
characterMovement.Rotate(steps);
animController.Walking(steps.magnitude);
}
if (!timer.IsCounting())
{
timer.StartTimer(6);
}
}
public void SetRandomDir()
{
dir = GenerateRandomPosition();
}
private Vector3 GenerateRandomPosition()
{
int sphereRadius = 10;
Vector3 randomPos = Random.insideUnitSphere * sphereRadius;
randomPos += transform.position;
randomPos.y = transform.position.y;
return randomPos;
}
private GameObject SortZombie()
{
int curZombie = Random.Range(1, 28);
GameObject curZombieSkin = transform.GetChild(curZombie).gameObject;
curZombieSkin.SetActive(true);
return curZombieSkin;
}
private void GetDamaged(int damage)
{
bodiesFeedback.Blink(Color.red);
life -= damage;
if (!audioPlayer.isPlaying)
{
audioPlayer.PlayOneShot(death);
}
if (life <= 0)
{
Destroy(this.gameObject);
}
}
private void OnTriggerEnter(Collider collider)
{
if (collider.tag == "Ammo")
{
GetDamaged(collider.gameObject.GetComponent<Ammo>().GetDamage());
}
}
}