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.
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.
<?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);
Aller plus loin avec la documentation de Unity
Venez en parler et ainsi trouver de l'aide sur le discord