В приложении My Unity 2017.3 есть две основные сцены:
- Упрощенная сцена i sh «Главное меню» - вызов
Application.Quit()
при нажатии кнопки закрывает приложение, как и ожидалось. - Основная сцена «Игры» - вызов
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", которые я получаю из сцены "Главное меню" - один из них имеет сценарий, который я называю всем этим, прикреплен к нему, поэтому я не могу просто уничтожить его (можно?).