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.
Desafio
MédioA 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:
speedunidades 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);
}
}
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
1Texto na tela
Canvas e textoExiba a pontuaçãoFormate númerosUm cronômetro regressivoRevisão: velocímetro4Cenas e Fases
Carregar uma CenaReiniciar a FasePróxima FaseManter entre CenasRevisão: Seleção de Fases10Projeto: Jogo de Plataforma 3D
O PercursoPlataformas Móveis2Botões e telas
Botões e onClickLambdasConectando no InspectorPainéis ligados e desligadosBarras de vidaRevisão: Loja de melhorias5Salvando com PlayerPrefs
Salvar um númeroCarregar com um valor padrãoRecordeSalvar configuraçõesRevisão: Moedas no banco8Controlador de personagem
CharacterController.MoveGravidade na mãoPuloEmpurrando objetosMover-se para onde você olhaRecapitulação: pulo duplo