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

Zumbi continua DOIDAO

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());
        }
    }

}
1 resposta
solução!

Problema encontrado!

O problema estava no meu CharacterMovement que usava o rigidbody.velocity ao invés do rigidbody.MovePosition(), e por isso mesmo ao parar de se mover o personagem ainda deslizava um pouco para frente já que o velocity faz com que a velocidade do corpo apenas vá diminuindo com o tempo e não exatamente pare instantaneamente.