Programando pulo de personagem na Unity 3D

Utilizando o componente Rigidbody conseguimos uma mecânica de pulo simples e efetiva.

Para os jogos de plataformas no estilo Super Mario World, as mecânicas de pulo são fundamentais, afinal, o jogador não vai andar apenas em linha reta. Depende do modelo de jogo, as mecânicas de pulo são implementas através das animações com refinamento no IK.

Vamos criar um script que detecta se o usuário pressionou a tecla Space e se está no chão, para que só nessas condições o nosso personagem possa pular.

Utilizamos um cilindro como exemplo de personagem, se atente para que o mesmo contenha um componente de colisão. Para o componente de física, vamos adicionar via script a seguir.

Antes de mais nada, vamos criar um novo C# script chamado de PlayerJump, vamos inserir o código abaixo.

using UnityEngine;

//Requisitamos o componente Rigidbody
[RequireComponent(typeof(Rigidbody))]
public class PlayerJump : MonoBehaviour
{
	//Variável que controla a força do pulo
	public float jumpForce = 3.0f;

	//Variável que controla a massa/peso
	public float mass = 3.0f;

	//Acessamos o componente Rigidbody através dessa variável
	private Rigidbody rigidbody;


	//Variável de controle que nos diz se o personagem está ou não no chão
	private bool isGround = false;

	void Start()
	{
		//Assim que o script  é executado, obtemos o componente Rigidbody e atribuimos a nossa variável
		rigidbody = GetComponent<Rigidbody>();

		//Definimos o valor da massa via script
		rigidbody.mass = mass;
	}


	void Update()
	{
		//Verificamos se o usuário NÃO pressionou a tecla Space ou se não está no chão
		if (!Input.GetKeyDown(KeyCode.Space) || !isGround)
			return;

		//Adicionamos uma força ao Rigidbody
		rigidbody.AddForce(
			Vector3.up * jumpForce, //Para fazer o personagem pular, então multiplicamos (0, 1, 0) pelo valor do pulo
			ForceMode.Impulse // Ajustamos a força para o tipo Impulse
			);
	}

	//Verifica se o personagem tocou no chão
	void OnCollisionEnter(Collision collision)
	{
		isGround = true;
	}

	//Verifica se o personagem saiu do chão
	void OnCollisionExit(Collision collision)
	{
		isGround = false;
	}
}

O código acima está todo documentado e dispensa explicações, mas vamos entender o fluxo de execução.

  1. Personagem está parado;
  2. Player pressiona a tecla Space;
  3. Rigidbody adiciona força de impulso para cima;
  4. Script detecta que o player não está mais no chão;
  5. Personagem colide com o chão;
  6. Script detecta que o player retornou para o chão.

Para finalizar, vamos adicionar o nosso script ao personagem, configurando a massa como 1 e a força de pulo como 3. Perceba que assim que o script for inserido, o componente Rigidbody será inserido automaticamente.

Um complemento para essa mecânica pode ser vista no nosso artigo Criando movimentações de um simples personagem na Unity 3D.