Menu
CoddyTech

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.

challenge icon

Desafio

Médio

O 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, verticalSpeed aumenta por gravity a 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 maxFall unidades por segundo.
  • Quando o controlador estiver no chão e verticalSpeed for menor que 0, defina verticalSpeed como -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);
    }
}
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