Je fais une partie et j'essaie de transmettre des données de la scène à la scène (le score). Le problème est que lorsque je recommence au jeu de l'unité, le score reste 4-5, 10 dépend de la dernière session et ne commencez pas la normale avec 0 à partir de la première scène. (Je veux toujours que les données soient enregistrées de la scène à la scène, mais le score à réinitialiser lorsque je clique sur l'unité de l'unité) J'ai 2 scripts, que dois-je changer?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ScorePanelUpdater : MonoBehaviour
{
void Update()
{
GameObject go = GameObject.Find("Score");
if(go == null)
{
Debug.LogError("Failed");
this.enabled = false;
return;
}
Score gs = go.GetComponent<Score>();
GetComponent<Text>().text = " Score: " + gs.GetScore();
}
}
3 Réponses :
Essayez d'ajouter suite à la section Démarrer () code> (première scène) ou OnApplicationQuit () Code> (dernière scène): void Start()
{
PlayerPrefs.SetInt("score", 0); // THIS LINE
//TODO: OPTIMIZE THE FOLLOWING CODE
score = PlayerPrefs.GetInt("score", 0);
GameObject.DontDestroyOnLoad(this.gameObject);
Debug.LogFormat("Current Score: {0}", score);
Button btn = GetComponent<Button>();
button.onClick.AddListener(TaskOnClick);
}
Ce PlayerPrefs.Setint ("Score", 0); Score = PlayerPrefs.Getint ("Score", 0); code> n'a pas beaucoup de sens ... alors vous pouvez simplement dire score = 0; code> et ne pas utiliser lecteurs de joueur
/ code> du tout
@derhugo, bien sûr, mon ami, bien sûr ... J'adore les gens à résoudre les problèmes de leur point de vue. Si quelqu'un écrit qu'il / elle a des problèmes avec JouePrefs, je lui dis simplement le vecteur de ce que ces problèmes peuvent être résolus. Le vecteur, mais pas complètement une solution. Je laisse les gens à penser par eux-mêmes, de trouver une meilleure solution lorsqu'ils commenceront à penser comme "Yep, Regainpred n'est pas un meilleur moyen de le faire dans ce cas". Si nous avons donné aux personnes des solutions prêtes à l'emploi, ils cesseront en fait de chercher quelque chose d'autre dans le cas d'un problème.
@derhugo, et s'ils cesseront de chercher des informations supplémentaires ... Oui, ils résoudront le problème plus précisément à l'aide de la solution pratiquement parfaite à l'emploi que nous publions ici. Mais dans le cas "global", ils obtiendront moins, et moins, et moins de compétences, balaya lorsque des peuples à la recherche d'une chose, ils obtiendront plus d'informations périphériques sur une autre. Merci.
Je comprends votre point de vue .. la question cependant, dans ce cas, c'est l'OP à l'aide d'un mauvais outil en premier lieu. C'est une solution de contournement ce que vous fournissez ici et valide .. Cependant, je préférerais plutôt aborder le problème réel qui utilise < Code> PlayerPrafs code> où il n'y a pas besoin / sens de le faire;)
Une autre chose que vous pourriez faire est de sauvegarder votre score comme une variable statique public static int score = 0;
Vous utilisez Pour répondre à votre question: vous avez P> DONTDestroyOnload code> Votre instance et les valeurs suivantes sont également maintenues dans toutes les scènes. Vous n'avez pas besoin de / ne doit pas utiliser playerprefs code> du tout. strong>
public class ScorePanelUpdater : MonoBehaviour
{
// better if you can already reference this via Inspector
[SerializeField] Text text;
void Awake()
{
if(!text) text = GetComponent<Text>();
// it's always save to remove listeners before adding them
// makes sure it is added only once
GameInformation.OnScoreChanged -= OnScoreChanged;
GameInformation.OnScoreChanged += OnScoreChanged;
// invoke once now with current value
OnScoreChanged(GameInformation.Score);
}
private void OnDestroy()
{
GameInformation.OnScoreChanged -= OnScoreChanged;
}
private void OnScoreChanged(int newValue)
{
text.text = "Score: " + newValue;
}
}
Le script d'information de jeu me donne une erreur à l'action
quelle erreur? Cela ne devrait pas;) Vous aurez peut-être besoin de à l'aide du système; code>
Et erreur à text.text = text = "Score:" + NewValue; Dans le script du panneau
ouais c'était une typo .. text.text = "Score:" + NewValue; code>