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

Como modificar a orientação na hora da movimentação

Quando meu personagem vira para a direita para andar a direita passa a ser a nova frente

Ou seja os controles deveriam mudar o sentido e ao apertar "D" e virar para a direita para correr eu deveria apertar "W" para continuar e garantir uma boa jogabilidade, mas eu preciso continuar mantendo o "D" apertado porque a orientação do controle não muda e se mantem a orientação original do jogador.

Como ajsutar isso?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

6 respostas

Oi, Walace, tudo bem?

Confere seu script com o do curso parece que você tá movendo em dois lugares e usando um Normalize sem necessidade.

Bons estudos!

O print foi de tentativas de corrigir. A versão igual a do curso apresenta o mesmo problema:

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

public class ControlaJogador : MonoBehaviour{

    public float Velocidade = 7;
    Vector3 direcao;
    // Update is called once per frame
    void Update(){

        float eixoX = Input.GetAxis("Horizontal");
        float eixoZ = Input.GetAxis("Vertical");
        direcao = new Vector3(eixoX, 0, eixoZ);

        if (direcao != Vector3.zero){
            GetComponent<Animator>().SetBool("Movendo", true);
        } else {
            GetComponent<Animator>().SetBool("Movendo", false);
        } 
    }

    void FixedUpdate(){
        GetComponent<Rigidbody>().MovePosition(GetComponent<Rigidbody>().position +(direcao * Velocidade * Time.deltaTime));
    }
}

A unica alteração em relação ao codigo do curso até o momento foi a utilização do LookRotation pra rotacionar o jogador. Mas o problema da orientação continua

Tenta fazer o seguinte, vai na personagem, zera todas as rotações e se necessário vira a câmera para olhar para essa nova posição.

Veja se isso resolve o problema, porque se a personagem estiver rotacionada toda essa mecânica de movimentação muda, se ela tiver por exemplo rotacionada 180 graus o movimento do eixoX é invertido.

Se não for isso que estou falando, pode enviar um video ou print? Porque não to entendendo bem o problema.

solução!

Agora funcionou


public class ControlaJogador : MonoBehaviour{

    public float Velocidade = 7;
    public float VelocidadeDeRotacao = 4; // Ajuste esta velocidade conforme necessário
    private Vector3 direcao;
    private Rigidbody jogadorRb;
    private Animator animator;

    void Start() {
        jogadorRb = GetComponent<Rigidbody>();
        animator = GetComponent<Animator>();
    }

void Update() {
    float eixoX = Input.GetAxis("Horizontal");
    float eixoZ = Input.GetAxis("Vertical");

    Vector3 direcaoDesejada = new Vector3(eixoX, 0, eixoZ);
    direcao = transform.TransformDirection(direcaoDesejada); 

    if (direcao != Vector3.zero) {
        animator.SetBool("Movendo", true);
        RotacionarJogador();
    } else {
        animator.SetBool("Movendo", false);
    }
}

    void FixedUpdate() {
        if (direcao.magnitude > 0) {
            jogadorRb.MovePosition(jogadorRb.position + direcao.normalized * Velocidade * Time.deltaTime);
        }
    }

    private void RotacionarJogador() {
        Quaternion rotacaoAlvo = Quaternion.LookRotation(direcao);
        transform.rotation = Quaternion.Slerp(transform.rotation, rotacaoAlvo, VelocidadeDeRotacao * Time.deltaTime);
    }
}

Então era isso mesmo! Tinha que mexer no eixo de rotação que estamos usando no curso já que estamos usando o eixo do mundo sendo Z para frente, se mudar isso você tem que transformar a direção global para direção local pela rotação da personagem.

Muito bom, bons estudos!

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