[Tutorial] Como criar um jogo com unity? | Parte 1

Primeiro, vamos criar um jogo bem básico, aprender alguns fundamentos e dali partir para projetos maiores, acredito que vale a informação, que eu não sou um profissional da área, sou apenas um entusiasta que me esforço para fazer parte, dito isso, vamos começar.

A ideia do jogo é bem simples, faremos o jogo do dinossauro do google.

Esse é um jogo bem simples, portanto acredito que seremos bem sucedidos, vamos começar.

1º Passo

Primeiro vamos criar o GameObject player, adicionar os componentes Rigidbody 2D e Box Collider 2D.

Agora vamos criar um outro GameObject chamado floor, também devemos adicionar os componentes Rigidbody 2D e o Box Collider 2D.

Precisamos alterar o Body Type do Rigidbody 2D de Dynamic para Static. (Fazemos isso porque queremos que o floor não tenha física, ou seja, quando o player cair no chão, não queremos que o floor voe em direção ao void)

Não podemos esquecer de alterar a posição e o tamanho dos GameObjects, você pode ver o meu como ficou como exmeplo.

Em seguida o resultado no Inspector e a Tela do jogo.

Player

Inspector do player

Floor

Inspector do floor

Tela do jogo

Tela do jogo

2º Passo

Agora vou apresentar a forma que eu gosto de organizar os meus arquivos, fique a vontade para fazer como você quiser, ou se preferir fazer igual a mim.

Dentro de Assets vou criar a pasta Scripts, e dentro de Scripts vou criar a pasta Player, agora, dentro de Player, vou criar o script PlayerBase.

As pastas devem ficar como na imagem a seguir.

Organização de pastas

3º Passo

Após criar o script PlayerBase, vamos arrastá-lo para o GameObject player.

Precisamos também criar uma tag com o nome de Floor e adicionar a tag ao GameObject floor.

Caso tenha dificuldade nessa parte, clique aqui como criar uma tag no unity.

Para fazer o player pular ao pressionar Space precisamos criar algumas variáveis.

  • Uma variável que nos dê acesso ao Rigidbody 2D.
  • Outra que armazene a força do salto.
  • E mais uma que saiba se o player está tocando o chão.

Então vamos criar uma variável chamada "_rb" do tipo Rigidbody 2D, para que a gente possa brincar um pouco com a física do player.

Também precisamos criar uma variável "_forceJump" do tipo float.

Por último mas não menos importante, temos que criar o _isGrounded do tipo bool. Nós só podemos deixar o player pular quando ele estiver encostando no chão, caso contrário, ele conseguiria ficar pressionando Space o tempo todo, e acabaria saindo do mapa.

Vamos começar a codar

Assim que abrir o arquivo PlayerBase teremos o seguinte arquivo.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerBase : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

Vamos apagar o método Start, e as seguintes importações using System.Collections;, using System.Collections.Generic; já que não usaremos eles.

Além disso, vamos criar as variáveis que já falamos:

using UnityEngine;

public class PlayerBase : MonoBehaviour
{
    [SerializeField] private Rigidbody2D _rb;
    
    [SerializeField] private float _jumpForce;
    [SerializeField] private bool _isGrounded;
    
    void Update()
    {
        
    }
}

Em seguida vamos tratar o input do usuário, para fazer o player pular ao pressionar Space. E não esquecendo que precisamos saber se o player está encostando no chão, ou seja, esse é o lugar para validar essa colisão.

using UnityEngine;

public class PlayerBase : MonoBehaviour {
    [SerializeField] private Rigidbody2D _rb;

    [SerializeField] private float _forceJump;
    [SerializeField] private bool _isGrounded;

    private void Update() {
        if (Input.GetKey(KeyCode.Space) && _isGrounded) {
        
        }
    }
}

Dentro do if vamos colocar a ação do salto usando a variável _rb, vai ficar assim.

using UnityEngine;

public class PlayerBase : MonoBehaviour {
    [SerializeField] private Rigidbody2D _rb;

    [SerializeField] private float _forceJump;
    [SerializeField] private bool _isGrounded;

    private void Update() {
        if (Input.GetKey(KeyCode.Space) && _isGrounded) {
            _rb.velocity = _forceJump * Vector2.up;
        }
    }
}

Dessa forma o player já seria capaz de pular se e somente se o _isGrounded não tivesse um valor null, precisamos resolver isso, então faremos o seguinte forma.

Vamos usar dois métodos padrões da classe pai MonoBehaviour, o OnCollisionEnter2D e o OnCollisionExit2D, esses métodos eles são bem intuitivos, mas vamos falar um pouco sobre eles.

O método OnCollisionEnter2D vai ser executado toda vez que o gameObject (Que no nosso caso é o player) colidir com algo.

Já o método OnCollisionExit2D será executado toda vez que o gameObject já estiver em uma colisão, e o gameObject sair da colisão, ou seja, ele afastar/desencontrar/desencostar do outro gameObject.

Pronto, agora entendemos sabemos quando eles serão executados, então precisamos saber o que faremos com eles, certo? A ideia é descobrir se a colisão foi feita com o gameObject floor. Como podemos fazer isso? Lembra da tag Floor que criamos? Vamos usá-la para garantir que o player colidiu com o floor, e não com um outro gameObject qualquer.

Para fazer essa comparação vamos usar a função CompareTag(), show, então vamos ao código.

using UnityEngine;

public class PlayerBase : MonoBehaviour {
    [SerializeField] private Rigidbody2D _rb;

    [SerializeField] private float _forceJump;
    [SerializeField] private bool _isGrounded;

    private void Update() {
        if (Input.GetKey(KeyCode.Space) && _isGrounded) {
            _rb.velocity = _forceJump * Vector2.up;
        }
    }

    private void OnCollisionEnter2D(Collision2D collision) {
        _isGrounded = collision.gameObject.CompareTag("Floor");
    }

    private void OnCollisionExit2D(Collision2D collision) {
        if (collision.gameObject.CompareTag("Floor")) {
            _isGrounded = false;
        }
    }
}

Uma última informação sobre os métodos OnCollisionEnter2D e OnCollisionExit2D, eles recebem um parâmetro chamado collision, com essa variável temos acesso direto ao gameObject e quase tudo que tem dentro dele.

4º Passo

Não podemos esquecer de preencher as variáveis no inspector.

  • Siga a seta vermelha arrastando o component Rigidbody 2D até a variável _rb.
  • Digite o valor 7 (Ou outro que mais lhe agrade) na variável _forceJump
  • E quanto ao _isGrounded pode manter desmarcado mesmo.

Como preencher as variáveis

Agora é só executar o jogo e testar, o player vai pular toda vez que pressionar o Space.

Finalização

O jogo ainda não está concluída, mas conseguimos fazer um avanço bacana, vou preparar a Parte 2 o mais rápido que eu conseguir, mas até lá você pode tentar finalizar o jogo caso deseje.

De qualquer forma, espero que a Parte 1 tenha sido útil para você de alguma forma, caso tenha alguma dúvida é só comentar aí que farei o meu melhor para lhe ajudar.

Caso você tenha alguma correção ou crítica de/a algo, por favor, me avise, serei mais do que grato em saber onde errei.

Desejo sorte a você e bons estudos.

:}