Проблемы с включением и выключением одноэлементного шаблона - PullRequest
0 голосов
/ 28 мая 2020

В настоящее время я тестирую шаблон синглтона с простой игрой в прорыв. способ, которым я реализую одноэлементный шаблон, таков.

using UnityEngine;

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
    //Check if about to be destroyed
    private static bool bShutOff = false;
    private static object oLock = new object();
    private static T oInstance;

    public static T Instance
    {
        get
        {
            // First check if this object is OFF 
            if (bShutOff)
            {
                Debug.LogWarning("Singleton instance '" + typeof(T) + "' already destroyed. Returning null.");
                return null;
            }

            lock (oLock)
            {
                if (oInstance == null)
                {
                    //Search for exissting instance 
                    oInstance = (T)FindObjectOfType(typeof(T));

                    // If it still doesn't find one, it creates a new one 
                    if (oInstance == null)
                    {
                        // Creates a game object to attach the singleton 
                        var oSingletonObject = new GameObject();
                        oInstance = oSingletonObject.AddComponent<T>();
                        oSingletonObject.name = typeof(T).ToString() + "(Singleton)";

                        // Make the instance persisten in the world 
                        DontDestroyOnLoad(oSingletonObject);
                    }

                }

                return oInstance;
            }
        }
    }

    private void OnApplicationQuit()
    {
        bShutOff = true;
    }


    private void OnDestroy()
    {
        bShutOff = true;
    }

}

И шаблон используется классом с именем GameSession (удален некоторый код для видимости)

using UnityEngine;
using TMPro;

public class GameSession : Singleton<GameSession>
{
    // Avoids non-singleton construuctor use
    protected GameSession() { }

    // config params 
    [Range(0.1f, 2f)] [SerializeField] float fGameSpeed = 1f; // Range le añade un rango maximo un valor serializado
    [SerializeField] int nPointsPerBlock = 50;
    [SerializeField] TextMeshProUGUI tScore;

    // State variables
    [SerializeField] int nCurScore = 0;


    void Start()
    {
        tScore.text = nCurScore.ToString();
    }

    // Update is called once per frame
    void Update()
    {
        Time.timeScale = fGameSpeed; // normal time
    }

    public void AddScore()
    {
        nCurScore += nPointsPerBlock;
        tScore.text = nCurScore.ToString();
    }

}

Сначала это не работает, но как только объект будет уничтожен (переходом на другую сцену), для логического bShutOff устанавливается значение True (ожидается), но затем, поскольку bShutOff имеет значение True, ни одна из других функций кода не работает, и я получаю мое отладочное сообщение "Debug.LogWarning (" экземпляр Singleton '"+ typeof (T) +"' уже уничтожен. Возвращается значение null. ");" (также ожидается, если объект должен быть выключен) Я думаю, это из-за DontDestroyOnLoad (oSingletonObject); logi c сначала не было (?) Я новичок в единстве и шаблоне singleton, поэтому, если бы кто-нибудь мог указать мне в правильном направлении, это было бы неплохо.

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