Je suis un amateur dans le métier et j'ai toujours apprécié le codage informatique. Depuis maintenant quelques années je me forme en autodidacte bien que j'aie des lacunes dans les métiers. J'ai commencé la réalisation d'un RPG à la première personne, j'ai réussi à mettre en pratique les connaissances que j'ai apprises mais à l'heure actuelle. Je bûche sur un problème récurrent. J'ai suivi plusieurs tutos sur les principes de sauvegardes dans unity. Les playerprefs m'étant inutiles, je me suis dirigé vers une sauvegarde du type ( .Json et XML). J'ai suivi un tuto assez concret et j'ai essayé de faire mes tests avec celui-ci mais voilà je n'arrive pas à saisir pourquoi la sauvegarde ne s'exécute pas lorsque je quitte et relance ma scène, voire même, lorsque je change de scènes. J'ai 4 scripts.
Si vous pouvez m'éclairer dans la bonne configuration de ce script, je vous en serais reconnaissant : -D .
une classe d'acteur qui contient les données de mon acteur.
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
using System;
using System.IO;
public class Actor : MonoBehaviour {
public ActorData data = new ActorData();
public static GameController controller;
void Awake()
{
}
void Start()
{
// playerstats = GameObject.FindGameObjectWithTag("Health").GetComponent<PlayerStats>();
}
public void StoreData()
{
data.pos = transform.position;
// data.playerstats = playerstats;
}
public void LoadData()
{
transform.position = data.pos;
// playerstats = data.playerstats;
}
public void ApplyData()
{
SaveData.AddActorData(data);
}
void OnEnable()
{
SaveData.OnLoaded += LoadData;
SaveData.OnBeforeSave += StoreData;
SaveData.OnBeforeSave += ApplyData;
}
void OnDisable()
{
SaveData.OnLoaded -= LoadData;
SaveData.OnBeforeSave -= StoreData;
SaveData.OnBeforeSave -= ApplyData;
}
}
[Serializable]
public class ActorData
{
public Vector3 pos;
Code : Tout sélectionner
using UnityEngine;
using System;
using System.Collections.Generic;
[Serializable]
public class ActorContainer {
public List<ActorData> actors = new List<ActorData>();
}
SaveData qui effectue ma sérialisation.
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
using System.Xml.Serialization;
using System.IO;
public class SaveData
{
public static ActorContainer actorContainer = new ActorContainer();
public delegate void SerializeAction();
public static event SerializeAction OnLoaded;
public static event SerializeAction OnBeforeSave;
public static void Load(string path)
{
actorContainer = LoadActors(path);
OnLoaded();
ClearActorList();
}
public static void Save(string path, ActorContainer actors)
{
OnBeforeSave();
//ClearSave(path);
SaveActors(path, actors);
ClearActorList();
}
public static void AddActorData(ActorData data)
{
actorContainer.actors.Add(data);
}
public static void ClearActorList()
{
actorContainer.actors.Clear();
}
private static ActorContainer LoadActors(string path)
{
string json = File.ReadAllText(path);
return JsonUtility.FromJson<ActorContainer>(json);
}
private static void SaveActors(string path, ActorContainer actors)
{
string json = JsonUtility.ToJson(actors);
StreamWriter sw = File.CreateText(path);
sw.Close();
File.WriteAllText(path, json);
}
}
GameController qui agit comme un communicateur avec Unity.
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.IO;
public class GameController : MonoBehaviour {
public Button saveButton;
public Button loadButton;
public GameObject playerPrefab;
private static string dataPath = string.Empty;
void Awake()
{
dataPath = Path.Combine(Application.persistentDataPath, "MyTest.json");
}
void Start()
{
// CreateActor(playerPath, new Vector3(0, 1.6f, 0), Quaternion.identity);
// CreateActor(playerPath, new Vector3(5, 1.6f, 0), Quaternion.identity);
//CreateActor(playerPath, new Vector3(-5, 1.6f, 0), Quaternion.identity);
}
public static Actor CreateActor(string path, Vector3 position, Quaternion rotation)
{
GameObject prefab = Resources.Load<GameObject>(path);
GameObject go = Instantiate(prefab, position, rotation) as GameObject;
Actor actor = go.GetComponent<Actor>() ?? go.AddComponent<Actor>();
return actor;
}
public static Actor CreateActor(ActorData data, string path, Vector3 position, Quaternion rotation)
{
Actor actor = CreateActor(path, position, rotation);
actor.data = data;
return actor;
}
public void Save()
{
SaveData.Save(dataPath, SaveData.actorContainer);
}
public void Load()
{
SaveData.Load(dataPath);
Debug.Log(Application.persistentDataPath);
}
public void OnEnable()
{
saveButton.onClick.AddListener(Save);
loadButton.onClick.AddListener(Load);
}
public void OnDisable()
{
saveButton.onClick.RemoveListener(Save);
loadButton.onClick.RemoveListener(Load);
}
}