Como Criar Jogos : Tutorial de Movimentação para jogos de FPS , Como Fazer o Player se mover Unity C#

 



Olá sejam Bem Vindo ao Curso em Texto Criação e Games,  escolhi o formato texto por ser mais objetivo e rapido e facilitar o acesso ao codigo, assim você apenas copia o Script e testa em seu computador ! 

O Objetivo aqui é Criar um Jogo de FPS de Zombie,  vou Chamar meu Jogo de Zombies Killer porque faz sentido e vou publicar as atualizações dele junto ao curso no site R Play Games Online, onde você pode testar o avanço sem precisar baixar.

Vou assumuir apartir desse ponto que você entende a interface da Unity, que sabe adicionar um game Object, e que sabe fazer um Prefa, alem de saber criar um script Unity C#..

Vou assumir tambem que você sabe como adicionar umscript a um Game Object em cena, porem caso não saiba deixe nos comentarios que eu farei um conteudo extra focado nessa sua duvida e dessa forma ajudarei os outros alunos ! 

Vamos direto ao ponto, como fazer um jogo de FPS de Zombies.

Vamos definir rapidamente o conceito do jogo sem muita enrolação ! 
Jogo de zombies onde você na verdade é um caçador de recomepnsas, você invade lugar infestado em busca de Dinheiro e Objetos de Valores, seu nome é Jhon " Classico " e você vai ter algumas armas, vamos definir isso bem mais para frente ! 

Nesse artigo vamos focar em faser o nosso Player andar.

Observação : Entenda o Conceito de Objeto Pai e Objeto Filho antes de seguirmos em frente ! 
Na Unity podemos jogar um objeto dentro do outro na jenala Hierarchy, apenas clicando sobre o objeto, segurando o clique e arrastando sobre o outro objeto e soltando o clique, dessa forma o objeto arrastado se torna filho, e o objeto base se torna o pai, dessa forma tudo o que o pai faz, o filho tambem faz ! 


Ok Crie seu projeto, Crie uma nova cena e adicione na cena um objeto plano para ser o chão, coloque um compnente de fisica no objeto chão.

Passo a passo para adicionar um objeto em cena é, no menu superior na Unity tem um campo Chamado Game Object, clique ali depois busque por 3D Object  e em seguida busque por Plane  ao clicar ele será adicionado em cena.

pronto temos um chão, Agora vamos colocar um colisor para não cairmos atraves do chão 
Clique em Component no menu superior, e em seguida Physics, depois clique em Mesh Collider.

Feito isso aumente a escala do seu Plano até ter um chão legal ! 

Agora vamos Criar o nosso Jhon, na verdade vamos criar o que virá a ser o Player.
Adicioneum novo Game Object chamado Capsule, quando ele estiver em adicionado coloque um Component de Physics " Fisica" , Esclhe o Componente de Fisica Chamado Character Controller, vamos usar ele para trabalhar com os controlles do Personagem, o Character Controller tem varios recursos legais para se fazer um Player com Unity ! 

Bomo para mantermos o Desenvolvimento Minimamente Organizado, vamos fazer uma pasta nova no projeto no lado esquerdo na aba Project, Crie uma nova pasta chamada Script  em seguida uma pasta dentro da pasta Script chamada  Player 
Vai ficar assim Script -> Player , isso Facilita a localizações futuras ! 

Vamos dentro da pasta  Player criar um Script / Codigo C#  chamado Player_Controller

Feito isso vamos direto ao codigo, vou aproveita para  Explicar a extrutura basica do Codigo  apenas nesse artigo, depois vou explicar linha por linha o que o codigo faz para que você entenda.

Frase do Dia : Programação vai muito alem de logica, precisamos ter muita criatividade tambem ! 



 



A estrutura Basica de um Codigo Unity C# 
--------------------------------------------
 tudo que estiver com // " duas barras" na frente é comentario, comentario não executa como codigo, ok ! 

public class Player_Controller: MonoBehaviour 
{
     public float varivel = 20.0f;
 
    void Start(){
        
    }

    void Update(){
       
     }
  
}

---------------------------------------- Codigo Comentado Abaixo 

public class Player_Controller: MonoBehaviour 
// Aqui acima é feita a criação da Classe o nome Player_Controller  tem que ser exatamente o nome do Script criado lá no painel da unity, se tiver um erro  ou qualquer variação no nome o codigo não executa! 
{

     public float varivel = 20.0f; // A estrutura de criação de Variavel é simples, Primeiro você define se é Publica ou Privada, publico é legal porque fica visivel no painel para rapidas alterações. 
 - > Em seguida você define o tipo da variavel, float, int, string e assim por diante.
 ->  Por ultimo você coloca um valor para a variavel.

    // Na função Start você vai colocar dentro das chaves { } apenas aquilo que vai acontecer no exato instante em que a cena carregar 
    void Start()
    {
        // aqui dentro você vai coloras todos os codigos para serem executados ao iniciar o jogo / cena
    }

    // Update é uma função que executa continuamente a cada atualização, ou basicamente tudo dentro do Update vai ficar sendo executado sem parar .
    void Update()
    {
        // aqui vai todo o codigo que será executado para ações repetidas no sistema ! 
     }

    
}


---------------------------------------- -----------------------------------

Antes de prosseguir vamos definir basicamente em nossa mente o que o Player faz em sua movimentação 
Primeiro o Player precisa se Mover, então para ele se mover é necessario Velocidade, depois precisamos Pular, porem para pular é necessario força de Salto ou velocidade de salto e Gravidade, alem disso o Player prcisa Girar no proprio Eixo para poder virar para os lados,  precisamos cair tambem e por ultimo ele precisa morrer. 


Pronto estabelecido bem por cima o que precisamos para iniciar vamos definir as variaveis 
Observação : as variaveis vão possir valores iniciais aleatorios, depois vamos ajustar os valores como acharmos melhor !

Observação 2 : o interessante é as variaveis terem nomes em ingles, mas nada impede de fazer em portugues, porem sempre sem acentos ou espaço, use underline para separar palavras, pode ocorrer por demencia de quem vos escreve eventualmente misturar variavel em portugues e ingles, mas prometo me esforçar para fazer tudo em ingles ! 

------------------------Variaveis definidas abaixo ------------------------

public float speed = 6.0F; // variavel que vai controlar a velocidade de movimentação 
public float jumpSpeed = 8.0F; // aqui é a nossa força de salto para o player pular
public float gravity = 20.0F; // aqui é a força da gravidade que vai puxar o player para baixo 
public float rotateSpeed = 3.0F; // nossa velocidade de rotação no proprio eixo para olhar para o lado 
private Vector3 moveDirection = Vector3.zero; // Vector3 descreve um vetor no espaço 3D, normalmente usado como um ponto no espaço 3D
public bool cair = false; // aqui vamos usar essa variavel para saber se o player esta caindo ou não 
public bool morrer = false; // e por fim vamos precisar saber se o player esta vivo ou morto 


Ok definimos as variaveis agora vamos escrever o codigo, vou comentar cada parte dele ! 

-----------------------------Abaixo inicia o codigo ----------------------------


public class Player_Controller : MonoBehaviour
{
        public float speed = 6.0F;
public float jumpSpeed = 8.0F;
        public float gravity = 20.0F;
        public float rotateSpeed = 3.0F;
        private Vector3 moveDirection = Vector3.zero;
public bool cair = false;
public bool morrer = false;

// acima temos as variaveis definidas dentro do nosso codigo, fora de todas as funções dentro da classe 
  // Use o Start para executar tudo o que vai acontecer no exato momento em que a aplicação iniciar, 
  // Porem isso acontecerá uma unica vez, apenas quando a cena for carregada ! 
    void Start()
    {
Cursor.visible = false; // esse comando faz o cursos do Mause a Setinha desaparecer, ela aparece novamente se você apertar ESC no teclado, para Jogo FPS é interessante deixar o Cursos Invisivel.
    
    }

    // No Update vamos executar tudo o que for acontecer repetidamente 
    void Update()
    {
CharacterController controller = GetComponent<CharacterController>();
                // Acima nos vamos acessar o Component Character Controller
                // Criamos a Variavel controller do tipo Character Controller 
                //  Aqui GetComponent<CharacterController>(); quer dizer que o sistema vai buscar automaticamente pelo componente e vai atribuir a variavel, porem o compnent precisa estar aplicado ao Game Object


if (controller.isGrounded){ // Esse if nos usamos para verficar se o Player esta tocando o Chao 
cair = false; // se está tocando o chao então não estamos caindo, por isso cair é false
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;

                        // O Bloco acima cria um novo Vetor no espaço 3D porem de acordo com nossos inputs, no        
                              // caso estamos usando o Input.GetAxis("Horizontal") e o Vertical, isso basicamente pega os         
                             //  Iputs setas ou W,a,s,d e aplica um valor de +1
                             // no final do bloco pegamos esse + 1de acordo com o botão precionado e multiplicamos vezes
                            // a velocidade que esta atribuida a variavel Speed
                            // veja a estrutura original sem os input
                           // moveDirection = new Vector3(eixo x, eixo y, eixo z);
if (Input.GetButton("Jump")){ // essa estrutura pega se o  botão espaço for precionado
moveDirection.y = jumpSpeed; 
                               // lembra da variavel movedirection que pega o espaço 3D , bom vamos atribuir ao eixo y  o valor da variavel Jump Speed, basicamente estamos aplicando uma força 
}

         }else cair = true ; // aqui estamos fora da verificação do personagem tocando o chao, sendo assim se não estamos tocando o chão obviamente estamos caindo então cair  = verdadeiro
moveDirection.y -= gravity * Time.deltaTime; // aqui fazemos igual no pulo porem ao contrario
controller.Move(moveDirection * Time.deltaTime); // aqui nos multiplicamos o move direction por Time.delta time para ter um melhor controle nas alterações de FPS, deve multiplicar por Time.deltaTime. Quando você multiplica com Time.deltaTime, você essencialmente diz : Eu quero mover este objeto 10 metros por segundo em vez de 10 metros por quadro..
//Aqui vamos Rotacionar o Player  usando a expressão transform.Rotate(0,0,0);
                               // dentro dos valores colocamos no eixo Y vamos colocar um input para pegar a variação 
                               // da movimentação do Mouse no eixo X e aplicar a rotação equivalente X e mutiplicar pela variavel rotateSpeed que controla a velocidade de rotação do Personagem 

transform.Rotate(0, Input.GetAxis("Mouse X")*rotateSpeed, 0);
       }// chegamos ao final do Update 
void LateUpdate()
{ // aqui vamos executar algumas coisas depois do update, coisa que não precisa ser verificada toda hora 
if(transform.position.y < -10){ // vamos verificar se a posição do player no eixo y é menor que -10
                 // se a posição for menor que -10 no eixo y vamos redefinir a posição do player pelo codigo abaixo 
Vector3 newPos = new Vector3(0,1,0);
transform.position = newPos;
}
}

-----------------------------Acima o final do codigo  ----------------------------



ufa chegamos ao final. é bem simples de se entender, porem é importante entender cada linha para saber oque está acontecendo, se ficou alguma duvida em algum codigo comenta ai que acrescento como comentario e observação ! 

No proximo artigo vou abordar a Camera, como vamos trabalhar na movimentação dela e em seguida vamos evoluindo Caso queira testar esse projeto clique aqui >> http://rplaygames.com/game.php?Game=98

Caso queira me apoiar e adquirir esse conteudo completo, não só com todos os codigos e explicação detalhada mas tambem o projeto fonte editavel com todos os assets inclusos.

Clique Aqui para Adquirir o Curso Completo com os assets e um jogo completo para modificar ! 
 



Comentários