Запускать определенный код только один раз за сеанс при запуске приложения в Unity - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу запускать некоторый код только 1 раз за пользовательский сеанс в моем приложении.

Вот пример:

public class RunCodeOnce : MonoBehaviour
{
    public static bool ranOnce;

    void Awake()
    {
        if (ranOnce) { return; }

        ... code to run only once ...
    }
}

Это хороший метод для этого илиЕсть какой-то другой способ сделать это, что было бы рекомендовано?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Простой ответ - иметь синглтон.Это делается, когда ваша игра запускается, запускает код, и в основном потому, что он никогда не разрушается, этот стартовый код никогда не запускается снова.

Ваш код почти полностью состоит из этого

public class RunCodeOnce : MonoBehaviour
{
    public static RunCodeOnce Instance;

    void Awake()
    {
        if (Instance!=null) { Destroy(gameObject); return; } // stops dups running
        DontDestroyOnLoad(gameObject); // keep me forever
        Instance = this; // set the reference to it

        ... code to run only once ...
    }
}

thisсоздает объект, который сохраняется, который не имеет значения, что никогда не допустит дублирования самого себя, и потому что он не умрет, независимо от того, сколько вы загружаете новых сцен или что-то еще, если вы физически не уничтожите его сами в коде, он не умрет, он будет тамвся сессия.

0 голосов
/ 12 декабря 2018

Вы также можете использовать атрибут RuntimeInitializeOnLoadMethod , как в примере кода ниже.Это будет вызываться Unity только один раз, пока процесс вашего приложения не будет уничтожен.Преимущество заключается в том, что он очень прост и полностью независим от любого MonoBehaviour, если только вам не нужны ссылки на ресурсы через SerializeFields.

Обратите внимание, что enum RuntimeInitializeLoadType можно установить равным BeforeSceneLoad или AfterSceneLoad.

using UnityEngine;

public static class Services
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    public static void Initialize()
    {
        Debug.Log("test");
    }
}
0 голосов
/ 12 декабря 2018

В случае, когда под сессией вы подразумеваете «с момента запуска игры», методы Start / Awake уже решают эту проблему, гарантируя, что скрипт существует только в одном экземпляре.

Но, если вы скорее имеете в виду, «только один раз, так какпользователь установит приложение ", вам придется использовать некоторые постоянные данные для переключения.Самый простой способ - класс PlayerPrefs .

    void Awake()
    {
        Init();
    }

    void Init()
    {
        if (!PlayerPrefs.HasKey("isInit"))
        {
            DoYourStuffHere();
            PlayerPrefs.SetInt("isInit", 1);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...