10. Sisteme de gestiune a datelor

Cerinte

Realizati o secventa de 3 scene in Unity cu urmatoarele functionalitati:

  • O scena cu un meniu principal:
    • Din care sa se selecteze dificultatea jocului
    • Sa se introduca un nume
    • Un buton de load game
  • O prima scena de joc cu un player
    • se afiseaza UI cu XP, nume si healthbar
    • playerul este controlabil si poate ataca
    • playerul are viata si XP
    • exista 1 sau mai multi inamici in scena
      • inamicul are viata mai mare sau mai mica in functie de dificultatea selectata
      • eliminarea unui inamic de catre player duce la castigarea de XP
      • XP oferit de inamic este in functie de dificultatea selectata
  • Un portal catre un nou level de joc (o noua scena)
    • personajul isi pastreaza informatiile de viata si XP si se afiseaza UI-ul similar
  • Un buton de save game pe UI

Documentatie video

Inregistrare pe Teams

Documentatie extinsa text

PlayerPrefs

PlayerPrefs este o sectiune de setari statice, valabile pentru o aplicatie (un Player Unity, de unde si numele de PlayerPrefs). Asadar, PlayerPrefs este dedicat setarilor de player in general ca rezolutie, volum, etc, dar poate fi folosit in variante simple si pentru alte lucruri simple (de ex un username, daca este local).

Permite o salvare limitata ca dimensiune de valori Int, Float sau String intr-un index de tip key-value.

Atentie! Toate datele se salveaza in format text pe disc, nu exista nici o forma de protectie/criptare. Asadar, nu se salveaza informatii sensibile (parole etc.)

PlayerPrefs.SetInt("score",5);
PlayerPrefs.SetFloat("volume",0.6f);
PlayerPrefs.SetString("username","John Doe");
PlayerPrefs.Save();
 
 
int score = PlayerPrefs.GetInt("score");
float volume = PlayerPrefs.GetFloat("volume");
string player = PlayerPrefs.GetString("username");

Don't Destroy On Load

Încărcarea unei noi Scene distruge toate obiectele Scenei curente. Astfel, puteti folosi Object.DontDestroyOnLoad pentru a păstra un obiect în timpul încărcării unei noi scene. Dacă obiectul țintă este o componentă sau GameObject, Unity păstrează, de asemenea, toți copiii din ierarhie. Object.DontDestroyOnLoad funcționează numai pentru GameObject root sau componente de pe GameObjects root (adica copii directi ai scenei in ierarhie).

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class MyPlayerClass: MonoBehaviour
{
    void Awake()
    {
        DontDestroyOnLoad(gameObject);
    }
}

Serializare

Serializarea este procesul de conversie a unui obiect într-un flux de octeți sau string de caractere pentru a stoca obiectul sau a-l transmite în memorie, într-o bază de date sau într-un fișier. Scopul său principal este de a salva starea unui obiect pentru a-l putea recrea atunci când este necesar. Procesul invers se numește deserializare.

Obiectul este serializat într-un flux, care transportă nu doar datele, ci și informații despre tipul obiectului, cum ar fi versiunea, sau numele ansamblului. Din acel flux, poate fi stocat într-o bază de date, într-un fișier sau în memorie.

Serializarea permite dezvoltatorului să salveze starea unui obiect și să-l recreeze după cum este necesar, oferind stocarea obiectelor, precum și schimbul de date.

Tipuri de serializare:

  1. Binary Serialization
  2. XML Serialization
  3. JSON Serialization

Cea mai simpla varianta de salvare a datelor este local pe disc. În esență, tot ce trebuie să facem pentru a salva datele jucătorului este să scriem informații într-un fișier. În Unity, cel mai simplu mod de a face acest lucru este cu un StreamWriter și JsonUtility.

StreamWriter ne va permite să scriem date într-un fișier, iar JsonUtility se va ocupa de conversia datelor pe care dorim să le salvăm în JavaScript Object Notation (JSON).

Deși nu folosim JavaScript, JSON a devenit unul dintre standardele cele mai populare pentru transmiterea datelor datorită atat capabilitatilor de serializare cat si a faptului ca este foarte ușor de citit si de oameni, spre deosebire de XML care este mai stufos si mai greu de citit direct.

In Unity exista deja un utilitar acre sa se ocupe de conversia efectivă către și de la JSON prin JsonUtility. Este indicat totusi sa să înțelegeți si unele dintre limitările JsonUtility înainte de a il folosi, astfel ca vă încurajez să citiți documentatia.

Pe plan intern, această metodă utilizează serializatorul Unity; prin urmare, obiectul în care treceți trebuie să fie suportat de serializator: trebuie să fie un MonoBehaviour, ScriptableObject sau o clasă/struct simplu cu atributul Serializable aplicat. Tipurile de câmpuri pe care doriți să le includeți trebuie să fie acceptate de serializator; câmpurile neacceptate vor fi ignorate, la fel și câmpurile private, câmpurile statice și câmpurile cu atributul NonSerialized aplicat.

De exemplu, pentru a salva date in mod persistent despre joc, o functionalitate de Save Game cu alte cuvinte, putem realiza in primul rand o clasa serializabila care sa tina aceste date, sau putem folosi direct date din Player, daca doresc sa persist informatii doar despre personaj.

[System.Serializable]
public class GameData
{
     // Toate informatiile de care am nevoie la salvare, de ex gamelevel, xp, health etc.
     public int gamelevel = 0;
     public float health = 100;
     public float xp = 0;
}

Apoi realizam un script care sa salveze aceste date pe disk, intr-o baza de date sau in alte metode.

using System.IO;
using UnityEngine;
 
...
 
    private static string dataFilePath = Path.Combine(Application.persistentDataPath, "SaveGameData.json");
    public void SaveGame()
    {
        GameData gameData = new GameData();
        gameData.level = level;
        //...etc
        // This creates a new StreamWriter to write to a specific file path
        using (StreamWriter writer = new StreamWriter(dataFilePath))
        {
            // This will convert our Data object into a string of JSON
            string dataToWrite = JsonUtility.ToJson(gameData);
 
            // This is where we actually write to the file
            writer.Write(dataToWrite);
        }
    }
    public void LoadGame()
    {
        // This creates a StreamReader, which allows us to read the data from the specified file path
        using (StreamReader reader = new StreamReader(dataFilePath))
        {
            // We read in the file as a string
            string dataToLoad = reader.ReadToEnd();
 
            // Here we convert the JSON formatted string into an actual Object in memory
            gameData = JsonUtility.FromJson<Data>(dataToLoad);
        }
    }
}
pjv/laboratoare/2023/10.txt · Last modified: 2024/10/07 10:49 by alexandru.gradinaru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0