Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Minha personagem é uma fantasma, ajude-me a torna-la real =)

Olá professor! o/

Meu cenário é quase igual, mudando apenas posição. O código é igual. Mas, eu comparei o que fiz com o material disponível e no seu tudo dá certo. No meu arquivo a personagem ainda atravessa paredes se eu forçar um tempo na mesma direação. Se eu soltar antes dela atravessar, ela retorna ao cenário.

Eu aumentei influência do colisor, fiz testes de todo tipo com o Rigidbody e nada.

Não ficou como o seu.

Minha versão da Unity é a mais recente. Pode ser isso?

Abcs

6 respostas

Oi, Eduardo, tudo bem?

Não, isso não deveria mudar (pode usar a 2021 também se quiser) e esse bug também acontece comigo nessa parte do curso. O jogo é um trabalho em progresso e vai evoluindo a cada curso devagar onde comentamos soluções para problemas, achamos bugs e vamos evoluindo funcionalidades.

Nem todos são resolvidos mas as ferramentas para solução vão sendo dadas hehe

Nesse outro tópico eu comentei sobre a solução que pode te ajudar nesse problema.


Acho que um conjunto de coisas podem ajudar:

  • Você pode aumentar um pouco aquele número de 2.5 para fazer a personagem e o zumbi não se tocar
  • Aumentar a massa da personagem no Rigidbody para algo como 100
  • Aumentar o drag e o linear drag para 1 ou valor próximo assim o personagem desacelera muito mais rápido
  • Mudar o código para usar uma função que trata melhor colisão
  • Em Edit > Project Settings > Physics você pode mudar o Max Depenetration Velocity para algo maior como 100 ou 1000 assim os colisores ficarão mais agentes em algo em alta velocidade.
  • Mudança de comportamento do Rigidoby para Continuous

Opa Eduardo, tudo bem?

Eu consegui resolver esse problema alterando o MovePosition para o velocity. Meu script ficou assim:

CharactersMovements.cs:

public class CharactersMovements : MonoBehaviour
{
    private Rigidbody rb;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    public void MoveCharacter(Vector3 direction, float speed)
    {
        rb.velocity = direction.normalized * speed;
    }

    public void RotateCharacter(Vector3 direction)
    {
        // lógica
    }
    public void Death()
    {
        // lógica
    }
}

PlayerControl.cs:

public class PlayerControl : MonoBehaviour, IDeadly, IHealLife
{
    public CharacterStatus PlayerStatus;
    public InterfaceControl ScriptIC;
    public AudioClip DamageSound;

    private CharacterAnimations playerAnimation;
    private PlayerMovements movePlayer;
    private Vector3 direction;

    void Start()
    {
        PlayerStatus = GetComponent<CharacterStatus>();
        playerAnimation = GetComponent<CharacterAnimations>();
        movePlayer = GetComponent<PlayerMovements>();
    }

    void Update()
    {
        float axleX = Input.GetAxisRaw("Horizontal");
        float axleZ = Input.GetAxisRaw("Vertical");
        direction = new Vector3(axleX, 0, axleZ);
        playerAnimation.MoveAnimation(direction.magnitude);
    }
    void FixedUpdate()
    {
        movePlayer.MoveCharacter(direction, PlayerStatus.Speed); // Movimento o jogador
        movePlayer.RotatePlayer(); // Rotaciona o jogador de acordo com a mira
    }

    public void TakeDamage(int damage)
    {
        // lógica
    }
    public void Dead()
    {
        ScriptIC.GameOver();
    }
    public void HealLife(int healingValue)
    {
        // lógica
    }
}

Talvez seus zumbis fiquem meio doidos, girando no modo vagar(meu método vagar se chama Wander), para isso eu resolvi assim:

ZombieControl.cs:

public class ZombieControl : MonoBehaviour, IDeadly
{
    . . .

    void FixedUpdate()
    {
        if (Player != null)
        {
            distanceDiff = Vector3.Distance(transform.position, Player.transform.position);
        }
        int distanceWander = 15;
        int distanceAttack = 3;
        zombieMovements.RotateCharacter(direction);
        zombieAnimations.MoveAnimation(direction.magnitude);

        if (distanceDiff > distanceWander)
        {
            Wander();
        }
        else if (distanceDiff > distancePursue || distanceDiff > distanceAttack)
        {
            Pursue();
            zombieAnimations.AttackAnimation(false);
        }
        else
        {
            if (Player != null)
            {
                direction = Player.transform.position - transform.position;
                zombieAnimations.AttackAnimation(true);
            }
        }

    }
    void Pursue()
    {
        direction = Player.transform.position - transform.position; // Determina qual direção o objeto deve seguir
        zombieMovements.MoveCharacter(direction, ZombieStatus.Speed);
    }
    void Wander()
    {
        timer -= Time.deltaTime;
        if (timer <= 0)
        {
            randomPos = RandomizePosition();
            direction = randomPos - transform.position;
            timer += wanderingTime + Random.Range(-1f, 1f);
        }
        bool closeEnough = Vector3.Distance(transform.position, randomPos) <= 0.05;
        if (closeEnough == false)
        {
            zombieMovements.MoveCharacter(direction, ZombieStatus.Speed);
        }
        else
        {
            direction = Vector3.zero;
        }
    }

    . . .
}

Eu removi bastante conteúdo dos scripts pra evitar ficar muito grande, mas a lógica está ai.

Existe algo que preciso comentar. A minha solução para os zumbis pararem de girar no modo vagar tem um erro de lógica, eles deveriam parar de tentar andar caso a posição aleatória gerada fosse impossível de alcançar, por exemplo, quando a posição aleatória gerada fica dentro de uma casa. Eu não tentei solucionar isso, pois gostei do resultado, zumbis são meio burros né kkkkkk

Também criei um Physic Material, zerei o Dynamic Friction e Static Friction, e alterei o Friction Combine para Minimum. Adicionei ele ao colisor do player, zumbis e boss para que diminuisse a fricção entre os colisores(quando tenta andar perto das paredes ficava agarrando).

Se quiser ver o resultado, da um conferida no game pronto, a senha é zombie.

https://murilocseidenstucker.itch.io/zombie-game-v004

Oi professor Henrique, tudo bem?

Muito obrigado pela resposta. Mas, ainda não testei. Ontem perdi meu plano de aula devido a trabalho. Hoje eu volto aos estudos e vou tentar aplicar e retorno.

Oi Murilo, tudo bem?

Muito obrigado pelas soluções! Seu código está bacana, mas eu ainda não entendo bem C#. Acho que aos poucos eu pego. Vou tentar usar aos poucos o que passou. =)

E seu game tá bem bacana. Curti muito! Não sei se ao final da aula haverá todos esses elementos, mas curti a música, chefes etc. Só o controle que não muda a axis de direção.

Eu usei, logo de cara o Quaternion que o Henrique explica no começo. A personagem roda com o controle de xbox.

Aliás, tem um final no game? Tipo, quando acabam os zumbis? rsrs

Henrique, resolveu com o Max Depenetration Velocity em 100. \o/

Murilo, eu consigo acesso a seu código pra entender melhor? Obrigado! Ps: show demais mesmo o seu game. Joguei melhor aqui. Curti!

solução!

Fala Eduardo!

Vou enviar meus assets pra você dar uma olhada, só entrar na pastas scripts que tem todos códigos lá. Mas o jogo completo nada mais é do que o resultado do curso aqui da Alura, a única coisa diferente que fiz foi o cooldown da arma, porém com os conhecimentos do próprio curso.

https://drive.google.com/file/d/1qSpaXecOPGOoVEMfyS4tI4HLKuPYawt_/view?usp=sharing

Acredito que se você criar um projeto vazio e colar o contéudo desta pasta assets para a do projeto vazio, e depois, abrir minhas cenas(Menu, Main), você terá acesso ao meu game completo, pra poder explorar o que quiser. Porém reforço, o game nada mais é do que o resultado do curso, então continue o curso até o fim que aprenderá a fazer o jogo completo.

Muito obrigado Murilo! =D

Estou na última parte. Devo terminar logo.

Vou estudar seu código. Curti demais (principalmente o HUD e música que você acrescentou)!

Abraços