Accueil logo MakeYourGame gachetteG gachetteD paddleG paddleH paddleD paddleB buttonG buttonH buttonD buttonB

Comment utiliser la classe WWWForm de Unity

Documentation

Avec la classe WWWForm de Unity, nous allons pouvoir pousser plus loin notre étude amorcée lors de la découverte de la classe WWW.

10 min Débutant

En effet cette dernière nous permettait d'envoyer une requête à un serveur en lui passant ou pas des paramètres GET dans l'url, mais pas des paramètres POST, comme on le ferait depuis un formulaire web par exemple.Les données utilisant la méthode POST, sont reconnues comme étant plus sécurisées que les données passées par la méthode GET. Ainsi vous avez tout interêt à vous former aussi à cette classe.De plus si le nombre de données commence à devenir conséquent cela sera vite ingérable avec la méthode GET...Pour finir la classe WWWForm de Unity est tout à fait compatible avec UnityWebRequest qui est de plus en plus recommandée en remplacement de la classe WWW.

 La classe WWWForm de Unity

Il faut voir cette classe comme une classe d'aide (on dit aussi un Helper) qui génère des données de type formulaire, ce qui permet de les envoyer par la fameuse méthode POST tant attendue, au serveur en utilisant ensuite les classes WWW ou  UnityWebRequest.

Le constructeur de la classe WWWForm

Ici rien de compliqué, pas de paramètre à indiquer à la construction d'un objet de type WWWForm.

WWWForm formulaire = new WWWForm();

Remplir le formulaire avec des données

On peut, avec cette classe, ajouter deux types de données:

                                                                                      
  • Des données simples de type string
  •                                                                                                                                                     
  • Des données binaires (bytes)
  •                                                                                

Pour ajouter des données simples il suffit d'utiliser la méthode AddField()

public void AddField(string fieldName, string value);
public void AddField(string fieldName, string value, Encoding e);//précision de l'encodage

Ainsi pour ajouter à nos données une information comme le pseudo de l'utilisateur, on fera :

WWWForm form = new WWWForm(); //on crée l'objet
form.AddField("pseudo","bobleponge"); //on ajoute cette donnée avant d'envoyer l'objet au serveur

Pour ajouter des données binaires, issues par exemple d'une image, on utilisera la méthode AddBinaryData():

public void AddBinaryData(string fieldName, byte[] contents, string fileName = null, string mimeType = null);

La méthode a besoin au minimum du nom de la variable "fieldName" et des données binaires stockées dans un tableau de type byte. Mais on peut aussi préciser le nom du fichier final une fois téléchargé sur le serveur, ainsi que le mimeType.

form.AddBinaryData("fichierImage", bytes, "nomImage.png", "image/png");

Si le mimeType n'est pas précisé et que les 8 premiers octets (bytes en anglais) correspondent au format PNG, alors les datas sont envoyées avec le mimetype "image/png". Sinon le mimetype utilisé sera "application/octet-stream";Cette fonction est très utile pour uploader des fichiers et des images sur un serveur web.

Première utilisation de la classe WWWForm de Unity

Afin de simplifier cette étude nous n'utiliserons pas volontairement la Classe UnityWebRequest, qui sera vue sur un autre tutoriel dédié.

Implémentation côté Unity

Ici nous allons envoyer trois données au serveur :

                                                                                      
  • le nom du jeu
  •                                                                                                                                                     
  • le pseudo du joueur
  •                                                                                                                                                     
  • le score
  •                                                                                
using UnityEngine;
using System.Collections;
public class WWWBestScores : MonoBehaviour {
    string highscore_url = "http://www.monsupersite.fr/bestScores.php";
    string playerName = "cevantime";
    int score = 250;
    // La coroutine
    IEnumerator Start () {
        // création de l'objet WWWForm pour contenir les données
        WWWForm form = new WWWForm();
        // ajout d'un identifiant de jeu
        form.AddField( "game", "monJeu1" );
        // le pseudo du joueur
        form.AddField( "pseudo",playerName );
        // le score
        form.AddField( "score", score );
        // création de l'objet WWW
       WWW www = new WWW(url,form);//on ajoute l'objet WWWForm en second paramètre 
       // on attend la fin       
       yield return www; 
       //on peut ensuite lire le résultat avec www.text
      //ou les erreurs avec www.error
   } 
}

Implémentation côté serveur

Il faut bien sûr au préalable disposer d'un serveur web, local ou distant.Ensuite on dépose sur le serveur (via FTP pour un serveur distant), un script php qui sera appelé par notre objet WWW.Ce script se contente de vérifier que l'on dispose bien des bons paramètres de types POST.

Il est à noter ici que le script n'est pas sécurisé, au même titre que les données qui mériteraient d'être encryptées avant d'être envoyées au serveur...
<?php
//on vérifie l'existence de la variable de nom 'pseudo'
if(isset($_POST['pseudo']) && isset($_POST['score'])  && isset($_POST['game']) ){
   $pseudo = $_POST['pseudo'];
   $score = $_POST['score'];
   $game = $_POST['game'];
}
else{
  $error = 'Des informations sont manquantes'; //on peut bien sûr affiner ici !!
}
//code de traitement éventuel en SQL pour communiuqer avec la BDD ou tout autre traitement à effectuer côté serveur
//retour vers Unity
if(isset($error)){
    return $error; //on renvoie le message d'erreur à Unity
}
else{
    return 'Tout est ok'; //ou données issues de la BDD
}

Pour ceux qui seraient un peu perdu avec le langage php, je vous conseille de suivre les tutoriels en C-sharp, car les concepts sont les mêmes pour tous les langages (variables, conditions, boucles, fonctions...).Voici tout de même quelques points php utilisés ici...

Un avant goût du php

En php on déclare une variable avec le "$" avant le nom de la dite variable :

 $variableName = 15; //ce sera compris par php comme un entier !!

De plus le langage php n'est pas typé, ainsi on est pas obligé de déclarer le type de la variable, comme on le fait en C# ou encore en java.Les variables envoyées à un serveur par la méthode POST sont mises dans une variable de type tableau associatif, appelée SUPER GLOBALE...rien que ça !! Ainsi on a accès aux données de POST en utilisant $_POST['nomVariablePostée'], pour accéder dans le tableau à la variable nommée : nomVariablePostéeEnfin la méthode  isset($_POST['pseudo']), renvoie un booléen qui vaut true si la variable est dans le tableau ou false sinon. Ainsi son utilisation permet de tester l'existence d'une variable.

Retour sur Unity

Comme nous venons de le voir, le script php renvoie soit $error soit un message comme quoi tout c'est bien passé. Dans tous les cas nous recevons donc, côté Unity une variable de type string qui est stockée dans la variable : www.text.Ainsi la boucle est bouclée et nous pouvons savoir si notre requête a bien été traitée.Mais n'oublions pas que des erreurs réseaux ou d'url peuvent arriver, et nous devons donc bien vérifier la valeur, ou l'existence de www.error.Ainsi une bonne pratique est de faire un contrôle avant de tenter de traiter www.text.

if (!string.IsNullOrEmpty(www.error))
    Debug.Log(www.error);
else
    Debug.Log(www.text);
Attention ne confondez pas les erreurs www.error et celles éventuelles que le script php peut nous renvoyer via la variable $error !! Il faudra bien penser à traiter ces dernières côté Unity en C-sharp...

Aller plus loin avec la documentation de Unity

                                                                                      
  • La classe WWWForm 
  •                                                                                                                                                             
  • UnityWebRequest
  •                                                                                
Un souci, des bugs, des erreurs en console ?




Venez en parler et ainsi trouver de l'aide sur le discord
Vues: 135

Connectez-vous pour applaudir applause logo 0 claps

Validation du Tutoriel

Veuillez vous connecter ou créer un compte pour pouvoir valider ce tutoriel et ainsi gagner stardust et XP !

×