Scripts de sauvegarde en jeu.

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
nomataka
Messages : 1
Inscription : 11 Jan 2020 19:13

Scripts de sauvegarde en jeu.

Message par nomataka » 11 Jan 2020 22:00

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

Jaha
Messages : 4
Inscription : 29 Fév 2020 23:53
Localisation : Rhône Alpes

Re: Scripts de sauvegarde en jeu.

Message par Jaha » 07 Mars 2020 03:53

pourquoi pas les PlayerPrefs?
In Unity, there is strength! :idea:

Avatar de l’utilisateur
Deceleris
Messages : 57
Inscription : 25 Juil 2018 22:06
Contact :

Re: Scripts de sauvegarde en jeu.

Message par Deceleris » 08 Mars 2020 11:35

Perso j'utilise "Save Game Free" de Bayat Game, c'est gratuit tu te doutes et surtout ça marche super bien
Travail actuellement sur : https://deceleris.itch.io/shadows

Maud
Messages : 28
Inscription : 05 Fév 2020 14:30

Re: Scripts de sauvegarde en jeu.

Message par Maud » 18 Juil 2020 20:29

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 !

Avatar de l’utilisateur
Franck
Bricoleur
Bricoleur
Messages : 2884
Inscription : 08 Jan 2011 18:43
Localisation : Tours

Re: Scripts de sauvegarde en jeu.

Message par Franck » 19 Juil 2020 08:36

Dés fois j'bug, dés fois j'bug pas.

Maud
Messages : 28
Inscription : 05 Fév 2020 14:30

Re: Scripts de sauvegarde en jeu.

Message par Maud » 19 Juil 2020 12:29

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?

vex
Messages : 12
Inscription : 25 Août 2018 21:52

Re: Scripts de sauvegarde en jeu.

Message par vex » 19 Juil 2020 23:53

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.

Répondre

Revenir vers « Scripting »