Bonjour à vous 😉

Un des gros problèmes actuel avec l’export flash d’Unity pour des projets demandant une communication avec un service externe (php, java ou autre), ou un chargement d’éléments externes (images, sons…) est la non prise en charge de la classe WWW. A l’heure où j’écris cet article, Unity nous informe d’une prise en charge prochaine de cette classe, mais en attendant nous devons « bricoler » une sorte de « bridge » afin d’assurer cette fonctionnalité.

flash unity

Je me suis appuyé sur l’exemple d’UnityRalph du forum officiel d’unity.

Cet exemple charge une image dans un plan, mais il est assez limité, car la gestion des événements est très simpliste (boucle while) et empêche le chargement simultané de plusieurs images à l’intérieur d’un même script. De plus, j’ai ajouté le chargement de données au format texte avec le même constructeur.

J’ai donc ajouté la déclaration de deux delegates, un pour le chargement de données comme du texte, et l’autre pour une texture au format Texture2D.

J’ai essayé de coller au maximum au principe de la classe WWW.

Exemple pour charger du texte (en POST) :

wwwData = new AsWWW("votredomaine/votrescript.php");
wwwData .AddField("argument1", "valeur1");
wwwData .AddField("argument2", "valeur2");
StartCoroutine(wwwData .loadData(reponse, getError));

L’argument de loadData est par exemple une méthode du type :

private void reponse(string text){
	Debug.Log(text);
}

Pour le chargement de texture, même principe :

wwwPic = new AsWWW("domaine/image.jpg");
StartCoroutine(wwwPic.loadTexture(reponse, getError));
private void reponse(Texture2D texture){
	plane.renderer.material.mainTexture = texture;
}

Et la méthode (c’est un exemple hein) qui capture les erreurs 😉

private void getError(string error){
	print ("Error :"+error);	
}

Donc, la classe AsWWW possède deux méthodes, loadData(), loadTexture() avec comme argument une méthode avec un argument de type string, un argument de type Texture2D pour l’autre, et une méthode facultative pour capturer les erreurs.

Mais on peut aussi ce passer des delegate et donc attendre le chargement des données ou texture :

wwwText = new AsWWW(urlPhp);
yield return StartCoroutine(wwwText.loadData());
guiText.text = wwwText.text;
wwwPic2 = new AsWWW(urlPic);
yield return StartCoroutine(wwwPic2.loadTexture());
littlePlane.renderer.material.mainTexture = wwwPic2.texture;

Et dans ces cas là, pour récupérer les éventuelles erreurs :

.... = wwwText.error;
.... = wwwPic2.error;

Si vous avez d’autres idées, n’hésitez pas !

Exemple completPackage