Comment coder un PHP hébergé auto-

introduction

Création de votre Leaderboard

Dans cet exemple, phpMyAdmin permet d'accéder à la base de données (intégré à l'interface d'administration). Vous voulez ouvrir votre base de données et ouvrez l'onglet SQL. Si vous avez plus de contrôle sur votre serveur, vous pouvez créer une nouvelle base de données.







Ensuite, insérez l'instruction SQL suivante:

Cela va créer une table avec trois variables:

  • prénom. qui détient les noms de vos utilisateurs, et qui permet de stocker 10 caractères. C'est l'identifiant principal de notre table, ce qui signifie qu'il ne peut stocker une ligne par nom d'utilisateur.
  • But. qui détient score le plus élevé de chaque utilisateur. Dans cet exemple, est une variable non signée, il ne peut qu'être positif. Si vous voulez avoir des scores négatifs, vous devrez changer cela.
  • ts. un horodatage nous pouvons utiliser pour changer l'ordre de notre classement.

Maintenant, si vous utilisez SQL Server et MySQL pas, vous pouvez toujours utiliser TIMESTAMP. mais pour la valeur que vous devrez utiliser GETDATE () au lieu de CURRENT_TIMESTAMP.

Cela fera en sorte une nouvelle ligne visible est ajouté pour chaque partition.

Cliquez sur Go et vous avez terminé! Votre table est tout prêt.

Configuration de votre fichiers PHP

Maintenant, vous devez créer des fichiers PHP. Ce sont les hommes du milieu de l'opération, fournissant un moyen pour l'unité pour accéder à votre serveur. Le premier fichier PHP que vous allez avoir besoin est AddScore.php. Vous aurez besoin de connaître les informations du serveur d'avant.

(Remplacer SQLHOST. SQLUSER. Sqlpassword et votre_base_de_données avec vos propres informations.)

Ici, nous avons juste essayé de se connecter à la base de données. Si la connexion échoue, l'unité sera informé que la demande n'a pas abouti. Maintenant, vous allez vouloir transmettre des informations au serveur:

Le hachage est utilisé pour crypter vos données et empêcher les gens de piratage de votre leaderboard. Il est généré avec une clé cachée dans l'unité et ici, et si les deux hash vous correspondent avez le droit d'accéder à votre base de données.

Ici, nous générons le hachage et nous vérifions que le hachage nous soumettons de l'unité est identique au hachage que nous attendons. Le cas échéant, nous pouvons envoyer notre requête!

En utilisant si les déclarations, nous nous assurons que les nouvelles valeurs ne sont utilisées que si le score est supérieur au score, sinon les valeurs d'origine sont utilisées.

Enfin, nous courons à notre requête et fermer notre PHP.

Ce fichier va sur notre serveur. Vous aurez besoin de se rappeler l'URL. De même, nous devons faire deux autres fichiers PHP avec différentes requêtes, que nous appellerons TopScores.php et GetRank.php.

La requête de TopScores est tout simplement:

Cela prendra les 10 premières valeurs basées sur le score, et pour les grades à égalité met les joueurs qui ont obtenu le score le plus la première table. Cette fois-ci, nous voulons extraire trop de données, donc nous ajoutons aussi:

Cela va extraire nos résultats et les tabuler d'une manière que nous pouvons les mettre en tableaux dans l'unité.

Enfin, nous avons GrabRank:

Cela nous donnera le rang de notre joueur dans le tableau de bord. On peut alors extraire en faisant écho à $ row [ « rang »].

Notre code source comprend également une fonction assainissants, ce qui empêchera les utilisateurs d'entrer des jurons à votre leaderboard, ou de tenter une attaque par injection SQL.

Faire un simple mini-jeu dans l'unité

Maintenant, nous avons besoin d'un jeu d'utiliser notre carte highscore avec! Nous allons juste pour tester combien de clics chaque utilisateur peut faire en dix secondes, mais vous pouvez ajouter votre leaderboard à tout jeu.

Nous allons commencer par faire quatre objets GUIText. Ceux-ci devraient être ancrés sur le centre du milieu pour plus de commodité. Vous pouvez régler ces derniers avec décalage en pixels pour les obtenir au bon endroit, mais si vous les voulez ajuster leur position pour une résolution, il est plus simple de changer la position X et Y (entre 0 et 1); sinon, vous devrez les ajuster au démarrage.

Vous, cependant, doivent ajuster la taille de la police au démarrage si vous souhaitez exécuter à toutes les résolutions. Un moyen rapide de le faire est en les basant sur la hauteur de l'écran. Nous pouvons le faire en faisant une classe qui fait cela et l'attacher à tous nos objets texte, mais il est beaucoup plus simple de faire tout cela d'une classe.

Il ne compte pas vraiment dans quel but nous choisissons comme notre « manager », afin que nous puissions simplement mettre cette classe sur notre compteur de clic. Donc, dans notre première classe, nous écrivons:

Ceci trouvera tous les objets de texte sur la scène et l'échelle à une taille raisonnable.

Maintenant, nous voulons que le compteur de clic pour être plus grand que l'autre texte, donc si nous collons cette classe là-bas, nous avons l'avantage supplémentaire que nous pouvons également vérifier si le guiText en question est celui attaché à cette gameobject:

La composante cliquant du jeu sera très simple. Au début, nous ne voulons pas que la minuterie compte à rebours jusqu'à ce que le premier clic, donc nous allons faire deux bools privés dans notre classe - FirstClick et allowedToClick. En début (), nous pouvons mettre à FirstClick faux et allowedToClick à true.

Maintenant, nous avons besoin du compteur pour enregistrer effectivement les clics, et il y a deux façons de le faire. Nous pourrions garder une variable entière qui suit la partition, ou nous pourrions le rendre un peu moins efficace, mais dans une ligne (et avec quelque chose de si simple on n'a pas vraiment besoin d'optimiser, mais il est une bonne pratique). Donc, nous enregistrerons le clic dans la fonction de mise à jour (), et augmenter la valeur en lisant la chaîne.







Comme vous pouvez le voir ici, l'incrémentation est obtenue en lisant la chaîne comme un entier, en ajoutant un, puis convertir en une chaîne. Vous verrez également ici que nous avons exécuté un coroutine dès que l'utilisateur clique premier, qui commence le compte à rebours.

Nous allons utiliser la récursivité dans cette fonction. Encore une fois, nous pourrions utiliser un entier qui correspond à la valeur du compte à rebours pour l'efficacité, mais nous allons utiliser à nouveau la manipulation de chaînes.

Remarque: il est important que nous avons utilisé StartCoroutine () et ne pas simplement appeler cette fonction, car il est un IEnumerator. L'instruction yield lui fait attendre une seconde avant toute action. Il supprime un du compteur, et si la valeur est zéro, il appelle à nouveau elle-même. De cette façon, la fonction compte à rebours jusqu'à ce qu'il atteigne 0.

nom de l'entrée

Après cela, il empêche l'utilisateur de cliquer, demande le nom d'utilisateur, et accède à nos deuxième et troisième classes (que nous sommes sur le point d'écrire!). Nous allons jeter un oeil à ce que ceux-ci font maintenant, en commençant par NameEnter.

Dans NameEnter () nous allons permettre à un utilisateur de saisir son nom d'utilisateur, avec quelques contraintes. Dans un premier temps, nous voulons afficher le caractère underscore _. qui seront effacés dès qu'ils commencent à taper leur nom. En plus de cela, nous ne voulons pas être en mesure d'utiliser des caractères comme \ ou « . comme ceux-ci altérerait nos requêtes SQL.

Nous allons utiliser un générateur de chaîne pour créer cette. D'abord, nous allons placer certaines variables au sommet de notre classe:

Le MaxNameLength doit être réglé sur la même longueur que vous avez utilisé pour la longueur de votre VARCHAR quand vous avez fait votre table. Ici, nous avons notre constructeur de chaîne, playername. et deux booléens. La première, backspacepossible. est de contrôler la capacité de l'utilisateur d'appuyer sur backspace pour effacer les caractères. La seconde est d'indiquer si elles ont commencé à taper encore leur nom.

Dans Démarrer (). nous devons prendre soin de quelques choses. Nous désactivons tout le texte, sauf pour celui qui est appelé Toptext; nous pouvons le faire dans une boucle foreach, comme avant.

Ici vous pouvez voir que nous avons fait quelques petites choses. Nous avons notre classe initiale handicapés (ClickTimes) que nous ne l'utilisons pas plus. Nous avons également créé une instance de playerNameTemp et avec joint en annexe _. afin que les joueurs peuvent voir où leur nom va, et nous avons initialisées nos variables.

Maintenant, nous devons permettre au joueur d'entrer réellement leur nom. A la fin de mise à jour (), nous plaçons l'extrait suivant:

Cela fera en sorte le texte affiche ce que nos dossiers de constructeur de chaîne.

Ensuite, nous traitons la saisie de caractères:

Donc, à condition que la longueur du constructeur de chaîne est inférieure à la longueur maximale du nom, et tant que l'utilisateur est saisie de caractères qui sont soit des lettres, des chiffres, des espaces ou des underscores (bien que vous pourriez choisir seulement pour permettre des caractères alphanumériques), la chaîne sera en annexe avec le nouveau chiffre. Dans le cas où c'est la première presse, le trait de soulignement d'origine sera supprimée avant que la nouvelle lettre est ajoutée.

Tant qu'il n'y a pas de caractères qui restent dans notre constructeur de cordes et backspace est possible, l'utilisateur peut supprimer des caractères. Notez la différence entre la première et la deuxième déclaration. L'ancien utilise GetKeyDown (). tandis que celui-ci utilise GetKey () (et vérifie notre bool). La distinction est que nous devons effacer un caractère à chaque fois que l'utilisateur appuie sur backspace, mais pas en permanence pendant que l'utilisateur tient vers le bas.

Les coroutines BackspaceInitialHold () et (), il suffit d'attendre 0,15 et 0,05 seconde, respectivement, et ensuite mis à backspacepossible vrai. Ainsi, après notre utilisateur a maintenu enfoncé backspace pour 0,15 secondes, tant qu'ils sont en maintenant backspace, un caractère sera effacé toutes les 0,05 secondes (tant que la longueur est supérieure à code> 0).

En outre, nous précisons que si tel est le premier bouton l'utilisateur appuie, initialpress est déclenché (donc il ne sera pas essayer de supprimer un caractère, une fois qu'ils appuyez sur quelque chose d'autre).

Pour couronner le tout, nous devons permettre à l'utilisateur d'appuyer sur Retour pour terminer la saisie du nom.

Tant que l'utilisateur a fait une sorte d'entrée et la longueur est supérieure à 0. le nom sera acceptée. Tous nos objets texte sont supprimés, nous désactivons cette classe, et nous lançons notre troisième classe, HighScore. Tous les trois de nos classes doivent être mis sur notre objet dans l'éditeur.

Nous venons d'appeler la fonction SetName () de Highscore, et plus tôt que nous avons appelé SetScore (). Chacune de ces fonctions définit simplement les valeurs des variables privées que nous soumettons maintenant à notre leaderboard.

Accès à votre Leaderboard dans l'unité

C'est la maison préfabriquée GUIText que nous baserons notre leaderboard sur. Vous devez vous assurer que le texte est ancré au milieu à gauche, et aligné à gauche. Vous pouvez également choisir une police ici aussi.

Nous avons besoin de toutes nos valeurs d'avant - la clé que vous avez généré, les URL que vous téléchargé vos fichiers PHP, et ainsi de suite. Les variables de nom d'utilisateur et highscore définies à l'aide de deux fonctions publiques appelées SetScore () et SetName (). que nous avons utilisé dans la section précédente.

Nous devons utiliser IEnumerators ici pour gérer nos requêtes SQL, car nous avons besoin d'attendre une réponse. Nous allons commencer notre premier coroutine, AddScore (). dès que la classe est activée.

Tout d'abord, nous créons notre hachage avec la clé privée, en utilisant une fonction pour créer un hachage MD5 de la même manière que le md5 () de PHP. Il y a un exemple sur le wiki de la communauté de l'unité.

Ici, si le serveur est inaccessible pour une raison quelconque, nous courons une fonction d'erreur (). Vous pouvez choisir ce que vous voulez produire dans votre gestionnaire d'erreurs. Si le score est également postée correctement, cependant, nous lancerons notre prochain coroutine: GrabRank ().

Maintenant, nous pouvons utiliser notre dernière coroutine. Celui-ci va attacher tout. Nous commençons par l'accès à l'URL pour une dernière fois:

Mais cette fois-ci nous voulons diviser les données que nous recevons dans un tableau de chaînes. tout ce que nous pouvons d'abord utiliser une fraction de chaîne comme ceci:

Cela fera en sorte chaque résultat sera un nouvel élément dans notre tableau de chaînes, tant qu'une nouvelle ligne ou un onglet se trouve (ce qui sera!). Nous allons maintenant diviser cela en deux tableaux supplémentaires appelés noms et les points.

Nous avons maintenant fait deux nouveaux tableaux qui sont chacun la moitié de la taille du premier réseau. Nous avons ensuite divisé chaque première chaîne dans notre tableau les noms et chaque seconde dans notre gamme Scores.

Et maintenant, nous sommes prêts à créer nos objets texte, basé sur notre maison préfabriquée de BaseGUIText. Nous instancier les titres individuellement et mis leur texte - par exemple:

Une fois que nous l'avons fait pour tous nos titres, nous ajustons nos positions afin que le nouveau texte affichera plus bas.

Ensuite, nous courons une boucle qui itérer notre liste des 10 tout, définissant le nom, le grade et le score (et faire en sorte que le texte est ancré sensiblement), puis en ajustant les positions encore une fois. Chaque itération, nous vérifions si le rang de l'utilisateur est égal au rang affiché, et si oui nous recolorer le texte de sorte que le score de l'utilisateur est mis en évidence en jaune:

Et puis, enfin, nous vérifions si le rang de l'utilisateur est supérieur à 10. Dans ce cas, nous affichons leur score au fond dans la fente onzième, ainsi que leur rang et la couleur en jaune.

Conclusion

Voilà; notre leaderboard est terminée! Dans les fichiers source que j'ai également inclus un fichier PHP qui va récupérer les rangs au-dessus et au-dessous du nom d'utilisateur de l'utilisateur, afin de pouvoir les montrer exactement où ils se trouvent sur la carte.







Articles Liés