Desenvolvendo o nível

Expandindo a fase

Nível maior

Movimento da câmera

Como jogadores, ainda não podemos navegar essa fase, pois a câmera não segue o personagem. Assim como fizemos para movimentar o jogador, podemos adicionar à câmera um script para movimentá-la também, já que a câmera também é um objeto manipulável.

  1. Crie um novo script para a câmera, e dê um nome como “CameraMovimentation” ou algo similar

Queremos que a nossa câmera siga o jogador, para isso precisamos saber onde ele está dentro do script

  1. Antes de Start() e Update(), crie a seguinte variável pública, que servirá de referência ao jogador:
    public class CameraMovimentation : MonoBehaviour
    {
       public GameObject player;
       .
       .
       .
    }
    
  2. Salvando o código, volte no editor e arraste o objeto jogador até a caixa correspondente à essa variável no inspetor

    Linkando um objeto à uma variável pelo editor

⚠ Lembre-se desse processo de atribuir componentes/objetos à variáveis públicas pelo editor, não a ilustraremos mais a partir daqui

Agora poderemos acessar propriedades do jogador como sua posição dentro do script da câmera

  1. Dentro de Update(), insira o seguinte código:
    void Update()
    {
       transform.position = new Vector3(player.transform.position.x, transform.position.y, transform.position.z);
    }
    
    

Note que “transform.position” se refere à posição do objeto que possui o script que estamos escrevendo, neste caso a câmera, enquanto “player.transform.position” se refere a posição do jogador

Esse código fará com que a câmera se movimente horizontalmente para seguir o personagem, mas não verticalmente

A câmera continuará se movimentando onde quer que formos, podendo expor as partes que não queremos que o jogador veja

GIF bordas da fase

  1. Para resolver isso, definimos limites ao movimento da câmera, permiindo que ele se mova somente a partir de pontos específicos de x.
    • Nesse caso a câmera só irá mexer quando ela estiver entre a posição 0 e 50 de x.
    public class CameraMovimentation : MonoBehaviour
    {
       public GameObject player;
    
       public float minCameraPosition = 0;
       public float maxCameraPosition = 50;
       .
       .
       .
    }
    
    void Update()
    {
       if(player.transform.position.x >= minCameraPosition && player.transform.position.x <= maxCameraPosition)
       {
          transform.position = new Vector3(player.transform.position.x, transform.position.y, transform.position.z);
       }
    }
    

    GIF camera limitada

Adicionando obstáculos

Com as mecânicas básicas de movimento feitas, agora você pode criar um nível símples como quiser!

  1. Adicione plataformas e obstáculos símples, e altere as variáveis de velocidade e pulo do jogador caso ache necessário

⚠ Lembre-se que todos os objetos sólidos precisam ter um collider, você pode addicionar um collider à cada bloco individual de terra/grama caso prefira, para que você possa copiar e colar os objetos à vontade

  1. Adicione também um objeto, como uma moeda, para ser o objetivo da fase

    Fase com obstáculos e objetivo

Você pode ter percebido que ao pular e colidir com o lado de um bloco, o jogador gruda e para de cair, isso é porque os colliders possuem atrito, que por padrão é bem alto

Atrito dos colliders

Para mudar o atrito, precisamos atribuir um novo material físico aos colliders

  1. No explorer, clique com o botão direito do mouse > create > physics material 2D e dê um nome qualquer
  2. Selecione o material recém criado e, no inspector, reduza o atrito para 0 (ou qualquer valor desejado)
  3. Na barra de pesquisa da aba de hierarquia, digite “t:collider2D”, isso irá destacar na tela todos os objetos que possuem um collider

    comando na barra de pesquisa ressaltando objetos com collider

  4. Selecione todos os objetos ressaltados (com excessão do player) e arraste o material criado até a caixa “Material” no componente Box Collider 2D

    Material novo no componente

Fim da fase

Para oficializar que o player finalizou a fase, vamos fazer com que tocar na moeda nos dê parabéns pelo console!

  1. Adicione um collider 2D à moeda, de qualquer formato que quiser (tente modificar a propriedade “Edge Radius” do box collider para criar um quadrado com cantos redondos)
  2. Adicione também um script à moeda, dentro do qual adicionaremos o código que nos dá parabéns por alcançá-la Para detectar que tocamos na moeda, o Unity possui um método (Assim como Start() e Update()) que é chamado sempre que algo entra em contato com o collider do objeto

  3. Adicione o seguinte método ao script:
    public class GameGoalController : MonoBehaviour
    {
       // Start is called before the first frame update
       void Start()
       {
    
       }
    
       // Update is called once per frame
       void Update()
       {
    
       }
    
       // OnCollisionEnter2D é chamado quando uma colisão com outro objeto se inicia
       void OnCollisionEnter2D(Collision2D other)
       {
          Debug.Log("Parabéns, você me achou!");      // Imprime uma mensagem ao console
       }
    }
    

    Modificando o movimento

    Até agora, o nosso jogador tem a capacidade de fazer um único pulo… mas poderiamos ter mais possibilidades de design de nível se o jogador tivesse um pulo duplo. Podemos também, caso desejarmos, impedir que o jogador faça “wall jump”, fazendo com que os pulos só resetem quando o jogador pisar no chão.

Antes disso, podemos também impedir que o jogador gire marcando a seguinte caixa em seu RigidBody2D

Freeze Rotation

Resetar pulo somente no chão

  private void OnCollisionEnter2D(Collision2D other){
      if (other.contacts[0].normal == Vector2.up) //Se tocar no chão reseta pulo
      {
      }
}

Muiltiplos pulos