Menu
CoddyTech

Mover-se para onde você olha

Parte da seção Criando jogos de verdade do Journey de Unity da Coddy. Lição 41 de 56.

Quando a câmera olha para o jogador de um ângulo, as setas devem mover o jogador da forma como a tela mostra: para cima, ele se afasta da câmera; para a direita, ele anda 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 é mais curto que 1, cerca de 0.87 para uma câmera inclinada 30 graus para baixo, e o jogador andaria mais devagar, então 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();   // movimentos diagonais não são mais rápidos
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, que têm comprimento de cerca de 1.41, então o movimento é normalizado quando seu comprimento é maior que 1.

challenge icon

Desafio

Médio

A câmera gira lentamente ao redor do jogador (CameraRig.cs, pronto), então os eixos do mundo continuam girando na tela. Faça com que as setas movam o jogador em relação à câmera em Mover.cs, onde a gravidade já está implementada. O Inspector define speed (4) e cam, o Transform da câmera.

  • Para cima, o jogador se afasta da câmera pelo chão; para baixo, vai em direção a ela; direita e esquerda, para a direita e para a esquerda da câmera: speed unidades por segundo em todas as direções, inclusive nas diagonais, embora a câmera esteja olhando para baixo, na direção do jogador.
  • Enquanto se move, o jogador vira para ficar de frente para a direção em que está andando. Quando para, continua voltado para essa direção.

Pressione Play, caminhe enquanto a câmera gira e, em seguida, Check.

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;

        // Anda ao longo dos eixos do mundo: faça com que se mova em relação a cam e fique voltado para a direção em que anda
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Criando jogos de verdade