Meus zumbis estão sendo gerados e caido de cara no chão. Ainda não encontrei o erro.
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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 = 0Veja 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.