Gravidade na mão
Parte da seção Criando jogos de verdade do Journey de Unity da Coddy. Lição 38 de 56.
Um CharacterController só cai se o seu script o fizer cair, e uma queda real ganha velocidade: a gravidade adiciona cerca de 9.81 unidades por segundo à velocidade de queda a cada segundo. Então, o script mantém a velocidade vertical em um campo, adiciona gravity * Time.deltaTime a ela a cada quadro e se move com ela no mesmo Move que a caminhada:
public float gravity = -9.81f;
float verticalSpeed;
void Update()
{
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f; // no chão: interrompa a queda, mantenha um leve impulso para baixo
}
verticalSpeed += gravity * Time.deltaTime;
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = verticalSpeed;
controller.Move(move * Time.deltaTime);
}Time.deltaTime aparece duas vezes, com duas funções: gravity * Time.deltaTime é a velocidade ganha neste quadro, e a velocidade multiplicada por Time.deltaTime é a distância percorrida neste quadro. speed é um campo porque precisa persistir de um quadro para o outro; uma variável local começaria novamente em 0 a cada quadro. Caindo a partir do repouso, o controlador está a -4.9 unidades por segundo após meio segundo e a -9.81 após um segundo.
A redefinição é tão importante quanto a queda. No chão, Move para o controlador, mas nada para o campo: sem a redefinição, ele continua aumentando enquanto o jogador está parado, e o próximo passo para fora de uma borda começa com velocidade máxima. Ele é redefinido para um número negativo pequeno, em vez de 0, para que cada Move continue pressionando o controlador contra o chão: em uma taxa de quadros alta, o impulso da gravidade em um único quadro pode ser menor que Min Move Distance, o Move não faz nada e isGrounded passa a ser false. isGrounded é lido antes do Move, então descreve o Move do quadro anterior.
Desafio
MédioO mergulhador está em uma torre alta, e as setas o movem (isso já está escrito). Adicione gravidade em Diver.cs. O Inspector define gravity (-12) e maxFall (10), e o script tem o campo verticalSpeed.
- A cada quadro,
verticalSpeedaumenta porgravitya cada segundo, e o mergulhador desce essa distância no mesmo Move usado para andar. - O ar desacelera uma queda longa: o mergulhador nunca cai mais rápido que
maxFallunidades por segundo. - Quando o controlador estiver no chão e
verticalSpeedfor menor que 0, definaverticalSpeedcomo -1.
Pressione Jogar, saia andando da torre e, em seguida, Verificar.
Experimente você mesmo
using UnityEngine;
public class Diver : MonoBehaviour
{
public float speed = 4f;
public float gravity = -12f;
public float maxFall = 10f;
CharacterController controller;
float verticalSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
// Gravidade: redefina verticalSpeed no chão, adicione a gravidade, limite a queda e coloque o resultado em move.y
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
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