1
resposta

[Dúvida] Movimentação em relação ao player quando iniciar

No começo eu pensei que a movimentação seria em relação a como o objeto personagem é colocado na cena. Eu queria que a movimentação direita, esquerda ,frente e para atrás fosse feita em relação ao objeto do personagem quando a cena começar, mas parece que está como se a movimentação fosse em relação a orientação global e não como se fosse em relação a orientação do player quando inicia.

Porque minha câmera eu coloquei ela em um ângulo diferente em relação a sua. Aí parece que o jogador quando move para frente ele vai pra atrás e visse versa o mesmo para esquerda e direita, a perspectiva da câmera no jogo e igual a sua vista de cima só que ela esta virada para o motel a 45º± para a esquerda. O meu objeto personagem está orientado a 45º± também olhando para o motel na cena. Eu poderia colocar a orientação do meu personagem igual a sua quando iniciar a cena mas aí eu perderia um pouco de ser "Livre" na hora de posicionar o objeto personagem.

O código:

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

public class PlayerControl : MonoBehaviour
{
    // Variaveis:
    public float MovementSpeed;   
    private Vector3 Direction;
    public LayerMask FloorMask;


   
    private void Start()
    {
        Direction = transform.position;
    }
    private void Update()
    {       
        // Movimentação do personagem:
        float EixoX = Input.GetAxis("Horizontal");  // Inputs "Horizontal" de movimentos A D:
        float EixoZ = Input.GetAxis("Vertical");    // Inputs "Vertical" de movimentos W S:
        
        Direction = new Vector3(EixoX, 0,EixoZ);
        

        // Executa as animcoes:
        if(Direction != Vector3.zero)
        {
            GetComponent<Animator>().SetBool("Moving", true);
        }
        else
        {
           GetComponent<Animator>().SetBool("Moving", false); 
        }
        
    }
    
    private void FixedUpdate()
    {
        GetComponent<Rigidbody>().MovePosition
            (GetComponent<Rigidbody>().position +
            (Direction * Time.deltaTime * MovementSpeed));


        // Faz o personagem olhar para onde deve ir seguindo a direção do mouse:
        Ray raio = Camera.main.ScreenPointToRay(Input.mousePosition);
        Debug.DrawRay(raio.origin, raio.direction * 100, Color.red);

        RaycastHit impact;

        if (Physics.Raycast(raio, out impact, 100, FloorMask))
        {
            Vector3 LookDirection = impact.point - transform.position;
            LookDirection.y = 0;

            Quaternion NewRotation = Quaternion.LookRotation(LookDirection);
            GetComponent<Rigidbody>().MoveRotation(NewRotation);
        }
    }
}

Eu quero que movimentação seja definida em relação ao player mas não durante o jogo todo só na hora de iniciar a cena mesmo Eu não sei se precisa de uma variável no método Start, já tentei varias coisas. Não sei se fui bem claro pois escrevi muita coisa talvez acabei me enrolando. O Projeto:https://drive.google.com/file/d/1jXaEim6l1RACEZpuyw9nk-t2nqy-mnN0/view?usp=sharing

1 resposta

Tem jeitos mais avançados de fazer isso mas pra esse inicio de estudo eu recomendaria você olhar pra qual lado o personagem está se movimentando e trocar, exemplo

Se ele está apontado para o X do mundo ficaria:

Direction = new Vector3(EixoZ, 0,EixoX);

Se ele está apontado para o -X do mundo ficaria:

Direction = new Vector3(EixoZ, 0,-EixoX);

Se ele está apontado para o -Z do mundo ficaria:

Direction = new Vector3(EixoX, 0,-EixoZ);

Assim você muda a direção baseada no inicio, não vale a pena tanto assim fazer um código muito complexo sendo que ele sempre tem que começar pra algum lado baseado na câmera.

Mas o jeito complexo: seria você usar o forward (camera.main.transform.forward) da câmera para calcular pra onde ele está olhando.

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