Menu
CoddyTech

O Percurso

Parte da seção Criando jogos de verdade do Journey de Unity da Coddy. Lição 48 de 56.

Este capítulo cria um jogo de plataforma 3D. Você corre e pula entre plataformas flutuantes, anda em uma que desliza, toca nos pontos de controle para que uma queda não faça você voltar ao início, coleta gemas contabilizadas na tela, cruza a linha de chegada para chegar ao próximo nível e tenta superar seu melhor tempo. O jogo tem cinco scripts, que já estão no projeto desde o início: Player, MovingPlatform, Checkpoint, Gem e FinishLine. Os últimos quatro estão vazios por enquanto, e cada aula preenche um deles. O jogador é um CharacterController controlado pelas ações do Input System, e a câmera é filha dele, então ela o acompanha sem precisar de um script.

Um CharacterController se move de duas maneiras. Move(motion) o move por uma distância e não adiciona nada, então gravidade, pulos e Time.deltaTime ficam a cargo do script, como no capítulo Character Controller. SimpleMove(speed) recebe uma velocidade em unidades por segundo, ajusta-a pelo tempo do próprio quadro e adiciona gravidade; ele ignora o valor de y que você passar, então um personagem movido com ele cai de plataformas, mas nunca pode pular. Este cão pastor em um jogo de pastoreio visto de cima não precisa pular, então SimpleMove e a ação Move são tudo de que o script precisa:

using UnityEngine;
using UnityEngine.InputSystem;

public class Sheepdog : MonoBehaviour
{
    [SerializeField] private float speed = 6f;
    private CharacterController controller;
    private InputAction moveAction;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        moveAction = InputSystem.actions.FindAction("Move");
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
    }
}

O jogador do jogo de plataforma precisa pular, então mantém sua própria velocidade vertical e se move com Move, lendo as ações Move e Jump em vez da classe Input. A Unity recomenda uma chamada a Move ou SimpleMove por quadro: a caminhada e a queda entram na mesma chamada, e isGrounded descreve então todo esse movimento.

challenge icon

Desafio

Médio

Comece o jogo de plataforma com o jogador. O script Player tem speed (5), jumpHeight (1.5) e gravity (-9.81), o controller e uma velocity para a queda. Encontre as ações Move e Jump uma vez, em Start, e em Update:

  • Move faz o jogador andar a speed unidades por segundo: para a direita e para a esquerda ao longo de x, para frente e para trás ao longo de z.
  • A gravidade adiciona gravity * Time.deltaTime a velocity.y a cada quadro. Enquanto o controlador estiver no chão e velocity.y for menor que 0, defina velocity.y como -2 primeiro, para que o jogador permaneça pressionado contra o chão.
  • Cada pressionamento de Jump, enquanto estiver no chão, define velocity.y como Mathf.Sqrt(jumpHeight * -2f * gravity): um salto de jumpHeight unidades de altura. Manter Jump pressionado faz o jogador saltar uma vez, e não é possível saltar no ar.
  • Chame controller.Move uma vez, com o movimento e velocity juntos, multiplicados por Time.deltaTime.

Pressione Play e salte até as primeiras plataformas; depois, Check.

Experimente você mesmo

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
    [SerializeField] private float speed = 5f;
    [SerializeField] private float jumpHeight = 1.5f;
    [SerializeField] private float gravity = -9.81f;

    private CharacterController controller;
    private Vector3 velocity;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        // mova-se com a ação Move, pule com a ação Jump, caia sob a ação da gravidade
    }
}
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