Movimentar um personagem na Unity é um dos aspectos fundamentais no desenvolvimento de jogos. Seja em um jogo de plataforma, RPG ou ação, um bom sistema de movimentação pode tornar a experiência do jogador mais fluida e responsiva. Existem diversas formas de implementar esse movimento, utilizando Rigidbody, Character Controller ou manipulando diretamente a posição do personagem com Transform. Cada abordagem tem suas vantagens e desvantagens, dependendo do tipo de jogo que você deseja criar. Neste guia, vamos explorar as principais maneiras de movimentar um personagem em Unity, ajudando você a escolher a melhor opção para o seu projeto.

Vamos começar pela base: o movimento do personagem. Para isso, utilizaremos o novo sistema de entrada da Unity, que torna a codificação mais flexível e escalável.

Unity
Unity

Sistema de Entrada da Unity

A Unity implementou um novo sistema de entrada (Input System) que permite configurar controles rapidamente para múltiplas plataformas, como PCs, consoles, dispositivos móveis e até realidade virtual. Isso facilita muito a adaptação do jogo para diferentes tipos de controle, sem a necessidade de reescrever o código para cada plataforma.

Por essa razão, vamos utilizar esse novo sistema para tornar nosso jogo mais moderno e preparado para o futuro.

Vantagens do Novo Sistema de Entrada:

  • Suporte a múltiplas plataformas de forma nativa;
  • Facilidade na configuração dos controles sem precisar modificar diretamente o código;
  • Melhor organização e modularidade do código-fonte;
  • Suporte a eventos e ações, permitindo maior flexibilidade na programação dos movimentos.
InputSystem
Novo sistema de entrada

Movimento do Personagem

O movimento do personagem pode ser implementado utilizando componentes como Transform ou Rigidbody2D. O Transform é útil para animações simples e movimentos que não precisam de interação com a física do jogo, enquanto o Rigidbody2D permite interações físicas realistas, como colisões e gravidade.

Neste curso, utilizaremos o Rigidbody2D para garantir um movimento mais dinâmico e realista. A partir da videoaula a seguir, você verá uma demonstração prática de como configurar esse componente para movimentar seu personagem.

Logo, podemos criar a classe ManagerInput,  a qual será responsável por capturar as informações de entrada e iremos fazer a codificação a seguir:

Criando a Classe ManagerInput

A classe ManagerInput será responsável por capturar as informações de entrada do jogador e repassá-las ao personagem. Dessa forma, conseguimos separar a lógica de entrada da lógica de movimentação, tornando o código mais modular e fácil de manter.

Aqui está o código da ManagerInput:

using UnityEngine;
using UnityEngine.InputSystem;
public class ManagerInput : MonoBehaviour
{
   private float inputX;
   public void SetInputMove(InputAction.CallbackContext value)
   {
    inputX = value.ReadValue<Vector2>().x;
   }

   public float GetInputX()
   {
    return inputX;
   }

}

Após criar a classe ManagerInput, devemos associá-la ao objeto Player dentro da Unity. Isso garantirá que os comandos de entrada sejam corretamente detectados e processados.

Implementando a Classe Player

Agora que temos um sistema de entrada funcional, precisamos implementar a classe Player, responsável por aplicar os movimentos ao personagem com base nas entradas do jogador.

Classe Player

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

public class Player : MonoBehaviour
{
[Header("Dependencies")]
[SerializeField] ManagerInput managerInput;
[SerializeField] Rigidbody2D rigidBody2D;

[Header("Physics")]
[SerializeField] float speed;

// Start is called before the first frame update
   void Start()
   {

   }

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

   private void Move()
   {
    rigidBody2D.velocity = new Vector2(managerInput.GetInputX() * speed, rigidBody2D.velocity.y);
   }

No método Move(), utilizamos a propriedade velocity do Rigidbody2D para modificar a velocidade do personagem com base na entrada do jogador. Esse método será chamado a cada FixedUpdate() para garantir um movimento fluido e consistente.

Melhorando a Movimentação

Agora que o movimento básico está implementado, podemos aprimorá-lo adicionando suavização e aceleração progressiva para deixar o jogo mais realista e agradável de jogar.

Adicionando Suavização no Movimento

Podemos implementar uma suavização no movimento utilizando Mathf.Lerp, que interpola suavemente entre dois valores:


private float currentSpeed;
private float acceleration = 5f;

private void Move()
{
float targetSpeed = managerInput.GetInputX() * speed;
currentSpeed = Mathf.Lerp(currentSpeed, targetSpeed, Time.fixedDeltaTime * acceleration);
rigidBody2D.velocity = new Vector2(currentSpeed, rigidBody2D.velocity.y);
}

Isso fará com que o personagem acelere e desacelere de maneira gradual, em vez de mudar instantaneamente de velocidade, criando um movimento mais natural.

Conclusão

Neste primeiro módulo, aprendemos como implementar o sistema de entrada e a movimentação do personagem em um jogo de plataforma 2D na Unity. Com o uso do Rigidbody2D, conseguimos garantir um movimento realista, e com a suavização do movimento, criamos uma experiência mais fluida para o jogador.

Agora é sua vez de colocar a mão na massa! Teste o código, faça modificações e experimente diferentes velocidades e acelerações. No próximo módulo, abordaremos o sistema de pulo e a interação com o cenário. Vamos nessa!

Agora, é sua vez de colocar a mão na massa!


Aproveite para pegar um ebook de criação de um jogo 2D.
Jogo de Nave

 

Nosso canal no youtube: