Сборка приложения Unity зависает при вызове «Application.Quit ()» - PullRequest
0 голосов
/ 17 апреля 2020

В приложении My Unity 2017.3 есть две основные сцены:

  1. Упрощенная сцена i sh «Главное меню» - вызов Application.Quit() при нажатии кнопки закрывает приложение, как и ожидалось.
  2. Основная сцена «Игры» - вызов Application.Quit() в меню паузы (панель, использующая Time.timeScale = 0f при открытии и Time.timeScale = 1f при закрытии) приводит к зависанию приложения. Через 5 секунд я получаю оверлей grey-i sh и синий Windows ', поворачивая круг, и чуть позже появляется всплывающее окно «myapp.exe перестало работать».

Это происходит только со встроенной версией моего приложения («P C, Ma c & Linux Standalone», запущенной через exe), так как Application.Quit() этого не делает делайте что-нибудь в плеере Unity.

На главной сцене много чего происходит, но я (пытаюсь) остановить все InvokeRepeating s, Thread s и Coroutine s, которые я использую :

public void ExitApp() {
    Time.timeScale = 1f;

    if(stalker!=null) {
        stalker.GetComponent<Stalker>().enabled = false; //InvokeRepeating script attached to a GO
        stalker.SetActive(false);
    }

    if(loadGOThread!=null) {
        keepThreadStuffRunning = false; //used in the thread
        loadGOThread.Abort();
    }

    if(co2!=null) { StopCoroutine(co2); } //Two coroutines
    if(co1!=null) { StopCoroutine(co1); } //co1 starts co2

    myPlayer.GetComponent<PlayerController>().enabled = false;
    myPlayer.GetComponent<InputManagerGame>().enabled = false;

    Application.Quit();
}

Я попытался использовать сопрограмму в соответствии с предложением здесь :

public void ExitApp() {
    StartCoroutine(QuitApp());
}

public IEnumerator QuitApp() {
    //Stopping everything here
    yield return new WaitForEndOfFrame();
    Application.Quit();
}

Приложение все еще зависает.

Затем я заменил Application.Quit() с (как предложено здесь ):

if (!Application.isEditor) { System.Diagnostics.Process.GetCurrentProcess().Kill(); }

Это сработало, конечно, но кажется более "перерезанным" - чем правильное решение. Есть ли что-то, чего мне не хватает, что-то еще, что мне нужно сделать, прежде чем я смогу позвонить Application.Quit()?

Я звоню Quit() и Dispose() на всех StreamReader s, которые я использую, так что эти не "утечка". Осталось только несколько GameObject в памяти (которые отображаются во время выхода из приложения) и два пустых / невидимых игровых объекта "DontDestroyOnLoad", которые я получаю из сцены "Главное меню" - один из них имеет сценарий, который я называю всем этим, прикреплен к нему, поэтому я не могу просто уничтожить его (можно?).

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