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.
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:
PlayerStatistics
(niveau, position, etc.), ID de scène et emplacement dans la scène du joueur. PlayerStatistics
. 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:
Données de chargement:
object
. object
à votre type de classe de données. Données à enregistrer:
PlayerStatistics
existantes. Préparation:
Nous devons aborder:
PlayerStatistics
. PlayerStatistics
(les transformations et les vecteurs ne sont pas directement sérialisables). GlobalObject
pour suivre si une scène est chargée à partir d'une sauvegarde ou démarrée fraîche. Organigramme logique (classe PlayerControl):
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; }
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(); }
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); }
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; }
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!