CRIANDO UM RANKING MULTIPLAYER NA UNITY

TRABALHANDO COM LISTAS
Existem várias formas de trabalhar com os scores dos jogadores, mas nesse tutorial trabalharemos com arrays (listas) pois são mais fáceis de serem organizados, manipulados e monitorados no código.
BASE DO CÓDIGO
1
O script RankingController tem como função salvar um score associado com uma identificação do jogador, verificar se esse score é maior que algum dos scores já salvos, e modificar o ranking em caso positivo.
Considerando que o script já foi criado, iniciaremos duas listas para serem trabalhadas: highScoreValues (linha 9) e highScoreNames (linha10). A primeira para armazenar os valores da pontuação dos jogadores e a segunda para armazenar seus respectivos nomes.
Outra lista é necessária para executar o ranking. O array highScores (linha 8) será uma lista de textos, que serão exibidos na tela. Cada item dessa lista irá conter o nome e o valor da pontuação de cada jogador. É importante salientar que é necessário adicionar a linha using UnityEngine.UI (linha 3), pois a função Text[] (linha 8) e algumas outras funções deste código são importadas desta biblioteca.
CONFIGURANDO O AS LISTAS
2
No Start definimos o tamanho do ranking e os valores de cada colocação. A lista highScores, definida anteriormente, ditará o número de colocações do ranking (Esta quantidade fica a seu critério). Logo, as listas highScoreValues e highScoreNamesdevem receber este mesmo tamanho (linhas 14 e 15).
Cada item nas listas highScoreValues e highScoreNames recebe seu valor armazenado em PlayerPrefs (linhas 17 a 21). Na primeira vez que o código for compilado o ranking não terá valores, pois estes ainda não existem no banco de dados.
É importante que, quando houver alguma alteração na pontuação do ranking, os nomes dos jogadores devem acompanhar tal. Logo, todas alterações de ordem que forem aplicadas na highScoreValues devem ser aplicadas na highScoreNames, por conseguinte.
Na linha 23 a função DrawScores é chamada. Esta será explicada logo abaixo;
EXIBINDO O RANKING NA TELA
3
A função DrawScores (linhas 56 a 63) serve para unir os dados de nome do jogador (highScoreNames) e sua pontuação (highScoreValues) em uma única string (highScores). Ou seja, cada item na lista highScores conterá uma string informando uma pontuação e o jogador que a fez.
ORGANIZANDO AS POSIÇÕES NO RANKING
4
CheckForHighScore (linhas 35 a 54) é a função principal no código. Ela serve para verificar se o valor recebido (_value) é maior que algum valor armazenado no ranking. A lista é organizada em forma decrescente, ou seja, o item highScoreValues[0] conterá o maior valor enquanto o item highScoreValues[n] (sendo n o último item da lista) será o de menor valor. Ao percorrer a lista (linha 37), para cada item da lista, o código compara se o valor recebido na função é maior que o valor armazenado (linha 39). Quando isso é verdadeiro, o código atualiza a posição dos itens posteriores (linha 41 a 45) e depois insere a nova pontuação (linhas 46 e 47).
Após a nova pontuação ser adicionada nas listas, a função DrawScores é chamada para atualizar a lista highScores. A função SaveScores também é chamada. Essa função serve basicamente para garantir que os dados do ranking continuem salvos mesmo após a reinicialização do jogo. Estes são os dados são carregados na função Start.
5
COMO UTILIZAR O CÓDIGO
Resumidamente, o script RankingController organiza e exibe em ordem decrescente uma série de números e suas respectivas ids. O modo de usar este código vai depender do jogo que você está criando. Abaixo segue a demonstração de como inserir os dados para serem compilados no script
public void NewScore ()
{
GetComponent<RankingController>().CheckForHighScore(points, name);
}
Onde points é uma int e name é uma string.
No projeto contido no link, utilizei de uma mecânica que salva a quantidade de vezes que o jogador aperta a barra de espaço em um tempo de 10s. Após o tempo acabar, o jogador coloca seu nome e clica no botão Save.
6
Anexei o script em um Game Object chamado Game Controller. Depois de feito, defini a quantidade de elementos no meu ranking, que basicamente é a quantidade de elemento contidos na lista (No meu caso coloquei 5 itens).
Depois é só referenciar cada item do script à um UI Text (como mostrado na figura).
O botão Save chama a função abaixo que está contida em um outro script do projeto:
public void InitialsEntered()
{
GetComponent<RankingController>().CheckForHighScore(totalClicks,playerName.text);
}
Esta é a mesma função que foi descrita antes. Ela chama o script RankingController onde totalClicks é a variável int, e playerName.text é a string.
 Download do projeto:
Referências:

Comentários

Postagens mais visitadas deste blog

Tutorial: Usando SQLite no Unity3D com C#

Criando um jogo multiplayer no Unity 3D com Photon Unity Networking – Parte 01

Tutorial: Utilizando Atributos no Unity3D