[CF - Al] Base de données

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Override
Messages : 143
Inscription : 04 Nov 2016 20:08

[CF - Al] Base de données

Message par Override » 02 Avr 2017 19:30

Salut à tous j'ai un problème que je n'arrive pas à régler depuis pas mal de temps, jusque là ce n'était pas un problème mais j'ai finalement vraiment besoin de votre aide :

Je cherche a faire un script Player qui va contenir toutes ses infos, comme les stats par exemple. Mais j'ai besoin que ce script soit accessible depuis toutes les scènes. Donc j'ai fait en sorte qu'il soit de base static pour éviter qu'il soit présent sur chaque scènes. Bon ensuite la où ça coince, donc maintenant le but c'est que ce script soit sauvegardable...

Le Script :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public static class Player {

	public static bool sfx = true;
	public static bool music = true;

	static List<Click> clicks = new List<Click> ();
	public static int equippedClick;

	public static void Actualise () {
		if (File.Exists (Application.persistentDataPath + "/Saves." + "Player"))
			this = (Player)SaveManager.Load ("Player");
	}

	public static void Save () {
		SaveManager.Save (this, "Player");
	}

	public static Click EquippedClick () {
		return clicks [equippedClick];
	}
}
Sauf que là unity m'explique gentiment que :

Assets/Scripts/Player.cs(16,11): error CS0716: Cannot convert to static type `Player'

Assets/Scripts/Player.cs(16,4): error CS0026: Keyword `this' is not valid in a static property, static method, or static field initializer

Assets/Scripts/Player.cs(16,4): error CS1604: Cannot assign to `this' because it is read-only

et enfin

Assets/Scripts/Player.cs(20,21): error CS0026: Keyword `this' is not valid in a static property, static method, or static field initializer


Donc la je bloque quoi...

Si vous avez une idée ou une info je suis preneur :D
:merci:

Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: [CF - Al] Base de données

Message par simonj » 02 Avr 2017 21:01

Salut,

Il te dis juste que le "this" n'est pas valide. Pour être plus précis, tu ne peux pas utiliser "this" dans une fonction static vu que c'est une fonction qui est propre à TOUTES les instances d'une classe et le this désigne UNE instance. Dans la fonction, il ne sais pas à quelle instance se réfère le "this"

Code : Tout sélectionner

SaveManager.Save (this, "Player");
Qu'est ce que fait le SaveManager exactement ?

Override
Messages : 143
Inscription : 04 Nov 2016 20:08

Re: [CF - Al] Base de données

Message par Override » 02 Avr 2017 21:10

Ah oui en effet exact merci, j'ai essayé d'autres combines mais bon apparemment ça bloque au niveau de la sérialization...

Ce script permet de sauvegarder en BinaryFormatter
:merci:

Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: [CF - Al] Base de données

Message par simonj » 02 Avr 2017 22:23

Alors en fait, l'astuce dans ce genre de cas c'est pas de tout mettre en static. Mais de mettre uniquement une variable static du même type que la classe et nommé "Instance" qui elle va être static. Ce qui te permet de l’appeller de n'importe où (Ici : Player.Instance) mais de garder les fonctionnalités en non-static. Et donc de pouvoir sérialiser les champs.

Ca donnerais :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class Player {
	public static Player _instance = null;
	public static Player Instance
	{
		get
		{
			if(_instance == null)
			{
				_instance = new Player();
				// You can load automatically the Player data here if you want
			}
			return _instance;
		}
	}
	
   	public bool sfx = true;
   	public bool music = true;

   	List<Click> clicks = new List<Click> ();
   	public int equippedClick;

	// Replace the old instance for a new instance of Player with data loaded
   	public static void Load() {
      		if (File.Exists (Application.persistentDataPath + "/Saves." + "Player"))
         		_instance = (Player)SaveManager.Load ("Player");
   	}

	// Save the current version of the instance of the Player
   	public static void Save () {
      		SaveManager.Save (this, "Player");
   	}

	// Return the current equiped click (Can be static : Player.EquippedClick() or not : Player.Instance.EquippedClick())
   	public Click EquippedClick () {
      		return Instance.clicks[Instance.equippedClick];
   	}
}

Override
Messages : 143
Inscription : 04 Nov 2016 20:08

Re: [CF - Al] Base de données

Message par Override » 06 Avr 2017 18:58

Merci beaucoup pour ta réponse, elle m'est d'une très grande aide, j'ai pas pu répondre à cause d'un problème de wifi mais me voilà, merci, Vraiment !
:merci:

Répondre

Revenir vers « (C#) CSharp »