Menu
CoddyTech

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.

challenge icon

Desafio

Médio

Adicione gravidade ao mergulhador para que sua queda acelere.

  1. No início de Update(), quando controller.isGrounded e verticalSpeed < 0f, defina verticalSpeed = -1f;.
  2. Some gravity * Time.deltaTime a ele e mantenha-o em -maxFall ou acima usando Mathf.Max.
  3. Antes da linha controller.Move, defina move.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

Pratique por conta própria: Playground de Unity