Unity 3D Game Engine – Android – Save Data – Local

How to save points, user preferences and other datas inside an android device.

IMPORTANT!!!

Unity> MAIN TOP MENU> File> Build Settings> Player Settings…> Other Settings> Configuration> Write Access> External (SD Card), this setup will create inside Android Device using Windows 7 -> Phone/Android/data/com.Company.LuceDigitale

It this equal the write inside AndroidManifest.xml ->

This scene is a simple Tap Counter, let me introduce instructions, briefly:
a. if you Tap over the objects in the scene, counter will increase.
b. if you tap over the button ‘Save Data’, counter value will be saved inside android device.

In the game we there are 2 counters (GUI Text):
1. the realtime player score text
2. the saved old score text

Inside Hierarchy create the game Objects:

– Sphere (GameObject)
– GUI Text (GameObject) – name it ‘Old Score Text’
– GUI Text (GameObject) – name it ‘Player Score Text’
– Main Camera, attach the ‘TapCounter.js’:

TapCounter.js


#pragma strict
 
    // Only ANDROID NOT PC NOT IOS
    // Attach this script to the Main Camera
     
// Hierarchy DRAG E DROP over var GUI Text in Inspector
var scoreText : GUIText;
var oldScoreText : GUIText;
// touch counter, private because the users is not be able to change this value
private  var score : int;
private  var oldScore : int;
 
// Ray Cast Setup
var speed : float = 4;
var hit = new RaycastHit();
 
function Start () {
        // The counter initial value is 0
        score = 0;
        scoreText.text = "No Touch:";
        // load old saved score data
        oldScore = PlayerPrefs.GetInt("Player Score");
}
 
function Update () {

	// refresh old score data
    oldScoreText.text = "Old Score : "  + oldScore;
 
    // se c'è un tocco Input.touchCount AND la fase del tocco è quella iniziale TouchPhase.Began
    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) {
    // traccia i raggi dalla Camera dal punto del tocco
    var ray = Camera.main.ScreenPointToRay (Input.GetTouch(0).position);
 
        // se raycast colpisce l'oggetto
        if (Physics.Raycast (ray, hit)) {
        // fai partire la funzione che incrementa il contatore
        UpdateScore ();
        }
 
    }
}
 
function UpdateScore () {
    // score var increment of +1
    score += 1;
    // scoreText in assigned inside Inspector on GUI Text
    // change .text property and write it on the display 
    scoreText.text = "Touched: "  + score;
}

// Save Data On Click START #####################################
function OnGUI()
{
  if (GUI.Button(Rect(10,10,200,50),"Save Data"))
  { 
	// setta un valore intero - SetInt - di nome 'Player Score' di valore 'score'
	PlayerPrefs.SetInt("Player Score", score); 
	// ottiene il vecchio valore salvato in precedenza - deve avere lo stesso nome del salvataggio precedente
	// se non esiste restituisce il valore 0 oppure ""
	// questa funzione mi serve per fare confronti tra il punteggio vecchio e quello nuovo
	oldScore = PlayerPrefs.GetInt("Player Score");
	// salva il valore ottenuto dalla partita corrente 'Player Score'
	PlayerPrefs.Save();	
  }
}
// Save Data On Click END #####################################

Hierarchy> Main Camera> Inspector> TapCounter.js DRAG AND DROP:
‘Player Score Text’ (GUI Text) over var ‘score Text’
‘Old Score Text’ (GUI Text) over var ‘Old Score Text’

For italian people:

Notare


if (GUI.Button(Rect(10,10,200,50),"Save Data"))
  { 
	// setta un valore intero - SetInt - di nome 'Player Score' di valore 'score'
	PlayerPrefs.SetInt("Player Score", score); 
	// ottiene il vecchio valore salvato in precedenza - deve avere lo stesso nome del salvataggio precedente
	// se non esiste restituisce il valore 0 oppure ""
	// questa funzione mi serve per fare confronti tra il punteggio vecchio e quello nuovo
	oldScore = PlayerPrefs.GetInt("Player Score");
	// salva il valore ottenuto dalla partita corrente 'Player Score'
	PlayerPrefs.Save();	
  }

Come funziona?

0. IMPORTANTE: per abilitare l’app alla scrittura su SD seguire la seguente procedura:
Unity> MAIN TOP MENU> File> Build Settings> Player Settings…> Other Settings> Configuration> Write Access> External (SD Card)

questo creerà all’interno del dispositivo Android la cartella (vista da Win 7)
-> Phone/Android/data/com.Company.LuceDigitale

Equivale di fatto in un progetto Android a scrivere su AndroidManifest.xml
->

1. PlayerPrefs.SetInt(“Player Score”, score);
-> Imposta in RAM (non viene ancora scritto nulla), un valore intero ‘Player Score’, del valore ‘score’ che è appunto un numero intero

2. oldScore = PlayerPrefs.GetInt(“Player Score”);
-> Ottiene il vecchio valore salvato di ‘Player Score’ se presente, se non esiste restituisce 0 oppure “”
Questo passaggio è utile se è necessario confrontare i vecchi valori con i nuovi, per stabilire ad esempio una classifica o se ho superato un check point.

3. PlayerPrefs.Save();
-> Salva su SD i valori impostati dal comando del punto 1.

Per testare avviare l’app sul dispositivo Android, tocco ripetuto sull’oggetto in scena, tocco sul bottone per salvare il punteggio attuale. Spegne il dispositivo, riavviare e ricaricare l’app, il valore di ‘Old Score Text’ dovrebbe essere quello salvato in precedenza.