Сброс счета при перезапуске - PullRequest
2 голосов
/ 10 апреля 2019

У меня есть небольшая 2D-игра, которую я создаю со счетчиком очков. При перезапуске / окончании игры я хочу, чтобы счетчик очков вернулся к 0, но я не уверен, как это сделать. Это для игры на Unity и я также называю счетчик на игроке. Я приложил свой код внизу и буду признателен за любую помощь!

public class CounterScript : MonoBehaviour
{
    public int scoreValue = 0;
    Text score;

    void Start()
    {
        score = GetComponent<Text>();
        scoreValue = 0;
    }

    void Update()
    {
        score.text = "" + scoreValue;
    }
}

Код моей кнопки перезапуска:

public class RestartButtonL1 : MonoBehaviour
{
    public CounterScript counter;

    public void restartScene()
    {
        counter.scoreValue = 0;
        SceneManager.LoadScene("GameSceneA");
    }
}

Код на моем плеере:

using UnityEngine;
using System.Collections;

public class Controller : MonoBehaviour
{
    public float speed;

    private Rigidbody2D rb2d;

    public GameObject restartPanel;

    private CounterScript counter;

    private void Start()
    {
        counter = GetComponent<CounterScript>();

        restartPanel.SetActive(false);

        rb2d = GetComponent<Rigidbody2D>();
    }

    // ...    

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.CompareTag("PickUp"))
        {
            SoundManagerScript.PlaySound("sound");

            other.gameObject.SetActive(false);

            CounterScript.scoreValue += 1;
        }

        if (other.gameObject.CompareTag("Enemy"))
        {
            restartPanel.SetActive(true);
        }
    }

1 Ответ

2 голосов
/ 10 апреля 2019

Значение scoreValue static не влияет на загрузку другой (или той же) сцены.

Быстрым решением было бы просто сбросить его перед загрузкой сцены

public void restartScene()
{
    CounterScript.scoreValue = 0;
    SceneManager.LoadScene("GameSceneA");
}

или (я не знаю, как работает учебник, но если в игре нет DontDestroyOnLoad), просто всегда устанавливайте значение в Start из CounterScript (это работает, конечно, если дальнейшее переключение не происходит) сцены и другие CounterScript экземпляры)

void Start()
{
    score = GetComponent<Text> ();
    scoreValue = 0;
}

В этом случае все может быть в порядке, но в целом вы должны стараться избегать создания вещи static, просто чтобы получить к ней более "легкий доступ" ... вместо этого вы должны иметь

public int scoreValue;

, а затем ссылку на фактический экземпляр CounterScript, например,

public class RestartButtonL1 : MonoBehaviour
{
    // reference the CounterScript here by drag and drop
    // the acording GameObject from the scene into this field
    public CounterScript counter;

    public void restartScene()
    {
        counter.scorevalue = 0;
        SceneManager.LoadScene("GameSceneA");
    }
}

Это всего лишь пример того, как получить доступ к экземпляру значения, например, куда бы вы ни увеличили это. Потому что на самом деле, сделав его нестатичным, он будет сброшен путем (пере) загрузки сцены в любом случае;)

см. Также Управление объектами GameObject с использованием компонентов

Sidenote: Вы всегда должны удалять пустые Start, Update и другие вызовы событий MonoBehaviour. Если вы этого не сделаете, Unity все равно вызывает их, вызывая ненужные накладные расходы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...