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

Velocidade de animação

Boa tarde, eu tenho duas dúvidas no meu código. 1 - Eu tenho como botar que a velocidade da animacao vai mudar conforme a velocidade do personagem? 2- Eu tenho como colocar o if() da animação, que atualmente está dentro da void MovimentarPersonagem(), na void ControlarAnimacao() para ficar mais organizado? Obrigado!!!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PersonagemPrincipal : MonoBehaviour
{
    public GameObject Personagem;
    public int Velocidade = 1;
    public int AlturaPulo = 1;
    public LayerMask MascaraChao;


    private void Start()
    {

    }

    private void Update()
    {
        RotacionarPersonagem();
        ControlarAnimacao();
    }

    private void FixedUpdate()
    {
        MovimentarPersonagem();
    }


    //MINHAS VOIDS

    void MovimentarPersonagem()
    {
        float eixoX = Input.GetAxis("Horizontal");
        float eixoZ = Input.GetAxis("Vertical");
        float eixoY = Input.GetAxis("Jump");
        Vector3 movimentar = new Vector3(eixoX, 0, eixoZ);
        Vector3 pular = new Vector3(0, eixoY, 0);
        Personagem.GetComponent<Rigidbody>().MovePosition(Personagem.GetComponent<Rigidbody>().position + 
            movimentar * Velocidade * Time.deltaTime);
        Personagem.GetComponent<Rigidbody>().MovePosition(Personagem.GetComponent<Rigidbody>().position + 
            pular * AlturaPulo * Time.deltaTime);
        if (movimentar != Vector3.zero)
        {
            GetComponent<Animator>().SetBool("IdleRun", true);
        }
        else
        {
            GetComponent<Animator>().SetBool("IdleRun", false);
        }
    }

    void RotacionarPersonagem()
    {
        Ray raio = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit pontoColisao;
        if(Physics.Raycast(raio, out pontoColisao, MascaraChao))
        {
            Vector3 posicaoMiraJogador = pontoColisao.point - transform.position;
            posicaoMiraJogador.y = 0;
            Quaternion novaRotacao = Quaternion.LookRotation(posicaoMiraJogador);
            Personagem.GetComponent<Rigidbody>().MoveRotation(novaRotacao);
        }
    }

    void ControlarAnimacao()
    {    
    }
}
4 respostas

Oi, Marcelo, tem sim você pode fazer algo assim:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PersonagemPrincipal : MonoBehaviour
{
    public GameObject Personagem;
    public int Velocidade = 1;
    public int AlturaPulo = 1;
    public LayerMask MascaraChao;
    private Vector3 movimentar;

    private void Update()
    {
     float eixoX = Input.GetAxis("Horizontal");
        float eixoZ = Input.GetAxis("Vertical");
        movimentar = new Vector3(eixoX, 0, eixoZ);

        RotacionarPersonagem();
        ControlarAnimacao();
    }

    private void FixedUpdate()
    {
        MovimentarPersonagem();
    }


    //MINHAS VOIDS

    void MovimentarPersonagem()
    {
    float eixoY = Input.GetAxis("Jump");
        Vector3 pular = new Vector3(0, eixoY, 0);
        Personagem.GetComponent<Rigidbody>().MovePosition(Personagem.GetComponent<Rigidbody>().position + 
            movimentar * Velocidade * Time.deltaTime);
        Personagem.GetComponent<Rigidbody>().MovePosition(Personagem.GetComponent<Rigidbody>().position + 
            pular * AlturaPulo * Time.deltaTime);
    }

    void RotacionarPersonagem()
    {
        Ray raio = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit pontoColisao;
        if(Physics.Raycast(raio, out pontoColisao, MascaraChao))
        {
            Vector3 posicaoMiraJogador = pontoColisao.point - transform.position;
            posicaoMiraJogador.y = 0;
            Quaternion novaRotacao = Quaternion.LookRotation(posicaoMiraJogador);
            Personagem.GetComponent<Rigidbody>().MoveRotation(novaRotacao);
        }
    }

    void ControlarAnimacao()
    {    
     if (movimentar != Vector3.zero)
        {
            GetComponent<Animator>().SetBool("IdleRun", true);
        }
        else
        {
            GetComponent<Animator>().SetBool("IdleRun", false);
        }
    }
}

A variável momentar agora fica declarada para valer para o script todo e trocamos seu valor no Update assim podemos usá-la em qualquer lugar no script sempre atualizada.

Sobre o lance da velocidade, não entendi muito bem. Pode dar um exemplo do que está pensando?

Funcionou. muito obrigado!!

Em relação a velocidade de animação, seria que por exemplo, o personagem correndo na velocidade 2, fica certinho com a animação dele correndo pelo cenário, mas ao chegar na velocidade 6 por exemplo, a animação acaba sendo mais lenta, dando impressão de deslizar no cenário.

solução!

Oi, Marcelo, entendi. Você tem algumas escolhas, daria pra trocar pra uma outra animação pode até ser a mesma com a velocidade maior isso é bem comum em jogos que você pega o speed como float e ele vai aumentando como o nosso tendo uma transição mais ou menos assim:

idle -> andar -> correr

Outra opção seria acelerar o Animator quando você está correndo, na doc tem um exemplo.

Outra opção legal também é na animação quando você clica embaixo do nome está escrito "speed" certo? Do lado tem um checkbox pra você marcar "Parameter". Se você criar um parâmetro float você ganha um valor que pode trocar para mudar a velocidade da animação.

Excelente, me ajudou muito! Muito obrigado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software