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.
Desafio
MédioFaça as setas moverem o jogador em relação à câmera giratória.
- Em
Update(), copiecam.forwardecam.right, comyigual a0, normalizados. diréforwardmultiplicado pelo eixo bruto"Vertical"maisrightmultiplicado por"Horizontal", normalizado quando for maior que 1.- Quando
dir != Vector3.zero, definatransform.rotation = Quaternion.LookRotation(dir);. Construamovea partir dedir * 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
1Texto na tela
Canvas e textoExiba a pontuaçãoFormate númerosUm cronômetro regressivoRevisão: velocímetro2Botõ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 duploPratique por conta própria: Playground de Unity