Page 1 sur 1

Scripts de sauvegarde en jeu.

Publié : 11 Jan 2020 22:00
par nomataka
Bonjour, à tous est à toutes !

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;
Un ActorContainer pour stocker les données de différents joueurs.

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);
    }
}

Re: Scripts de sauvegarde en jeu.

Publié : 07 Mars 2020 03:53
par Jaha
pourquoi pas les PlayerPrefs?

Re: Scripts de sauvegarde en jeu.

Publié : 08 Mars 2020 11:35
par Deceleris
Perso j'utilise "Save Game Free" de Bayat Game, c'est gratuit tu te doutes et surtout ça marche super bien

Re: Scripts de sauvegarde en jeu.

Publié : 18 Juil 2020 20:29
par Maud
Bonjour,
ce sujet m'intéresse, connaissez-vous un tuto sur l'utilisation de Save Game Free et notamment de l'utilisation possible des sauvegarde sur le cloud ?

Jusqu'ici je suis parvenu à sauvegarder mes données avec des playerprefs, ainsi qu'en lecture et écriture d'un fichier local. Par contre je ne parviens pas à sauvegarder des données sur le cloud.... serait-ce envisageable avec Save Game Free ?
Merci pour votre aide !

Re: Scripts de sauvegarde en jeu.

Publié : 19 Juil 2020 08:36
par Franck

Re: Scripts de sauvegarde en jeu.

Publié : 19 Juil 2020 12:29
par Maud
Merci pour ta réponse.
J'avais bien vu l'icône "cloud" ,
je comprend bien l'utilisation en local mais je ne comprend pas comment mettre en place cette sauvegarde sur le cloud (comment connecter la sauvegarde avec unity).
Quelqu'un serait-il capable de m'expliquer ou de m'orienter vers un tuto?

Re: Scripts de sauvegarde en jeu.

Publié : 19 Juil 2020 23:53
par vex
J'ai regardé un peu le code du package Free, je n'ai rien vu sur le Cloud, il n'y a rien non plus dans la documentation et le Cloud n'est pas non plus mentionné sur le Github (liste des features): https://github.com/BayatGames/SaveGameFree

Je n'ai pas la version Gold ou le nouveau package de Bayat (Save System) mais d'après le Package Content sur la page il y a les fichiers .cs et des scènes de démo pour Firebase et PlayFab dans ces 2 versions payantes uniquement.