jeudi 17 novembre 2011

Comment sauver et ouvrir les préférences du joueur dans Unity?

Il existe deux méthodes dont je connais l'existence pour enregistrer des données dans Unity:
  • la classe PlayerPrefs de Unity;
  • le XML.
PlayerPrefs est idéal pour enregistrer une petite quantité de données. La taille maximale permise est de 1 MO. Le site d'Unity pour cette classe est:
http://unity3d.com/support/documentation/ScriptReference/PlayerPrefs.html .
Le XML est plus versatile que PlayerPrefs. Vous pouvez enregistrer la quantité d’informations que vous voulez avec le format que vous voulez. Je vous réfère à ce site si vous voulez plus d'information sur le XML avec Unity:
http://answers.unity3d.com/questions/8480/how-to-scrip-a-saveload-game-option.html .

Dans ce tutoriel, je vais me concentrer uniquement sur PlayerPrefs. Cette classe offre trois fonctions pour mémoriser des données: SetFloat, SetInt et SetString et trois fonctions pour lire: GetFloat, GetInt et GetString. Disons que dans notre jeu, nous voulons sauver le nom du joueur qui est stocké dans la variable playerName, le code C# sera:
 PlayerPrefs.SetString( "PlayerName", playerName );
Le premier paramètre est la clé qui va permettre de retrouver la valeur et le second, la variable que nous voulons enregistrer. PlayerPrefs est un dictionnaire. Nous lui fournissons une valeur et une clé. Pour lire le nom du joueur, le code est simplement:
 playerName  = PlayerPrefs.GetString( "PlayerName");
Il n'y a rien de plus à faire. Unity se charge automatiquement d'enregistrer dans un fichier les valeurs de PlayersPrefs lors de la fermeture du jeu, que ce soit sur Windows ou en mode Web. Par contre, il est possible de forcer l'enregistrement à l'aide de la fonction:
 PlayerPrefs.Save();
Passons à un exemple concret pour voir comment appliquer PlayerPrefs dans une application. Voici un simple cube avec un bouton qui change sa couleur aléatoirement:
Unity Web Player | WebPlayer
-->

Le bouton change la couleur du cube. Si vous rafraîchissez la fenêtre, le cube réapparaît avec la dernière couleur choisie. Voici le script utilisé:
 
using UnityEngine;
using System.Collections;

/**
 * Change the color of a cube and save the data using PlayerPrefs.
 *
 * @author Mentalogicus
 * @date 11-2011
 * 
 * Copyright (C) 2011, Mentalogicus
 * All rights reserved
 * 
 */
public class StatsMenu : MonoBehaviour 
{
 //The current color of the cube.
 Color _current = new Color(1,1,1,1);

 // Use this for initialization
 void Start () 
 { 
  //Load the saved color.
  Load();
  
  //Change the shader to transparent diffuse.
  this.renderer.material.shader = Shader.Find("Transparent/Diffuse");
  
  //Apply the current color to our cube.
  this.renderer.material.color = _current;
 }
 
 /**
  * Show a button to change the color and 4 labels to show
  * the color RGBA component.
  */
 void OnGUI ()
 {
  GUI.BeginGroup( new Rect(50,50, 200,150) );
  GUI.Box( new Rect(0,0, 200,150), "Change Color" );
   
  if ( GUI.Button( new Rect( 10,25,100, 20), "Change Color" ) )
  {
   ChangeColor();
   AutoSave();
  }
  
  ShowColor();
  
  GUI.EndGroup();
 }
 
 /**
  * Show the current color used on your cube.
  */
 void ShowColor()
 {
  GUI.Label( new Rect( 10, 50, 150,20), "Red: " + _current.r );
  GUI.Label( new Rect( 10, 75, 150,20), "Green: " + _current.g );
  GUI.Label( new Rect( 10, 100, 150,20), "Blue: " + _current.b );
  GUI.Label( new Rect( 10, 125, 150,20), "Alpha: " + _current.a );
 }
 
 /**
  * Change the color to a random one.
  */
 void ChangeColor()
 {
  _current = new Color( Random.value, Random.value, Random.value, Random.value );
   
  this.renderer.material.color = _current;
 }
 
 /**
  * Save the color with the PlayerPrefs class.
  */
 void AutoSave()
 {
  PlayerPrefs.SetFloat( "Color_Red", _current.r );
  PlayerPrefs.SetFloat( "Color_Green", _current.g);
  PlayerPrefs.SetFloat( "Color_Blue", _current.b );
  PlayerPrefs.SetFloat( "Color_Alpha", _current.a );
 }
 
 /**
  * Load the color with the PlayerPrefs class.
  */
 void Load()
 {
  if ( PlayerPrefs.HasKey("Color_Red") )
  {
   _current.r = PlayerPrefs.GetFloat( "Color_Red" );
  }
  
  if ( PlayerPrefs.HasKey("Color_Green") )
  {
   _current.g = PlayerPrefs.GetFloat( "Color_Green");
  }
  
  if ( PlayerPrefs.HasKey("Color_Blue") )
  {
   _current.b = PlayerPrefs.GetFloat( "Color_Blue" );
  }
  
  if ( PlayerPrefs.HasKey("Color_Alpha") )
  {
   _current.a = PlayerPrefs.GetFloat( "Color_Alpha" );
  }
 }
 
}

Ce script est appliqué sur le cube. La classe PlayerPrefs est limitée dans ces capacités. Heureusement, il existe une extension nommée PlayerPrefsX qui étend les capacités de PlayerPrefs. Ce script est à l'adresse suivante:
http://www.unifycommunity.com/wiki/index.php?title=ArrayPrefs#C.23_-_PlayerPrefsX.cs .

Bonne programmation!

Aucun commentaire:

Enregistrer un commentaire