Como criar um leaderboard em C# e estimular a competitividade entre os jogadores do seu game

0 Flares 0 Flares ×

Uma forma de tornar seu game mais divertido é criar um ranking. E neste artigo eu vou te ensinar como desenvolver um leaderboard para seu game um usando C#.

Existem diversas ferramentas e provedores que podem ser utilizados para isso, pois você precisará manter a pontuação de seus usuários armazenadas em um servidor na nuvem.

Eu gostava muito do Parse, mas talvez você já saiba que ele será desativado em janeiro de 2017 e obviamente é perigoso permanecer em um serviço que está com data de morte anunciada.

Fiz uma pesquisa e encontrei diversos possíveis substitutos. Uma opção que me agradou é o Playfab, um provedor BAAS (Mobile backend as a service) focado em games, o que é ótimo, pois muitas funcionalidades que são usadas nos games já estão prontas.

Em nosso último jogo publicado, o Sweet Lab, estávamos usando o Parse, e agora convertemos os dados para o Playfab.

sweet-lab-playfab

A seguir vou mostrar para você o processo de logon simplificado no PlayFab e como criar um Leaderboard como o nosso:

sweet-lab-leaderboard

(Uma pequena curiosidade: após jogar a primeira partida do Sweet Lab, você vai notar um tal de Vincent, que está sempre rodeando os primeiros lugares e que, curiosamente, é da Bielorrussia. Quando publicamos o game na Play Store ele foi o primeiro a fazer o download. ☺)

Conheça a Playfab

Antes de mais nada, entrem no site da Playfab e façam o cadastro. É gratuito para projetos pequenos.

playfab-site

Depois, faça o download e importem o package PlayFabClientSDK.unitypackage no projeto. É possível baixá-lo clicando aqui.

Criando logon anônimo: exemplo completo em C#

Existem diversos tipos de login: Google, Facebook, conta própria, iOS, etc. Como o Sweet Lab é um game simples, optamos por ocultar esse processo do jogador, ou seja, ele não será obrigado a criar usuário e senha pois faremos isso internamente no game. Futuramente, iremos acrescentar outras opções para logon, mas uma não inviabiliza a outra.

Adicione as referências abaixo em sua classe:

Para registrar um novo Player, você pode adaptar a função abaixo:

TitleId: é um código que a Playfab irá lhe fornecer.

Username: usamos uma chave única, criada internamente em nosso game.

Password: Encriptamos a chave única com um algoritmo interno. O usuário não terá acesso a senha.

Email: Como e-mail é um campo obrigatório criamos um e-mail baseado no username.

A função RegisterPlayFabUser passa os parâmetros para PlayFab, que faz um callback indicando sucesso ou falha no registro do novo usuário.

O processo de login é feito de forma semelhante:

A função LoginRegisterSuccess é chamada no callback. Em nossa classe GameController criamos uma variável booleana chamada IsLogged, pois para criar o Leaderboard é necessário que o jogador esteja logado.

Como o processo é assíncrono fazemos a chamada do leaderboard numa função Update()  que será descrita posteriormente.

O código em C# fica:

Os usuários podem ser consultados no site do Playfab, juntamente com diversas outras estatísticas:

playfab-players

Atualizando pontuação

Quando o jogador conclui cada uma das fases, ele marca pontos. Além de mantermos os dados locais no device, também enviamos os dados de pontuação para o Playfab:

O Playfab possui uma classe chamada UserStatistics, que deve ser utilizada para armazenar os achievements do jogador: pontos, fases completas, vitória sobre boss, ou qualquer outro item que você deseja para criar rankings ou usar para premiar o jogador. Você é livre para definir o nome dos campos. Em nosso Leaderboard os dados são armazenados na variável score.

O Playfab irá atualizar os dados por meio de requests e irá fazer callbacks dependendo do resultado: sucesso ou falha.

PlayFabClientAPI.UpdateUserStatistics(request, StatsUpdated, OnPlayFabError);

StatsUpdated é o callback de sucesso.

OnPlayFabError é callback de erro.

sweet-lab-playfab-1

Construção do Leaderboard

A classe que irá construir o leaderboard checará as variáveis AllDataSet (configurada junto com a IsLogged) e leaderboardLoaded. Dessa forma, ela não fará nada até que os dados estejam todos configurados, e também não irá criar caso o LB já tenha sido criado previamente.

A função BuildLB irá buscar os dados do LB no servidor do Playfab. Como a maioria das funções do provedor, ela irá enviar um request e receber um callback indicando sucesso ou fracasso (ConstructLeaderboard ou OnPlayFabError).

No Sweet Lab, o LB tem somente 5 posições: request.MaxResultsCount = 5

Como eu havia dito anteriormente, qualquer campo pode ser utilizado para construir o LB, mas é necessário indicar qual: request.StatisticName = “score”;

Assim que os dados são recuperados, o Playfab fará um callback.

Configuramos o callback de sucesso para  ConstructLeaderboard. Então, com os dados já locais iremos preencher os campos com seus devidos valores:

Result é uma lista com os valores do LB. A função ConstructLeaderboard irá fazer um loop pelos valores de result e preencher os campos utilizando a função UpdateField. Esta função não é um bom exemplo em termos de performance, mas ainda não decidimos o formato final do LB e, por hora, ela nos dá flexibilidade.

A última etapa da construção do LB é buscar a posição do jogador atual. A função GetPlayerPosition é chamada por ConstructLeaderboard.

Perceba que para este caso utilizamos MaxResultsCount = 1. Quando o LB estiver finalizado, desativamos o objeto loading: GOLoading.SetActive(false);

Considerações Finais e Próximos Passos

E então, pronto para implementar o LeaderBoard do seu jogo em C#?

Antes de botar a mão na massa, eu sugiro que você siga os dois passos abaixo:

  1. Baixe o Sweet Lab para ver o Leaderboard que implementamos nesse artigo em ação. Jogue algumas partidas para entender como tudo funciona (pode até ficar mais fácil de entender o código desse texto);
  2. O processo de criação do LeaderBoard é simples, mas pode ser confuso caso vocês nunca tenham trabalhado com funções assíncronas e callback.

Caso tenha dúvidas, não deixe de comentar abaixo!

E se você quer se aprofundar no desenvolvimento de jogos, não deixe de participar de uma aula online com o Raphael Dias. Você pode se inscrever por meio deste link.

  • Raphael Dias

    Parabéns por mais esse excelente artigo, Rogério!

    E parabéns pelo Sweet Lab também 🙂

  • Wesley Alberini

    Muito Bom!

  • Patrícia Tamega

    Muito bem explicado. Até para quem só conhece um pouquinho de C#!

  • Renato Malachite

    Algumas sugestões:

    No método ConstructLeaderboard:

    já que vc instanciou um int, por que não fazer um for ?

    for(var i = 0; i < PlayFab.ClientModels.PlayerLeaderboardEntry.Length; i++) // veja bem, estou assumindo que seja length (array), se for uma lista será .Count
    UpdateLeaderBoardValues(i, entry.DisplayName, entry.StatValue.ToString());

    Considerando que vc ja criou uma hierarquia de objetos com nomes fixos, pq não criar um método com a seguinte assinatura:

    UpdateLeaderBoardValues(int index, string nome, string valor)
    {
    var textNome = GameObject.Find("Jogador (" + i + ")").GetComponent();
    var textPonto = GameObject.Find(“PontosJogador (” + i + “)”).GetComponent();

    textNome.text = nome;
    textValor.text = valor;
    }

    Além do código ficar mais legível, vc elimina uns overheads desnecessários por chamar o UpdateField 2x por iteração e ainda por cima internamente dele tinha um foreach bem estranho 😀

    Outra dica, métodos com prefixo de Get devem, obrigatóriamente, retornar alguma coisa senão não fica intuitivo o propósito do método.

    PS.
    Isso é u pseudo código, posso ter esquecido algum ponto e virgula ou até mesmo um case errado, fiz isso no bloco de notas por isso pode ter algum errinho.

  • Ótimo post!!!
    Obrigado pela explicação e inclusive por mostrar como PlayerFab funciona.
    Abraços,
    VInicius

  • Bom artigo Rogério. Eu gostaria de saber se é possível existir 2 usuários com o mesmo nome no Leaderboard, como vocês trataram para ter usuários com espaço no nome e como fazer para gerar um userId e senha que não ultrapassem o tamanho máximo permitido pelo PlayFab e ainda sejam unica para cada pessoa ou dispositvo. Desde já agradeço pela atenção. 🙂

  • Priestley Ceolin

    agora acho q li todos artigos do site, falta uns 2 ebook só. Vou começar estudar modelagem no blender e depois fazer algum curso online da unity, próxima gamejam pode contar comigo

    • Raphael Dias

      Legal saber disso, Priestley! Abração!