Meus zumbis estão sendo gerados e caido de cara no chão. Ainda não encontrei o erro.
Meus zumbis estão sendo gerados e caido de cara no chão. Ainda não encontrei o erro.
Oi, Felipe, tudo bem?
Você travou os eixos do Rigidbody? Como está o código?
Oi Henrique aqui na unity está travado sim
Segue o codigo do movimento personagem
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MovimentoPersonagem : MonoBehaviour
{
private Rigidbody meuRigidbody;
void Awake()
{
meuRigidbody = GetComponent<Rigidbody>();
}
public void Movimentar(Vector3 direcao, float velocidade)
{
meuRigidbody.MovePosition(
meuRigidbody.position +
direcao.normalized * velocidade * Time.deltaTime);
}
public void Rotacionar(Vector3 direcao)
{
Quaternion novaRotacao = Quaternion.LookRotation(direcao);
meuRigidbody.MoveRotation(novaRotacao);
}
}
e do ControlaInimigo
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ControlaInimigo : MonoBehaviour, IMatavel
{
public GameObject Jogador;
private MovimentoPersonagem movimentaInimigo;
private AnimacaoPersonagem animacaoInimigo;
private Status statusInimigo;
public AudioClip SomDeMorte;
private Vector3 posicaoAleatoria;
private Vector3 direcao;
private float contadorVagar;
private float tempoEntrePosicoesAleatorias = 4;
// Use this for initialization
void Start()
{
Jogador = GameObject.FindWithTag("Jogador");
animacaoInimigo = GetComponent<AnimacaoPersonagem>();
movimentaInimigo = GetComponent<MovimentoPersonagem>();
AleatorizarZumbi();
statusInimigo = GetComponent<Status>();
}
void FixedUpdate()
{
float distancia = Vector3.Distance(transform.position, Jogador.transform.position);
movimentaInimigo.Rotacionar(direcao);
animacaoInimigo.Movimentar(direcao.magnitude);
if (distancia > 15)
{
Vagar();
}
else if (distancia > 2.5)
{
direcao = Jogador.transform.position - transform.position;
movimentaInimigo.Movimentar(direcao, statusInimigo.Velocidade);
animacaoInimigo.Atacar(false);
}
else
{
animacaoInimigo.Atacar(true);
}
}
void Vagar()
{
contadorVagar -= Time.deltaTime;
if (contadorVagar <= 0)
{
posicaoAleatoria = AleatorizarPosicao();
contadorVagar += tempoEntrePosicoesAleatorias;
}
bool ficouPertoOSuficiente = Vector3.Distance(transform.position, posicaoAleatoria) <= 0.5;
if (ficouPertoOSuficiente == false)
{
direcao = posicaoAleatoria - transform.position;
movimentaInimigo.Movimentar(direcao, statusInimigo.Velocidade);
}
}
Vector3 AleatorizarPosicao()
{
Vector3 posicao = Random.insideUnitSphere * 10;
posicao += transform.position;
posicao.y = 0;
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)
{
statusInimigo.Vida -= dano;
if (statusInimigo.Vida <= 0)
{
Morrer();
}
}
public void Morrer()
{
Destroy(gameObject);
ControlaAudio.instancia.PlayOneShot(SomDeMorte);
}
}
Vamo tentar cancelar a rotação na variável direcao
algo como:
# FixedUpdate
direcao = Jogador.transform.position - transform.position;
direcao.y = 0
# Vagar
direcao = posicaoAleatoria - transform.position;
direcao.y = 0
Veja se faz alguma diferença
Olá mestre Henrique essa parte "direcao.y = 0" matou a pau!!!! Estamos de volta no jogo...literalmente rsrs obrigado!
Boa! Bons estudos!
No curso eu usei a posição em Y igual a posição do player mas é porque no começo eu coloquei meu player no zero Y então não faria diferença mas de fato é ruim porque eu posso quebrar fazer o player pular depois ou coisa assim.