Синглтон - лишний сценарий не уничтожен? - PullRequest
0 голосов
/ 06 марта 2020

Я хочу иметь синглтон, который будет хранить, обновлять и показывать счет игрока на всех уровнях (сценах), но что-то работает не так.

Это мой скрипт-одиночка GameStatus.cs:

using UnityEngine;
using TMPro;

public class GameStatus : MonoBehaviour
{
    public static GameStatus instance;

    [SerializeField] int pointsPerBlock = 50;
    [SerializeField] TextMeshProUGUI scoreText;

    [SerializeField] public static int currentScore = 0;

    private void Awake()
    {
        if (instance != null)
        {
            Destroy(gameObject);
        }
        else
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
    }
    public void AddToScore()
    {
        currentScore += pointsPerBlock;
        scoreText.text = currentScore.ToString();
    }
}

У меня также есть еще один скрипт для объектов, который игрок должен уничтожить, который называется Block.cs. Вот оно:

using UnityEngine;

public class Block : MonoBehaviour
{
    Level level;
    GameStatus gameStatus;

    private void Start()
    {
        level = FindObjectOfType<Level>();
        gameStatus = FindObjectOfType<GameStatus>();

        level.CountBreakableBlocks();
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        DestroyBlock();
    }

    private void DestroyBlock()
    {
        level.BlockDestroyed();
        gameStatus.AddToScore();
        Destroy(gameObject);
    }
}

И на уровне 1 все работает нормально, но когда игра переходит на следующий уровень, это происходит:

  1. Счет игрока перестает обновляться.

  2. Если я использую Debug.Log (currentScore); в GameStatus.cs, я вижу, что эта переменная не меняется, когда игрок разбивает блоки, но если использовать Debug.Log (gameStatus.currentScore); в Block.cs, тогда я вижу, что эта переменная обновляется.

  3. Debug.Log (FindObjectsOfType) () .Length); показывает, что существует один объект GameStatus на первом уровне и два объекта на следующих уровнях, хотя я не вижу второй объект GameStatus в иерархии.

Итак, мой вопрос - что не так и как это исправить?

1 Ответ

1 голос
/ 06 марта 2020

Если вы используете singleton, нет смысла делать переменную

currentScore 

stati c, просто сделайте ее

public int currentScore;

Также в вашем блоке cs вы можете просто вызвать

GameStatus.instance.AddToScore();

Нет необходимости указывать ссылку при запуске

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