Menu
CoddyTech

Mover-se para onde você olha

Parte da seção Criando Jogos de Verdade do Journey de Unity da Coddy. Lição 42 de 60.

Quando a câmera olha para o jogador de um ângulo, as setas devem mover o jogador como a tela mostra: para cima, ele se afasta da câmera; para a direita, ele se move para a direita da câmera. Os eixos do mundo só fazem isso quando a câmera olha ao longo de +z. Então, construa o movimento usando as direções da própria câmera, cam.forward e cam.right.

Primeiro, é preciso ajustá-las. Uma câmera que olha para baixo, na direção do jogador, tem um forward que aponta para o chão; então, defina seu y como 0 para manter apenas a parte paralela ao chão. O que sobra é menor que 1, cerca de 0.87 para uma câmera inclinada 30 graus para baixo, e o jogador andaria mais devagar; por isso, normalize-o. Este personagem segue a câmera principal, que olha para um canto do nível:

Transform cam = Camera.main.transform;

Vector3 forward = cam.forward;
forward.y = 0f;
forward.Normalize();
Vector3 right = cam.right;
right.y = 0f;
right.Normalize();

Vector3 move = forward * Input.GetAxisRaw("Vertical") + right * Input.GetAxisRaw("Horizontal");
if (move.magnitude > 1f) move.Normalize();   // movimento na diagonal sem aumento de velocidade
controller.Move(move * speed * Time.deltaTime);

Camera.main é a câmera marcada como MainCamera. As duas direções são lidas a cada quadro, então os controles continuam corretos quando a câmera gira. Para cima e para a direita juntos somam dois vetores unitários em ângulos retos, cujo comprimento é cerca de 1.41; por isso, o movimento é normalizado quando seu comprimento é maior que 1.

challenge icon

Desafio

Médio

Faça as setas moverem o jogador em relação à câmera giratória.

  1. Em Update(), copie cam.forward e cam.right, com y igual a 0, normalizados.
  2. dir é forward multiplicado pelo eixo bruto "Vertical" mais right multiplicado por "Horizontal", normalizado quando for maior que 1.
  3. Quando dir != Vector3.zero, defina transform.rotation = Quaternion.LookRotation(dir);. Construa move a partir de dir * speed.

Pressione “Jogar”: para cima, o jogador se afasta da câmera, independentemente da direção para a qual ela estiver apontada. Depois, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;

public class Mover : MonoBehaviour
{
    public float speed = 4f;
    public float gravity = -15f;
    public Transform cam;

    CharacterController controller;
    float verticalSpeed;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (controller.isGrounded && verticalSpeed < 0f)
        {
            verticalSpeed = -2f;
        }
        verticalSpeed += gravity * Time.deltaTime;

        // Move-se ao longo dos eixos do mundo: faça-o se mover em relação à cam e olhar na direção em que se move
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}

Todas as lições de Criando Jogos de Verdade

Pratique por conta própria: Playground de Unity