Unity4All

Introdução – UI (User Interface)

O Unity 2017 utiliza um sistema de objetos para ajudá-lo a criar a sua interface. Cada objeto tem uma utilidade e eles trabalharão juntos na composição dos menus, medidores de status, marcadores e tudo que for necessário mostrar ao Player. Na hierarquia do Unity, conforme você acrescenta os objetos, eles vão sendo inseridos sempre na frente dos que já estão na tela, sendo os de cima menos importantes que os de baixo. Portanto, se na hierarquia você tiver três objetos: - janela A - janela B - janela C A janela A aparecerá na tela do jogo atrás da janela B, que estará atrás da janela C, que ficará na frente de todas. O Unity usa a própria ordem da hierarquia para colocar os objetos em ordem no jogo.

 

Dica da Asset Store: Há um asset chamado Sorting View (free) que pode ajudá-lo a organizar as imagens no seu jogo, se você estiver com problemas.

Objetos da UI

A princípio, o primeiro objeto que deve ser criado é o CANVAS, que será a “tela” onde você colocará todos os outros objetos da UI. Um jogo p2D pode ser praticamente feito no Canvas, a não ser que use elementos 3d. No entanto, por vários motivos, vamos dar preferência a usar objetos 2d que estejam fora do Canvas, quando formos fazer esse tipo de jogo.

O Canvas é inicialmente muito maior que o cenário, justamente para não atrapalhar a visão da sua cena. Ao rodar o jogo, ele ocupará a tela normalmente, não se preocupe. Os objetos que podem ser colocados como filhos do Canvas são:

a) Image - ao adicionar uma imagem, o objeto virá com um transformador diferente do usual, além de um componente chamado IMAGE, que pede um sprite (uma imagem inteligente). É importante lembrar que essa imagem deve ser configurada como SPRITE antes de ser adicionada ao componente Image.

b) Panel - o panel é basicamente o mesmo que Image, porém ele já começa ocupando todo o espaço do Canvas, portanto é mais útil para criar janelas e espaços maiores.

c) Button – esse é o objeto que cria os botões do jogo, um dos mais importantes. Você pode escolher como o botão se comporta quando o mouse entra na sua área, quando o Player clica ou o ativa. Também determina, por script, o que acontece quando clicarmos o botão (ou qualquer outro evento).

d) Text – esse é o objeto que insere texto no Canvas.

e) Raw Image – a imagem crua. Permite que você crie uma imagem que não seja um sprite. Como não são inteligentes, são mais pesadas, mas preservam todas as condições originais da imagem original.

f) Slider – o slider é um medidor que dá valores em float ou int para diversos fins. É a barra de hit points, stamina, mana de um jogo. A imagem diminui ou aumenta conforme os valores.

g) Scrollbar – na prática, funciona como o slider, ela distribui valores, mas está configurada para ser usada com janelas. É a barra de rolagem das janelas. Deve ser utilizada junto com um IMAGE com o componente SCROLLRECT que permitirá criar janelas que não cabem na tela e precisam de rolagem. É um processo relativamente simples que trataremos nas próximas aulas ou conforme a necessidade.

h) Toggle – aciona true ou false. É usado para receber informação do jogador.

i) InputField – Um dos objetos mais importantes, é o campo de texto, em que o jogador poderá entrar com alguma informação de texto que será utilizada no jogo, como seu “nome”.

j) EventSystem – O event system é o gerente de todos os eventos provocados pela UI, especialmente importante para configurar os botões. Não é necessário alterá-lo, a menos que saiba o que está fazendo, e nunca se deve apagá-lo, pois o Canvas não funciona sem ele.

Dica da Asset Store: Há um asset chamado TextFx ($ 30,00) que pode ajudá-lo a criar efeitos interessantes de texto no seu jogo

Introdução à programação Vamos cobrir a programação necessária para fazermos nossos botões funcionarem, assim teremos um botão NEW GAME e um botão QUIT que já farão o que quisermos. O que é um método? Método (ou função) é um comando, uma ordem que daremos ao programa. É bem simples, se queremos que o programa faça um conjunto de ações, como abrir uma cena nova, tocar um som e disparar partículas, podemos juntar essas ações em um método chamado

NewGame( )

Sua forma é a seguinte:

public void LoadNewGame( ) { }

Observe: usamos o “public” porque queremos que o botão acesse este método de fora dele, se fosse private, nada fora do script poderia acessá-lo. Também usamos o void, porque esse método não vai retornar um valor, vai só executar algumas ações. LoadNewGame foi o nome que eu escolhi para esta função (a notação do método sempre deve ser com letra maiúscula para cada palavra, todas juntas). Tudo que queremos fazer vai ficar entre as chaves. No Unity, sempre que queremos fazer algo, como carregar uma cena ou sair do jogo, começamos a ação com o “lugar” onde aquela ação está. Dentro desse lugar, separado por ponto, encontraremos a nossa ação (ou seja, o método que queremos executar).

 

Para uma cena chamada prologue, podemos fazer assim:

Application.LoadLevel(“prologue”);

Application.Quit( );

Observação! Sempre que você fizer uma linha de comando, ela deve terminar com ;

Mesmo que o comando não receba parâmetros (como ‘prologue’) ele deve vir com parênteses vazios, como por exemplo Application.Quit ( ) ;

Agora coloque esses comandos nos métodos que criamos e defina os botões no Inspector para acessar o script, a função e executar o comando!

Level Design - Terrain e Colliders

 

 

 

Level design e Terrain

Vamos começar a pensar um pouco em level design, como será o mundo que vamos criar para que o nosso personagem encontre suas missões, problemas e enfrente suas dificuldades?

a)      Crie o Terrain pelo caminho indicado. Vá até a aba Hierarchy e clique em create, então 3D object / Terrain.

b)      No Inspector, com o Terrain selecionado, há alguns ícones importantes para a edição do Terrain. Eles são:

 

1)       Raise Terrain – Aumenta o tamanho do terreno, use shift para diminuir.

2)      Terrain Height – Define o tamanho máximo do terreno e, ao aumentar, ele não passará daquele máximo definido. Bom para criar plataformas e platôs.

3)       Terrain Smooth – Use essa ferramenta para suavizar o terreno, ele vai calcular a diferença entre alturas e fazer uma aproximação.

4)      Pintura de texturas – Essa ferramenta torna possível selecionar uma imagem do seu projeto para ser pintada como textura no terreno. Crie a textura em Add Texture e comece a pintar!

5)       Trees – Adicione uma árvore e use esse pincel para pintar árvores (objetos) no seu terreno.

6)      Grama e Detalhes – Com essa ferramenta, você pode pintar grama (billboard) ou pequenos objetos como pedras e outros detalhes.

7)       Settings – aqui você ajusta toda a configuração do Terreno.

Dica de Planejamento:

Coloque o terreno no ponto mais baixo sempre, crie as elevações conforme os lugares por onde vai permitir que o jogador passe. Não é possível abaixar mais (além do ponto mais baixo), portanto planeje adiante!

 

 

 

 

 

 

 

Colliders

Vamos criar um objeto 3d (um cubo) e adicionar um componente (Box Collider). O Box Collider vai criar colisões e identificar quando o jogador (que também tem um Capsulle Collider) tocar nele.

 

A ideia é que, ao entrar no Collider (para isso, vamos ter que habilitar a opção Is Trigger no Inspector), o jogador sofra algum dano.

 

 

 

 

Programação

Primeiro vamos entender o que é um int – um número inteiro. O int é um tipo de variável que guarda apenas números inteiros, como 1, 2, 32 ou 1005. Ele é ideal para criarmos os hit points do nosso personagem. Primeiro, vamos importar um personagem usando Assets/Import Package/Characters

Depois, em Standard Assets no Projeto, busque a pasta Characters e escolha um Prefab (FP ou TP, First Person ou Third Person) e o arraste para o seu terrain.

Agora vamos criar um script no nosso personagem que vai guardar todas as nossas informações. Vamos chamar esse script de PC (Player Character).

public class PC : MonoBehaviour {

    //hit points
    public int currentHP;
    public int maxHP;

}

Criamos duas variáveis do tipo int – uma vai guardar quantos hit points temos no momento (currentHP) e a outra guarda qual é o máximo de hit points do nosso personagem (maxHP).

 

Agora vamos voltar ao nosso Cubo com BoxCollider.

Vamos criar um script novo neste objeto que terá o Trigger Collider, o script pode se chamar Trap.cs

void OnTriggerEnter(Collider other) {

}

Este método, no script do Trigger, é lido pelo Unity assim que algum objeto entra na área determinada pelo Trigger. Dentro dele, vamos colocar uma condição. O Trigger só vai realizar o comando se quem entrou for um Player (no seu tag). Fica assim:

void OnTriggerEnter(Collider other) {

                if ( other.CompareTag(“Player”) ){

                pc.hitPoints -- ;

}

}

O duplo sinal de subtração ordena que se subtraia um do valor. Portanto, se o hitPoints do jogador for 10, passará a ser 9. Mas para que consigamos acessar o script do pc, precisamos defini-lo no Start.

 

void Start( ){

pc = GameObject.FindGameObjectByTag(“Player”).GetComponent<PC>();

}

Obs: para que isso funcione, não esqueça de definir uma tag para o seu Player chamada Player!

 

Agora vamos usar nosso conhecimento de Canvas para mostrar os hit points do jogador. Voltamos ao PC.cs e vamos criar uma função que vai mostrar toda a informação no Canvas. Podemos chamar essa função de AdjustUI ( )

  void AdjustUI()
    {

 

   hpSlider.value = currentHP;
        
    }

 

Agora, vamos definir o hpSlider como uma variável do tipo Slider e dizer o seu valor no Start( )

using UnityEngine.UI;

 

//precisamos usar o UnityEngine.UI para definir variáveis do Canvas

public class PC : MonoBehaviour {

    //stats
    public int currentHP;
    public int maxHP;

        //canvas
    GameObject canvas;

    Slider hpSlider;  

 

 

void Start () {

canvas = GameObject.Find(“Canvas”);

hpSlider = canvas.Find(“HP Slider”).GetComponent<Slider>();

  

}

 

Agora, por fim, vamos usar o Update( ) para executar a nossa função AdjustUI ( )

O Update ( ) é uma função que é executada a cada frame, portanto, se o jogo rodar a 60 fps (frames por segundo) o Update vai rodar 60 vezes em um segundo. É a função ideal para executar atualizações em tempo real, mas também é perigoso, pois pode ser muito pesado se estiver rodando loops ou muitas funções ao mesmo tempo.

void Update () {

 

AdjustUI();

  

}