Gravidade na mão
Parte da seção Criando Jogos de Verdade do Journey de Unity da Coddy. Lição 39 de 60.
Um CharacterController só cai se o seu script fizer com que ele caia, e uma queda real ganha velocidade: a gravidade adiciona cerca de 9.81 unidades por segundo à velocidade de queda a cada segundo. Por isso, 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 usado para andar:
public float gravity = -9.81f;
float verticalSpeed;
void Update()
{
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f; // no chão: interrompa a queda e mantenha uma leve força 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 para duas funções: gravity * Time.deltaTime é a velocidade ganha neste quadro, e a velocidade multiplicada por Time.deltaTime é a distância percorrida neste quadro. A velocidade é um campo porque precisa persistir de um quadro para outro; uma variável local começaria de novo 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 interrompe o campo: sem a redefinição, ele continua aumentando enquanto o jogador está parado, e o próximo passo para fora de uma beirada 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: com uma taxa de quadros alta, o impulso da gravidade de um único quadro pode ser menor que Min Move Distance, Move não faz nada e isGrounded passa a ser false. isGrounded é lido antes de Move, então descreve o Move do quadro anterior.
Desafio
MédioAdicione gravidade ao mergulhador para que sua queda acelere.
- No início de
Update(), quandocontroller.isGroundedeverticalSpeed < 0f, definaverticalSpeed = -1f;. - Some
gravity * Time.deltaTimea ele e mantenha-o em-maxFallou acima usandoMathf.Max. - Antes da linha
controller.Move, definamove.y = verticalSpeed;.
Pressione “Jogar” e saia andando da torre: a queda acelera até 10 unidades por segundo. Em seguida, clique em “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 quando estiver no chão, aplique a gravidade, limite a velocidade de queda e atribua o resultado a move.y
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
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