[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
Floor
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.
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.
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.
:}