0
votes

Le score ne commence pas avec 0 au début du jeu

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?

score strong> p> xxx pré>

scorePanelupdater strong> p>

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


0 commentaires

3 Réponses :


0
votes

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


4 commentaires

Ce PlayerPrefs.Setint ("Score", 0); Score = PlayerPrefs.Getint ("Score", 0); n'a pas beaucoup de sens ... alors vous pouvez simplement dire score = 0; 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 où il n'y a pas besoin / sens de le faire;)



2
votes

Une autre chose que vous pourriez faire est de sauvegarder votre score comme une variable statique forte>. De cette façon, vous pouvez y accéder à chaque scène, mais la valeur sera réinitialisée une fois que vous redémarrez le jeu.

public static int score = 0;


0 commentaires

2
votes

Vous utilisez 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>


Pour répondre à votre question: vous avez P>

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


4 commentaires

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;


Et erreur à text.text = text = "Score:" + NewValue; Dans le script du panneau


ouais c'était une typo .. text.text = "Score:" + NewValue;