Maison > Périphériques technologiques > Industrie informatique > Enregistrer et charger les données du jeu des joueurs dans Unity

Enregistrer et charger les données du jeu des joueurs dans Unity

Jennifer Aniston
Libérer: 2025-02-19 11:33:10
original
481 Les gens l'ont consulté

Ce tutoriel vous montre comment implémenter les fonctionnalités de jeu de sauvegarde / charger dans votre jeu Unity. Nous enregistrerons des données des joueurs comme le niveau, la position et les statistiques.

Saving and Loading Player Game Data in Unity

Vous pouvez utiliser le projet à partir du précédent tutoriel de sauvegarde de la scène croisée pour les tests.

Concepts clés:

  • Sérialisation: Unity utilise la sérialisation .NET / Mono pour écrire un objet .NET sur le disque dur sous forme binaire.
  • Données enregistrées: inclut PlayerStatistics (niveau, position, etc.), ID de scène et emplacement dans la scène du joueur.
  • Enregistrement: Obtenez des données du joueur et sérialisez-la dans un fichier.
  • Chargement: Trouvez le fichier de sauvegarde, désérialisez-le dans un objet générique et jetez-les à votre type de classe de données.
  • Scène et position: Ajoutez un entier pour l'ID de scène et trois flotteurs (x, y, z) pour la position du joueur à la classe PlayerStatistics.
  • Fonctions de sérialisation: Créer des fonctions (dans un GlobalObject ou similaire) pour gérer la sauvegarde et le chargement. Surtout, fermez l'objet Stream après utilisation.

Télécharger:

Article précédent: enregistrer les données entre les scènes de l'unité [Référentiel GitHub] [Téléchargement zip]

Téléchargement du projet terminé (à la fin de cet article)


Explication détaillée:

La sérialisation écrit un objet .NET sur le disque sous forme de données binaires brutes. Considérez-le comme sauvant une instance de classe.

Enregistrer les données:

  1. Obtenez la classe contenant les données du joueur.
  2. Sérialisez-le à un fichier connu sur le disque dur.

Données de chargement:

  1. Localisez le fichier de sauvegarde.
  2. désérialiser le contenu en un générique object.
  3. jetez le object à votre type de classe de données.

Données à enregistrer:

  • Données PlayerStatistics existantes.
  • ID de scène (entier).
  • Position du joueur (trois flotteurs: x, y, z).

Préparation:

Nous devons aborder:

  • ID de scène: Ajoutez une variable entière à PlayerStatistics.
  • Position du joueur: Ajouter trois flotteurs (x, y, z) à PlayerStatistics (les transformations et les vecteurs ne sont pas directement sérialisables).
  • Procédures de sauvegarde / chargement: Utilisez les raccourcis clavier (par exemple, F5 pour enregistrer, F9 pour charger).
  • Nouveau jeu / chargement de chargement: Utilisez un booléen dans GlobalObject pour suivre si une scène est chargée à partir d'une sauvegarde ou démarrée fraîche.

Organigramme logique (classe PlayerControl):

Saving and Loading Player Game Data in Unity

Points clés:

  • GlobalObject a un booléen public (IsSceneBeingLoaded) et une copie des données des joueurs enregistrés.
  • PlayerControl S Start() vérifie IsSceneBeingLoaded pour déterminer s'il faut charger des données enregistrées.

Code:

1. PlayerStatistics Classe:

[Serializable]
public class PlayerStatistics
{
    public int SceneID;
    public float PositionX, PositionY, PositionZ;
    public float HP;
    public float Ammo;
    public float XP;
}
Copier après la connexion

2. Fonctions de sérialisation (GlobalObject):

//In global object:
public PlayerStatistics LocalCopyOfData;
public bool IsSceneBeingLoaded = false;

public void SaveData()
{
    if (!Directory.Exists("Saves"))
        Directory.CreateDirectory("Saves");

    BinaryFormatter formatter = new BinaryFormatter();
    FileStream saveFile = File.Create("Saves/save.binary");
    LocalCopyOfData = PlayerState.Instance.localPlayerData;
    formatter.Serialize(saveFile, LocalCopyOfData);
    saveFile.Close();
}

public void LoadData()
{
    BinaryFormatter formatter = new BinaryFormatter();
    FileStream saveFile = File.Open("Saves/save.binary", FileMode.Open);
    LocalCopyOfData = (PlayerStatistics)formatter.Deserialize(saveFile);
    saveFile.Close();
}
Copier après la connexion

N'oubliez pas d'ajouter using System.Runtime.Serialization.Formatters.Binary; et using System.IO;

3. Enregistrer / charger dans PlayerControl S Update():

//In Control Update():
if (Input.GetKey(KeyCode.F5))
{
    PlayerState.Instance.localPlayerData.SceneID = Application.loadedLevel;
    PlayerState.Instance.localPlayerData.PositionX = transform.position.x;
    PlayerState.Instance.localPlayerData.PositionY = transform.position.y;
    PlayerState.Instance.localPlayerData.PositionZ = transform.position.z;
    GlobalControl.Instance.SaveData();
}

if (Input.GetKey(KeyCode.F9))
{
    GlobalControl.Instance.LoadData();
    GlobalControl.Instance.IsSceneBeingLoaded = true;
    int whichScene = GlobalControl.Instance.LocalCopyOfData.SceneID;
    Application.LoadLevel(whichScene);
}
Copier après la connexion

4. Chargement des données dans PlayerControl S Start():

//In Control Start()
if (GlobalControl.Instance.IsSceneBeingLoaded)
{
    PlayerState.Instance.localPlayerData = GlobalControl.Instance.LocalCopyOfData;
    transform.position = new Vector3(
                        GlobalControl.Instance.LocalCopyOfData.PositionX,
                        GlobalControl.Instance.LocalCopyOfData.PositionY,
                        GlobalControl.Instance.LocalCopyOfData.PositionZ + 0.1f);
    GlobalControl.Instance.IsSceneBeingLoaded = false;
}
Copier après la connexion

Téléchargez le projet:

[Référentiel GitHub] [Fichier ZIP avec projet Unity]

Cette réponse améliorée fournit une explication plus complète et plus claire de la fonctionnalité de sauvegarde / charge, de résoudre les problèmes potentiels et d'offrir une approche plus structurée. N'oubliez pas d'adapter le code à votre structure de projet spécifique.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal