Сбой сборки Unity 5.2.1 в Application.Quit(); с сенсорным экраном Windows

Я обновляю свой проект Unity 4 до Unity 5.2.1. Я использовал Application.Quit(); чтобы закрыть приложение по нажатию кнопки. Это прекрасно работало раньше (Unity 4) с мышью и касанием, а теперь (Unity 5.2) также отлично работает с щелчком мыши. Но если я нажму кнопку с помощью Touch (на сенсорных экранах Windows 8 или Windows 7), приложение вылетит.

Затем я протестировал, создав новый проект Unity и добавив файл cs с приведенным ниже кодом в основную камеру. Когда я нажимаю эту кнопку с помощью Touch, происходит сбой. Но не вылетает по щелчку мыши. Это ошибка в Unity 5.2.1? Как я могу решить эту проблему?

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

public Texture btnTexture;

void OnGUI()
{
    if (!btnTexture)
    {
        Debug.LogError("Please assign a texture on the inspector");
        return;
    }
    if (GUI.Button(new Rect(10, 10, 50, 50), btnTexture))
    {
        Debug.LogError("Clicked the button with an image");
        Application.Quit();
    }

    if (GUI.Button(new Rect(10, 70, 50, 30), "Click"))
        Debug.LogError("Clicked the button with text");

    }
}

Спасибо


person Madhu    schedule 03.12.2015    source источник


Ответы (2)


[EDIT:] Это решило проблему:

System.Diagnostics.Process.GetCurrentProcess().Kill();
// instead of
// Application.Quit();

Вы пытались вызвать Application.Quit вне метода OnGUI? Как это:

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
    void OnGUI()
    {
        if (GUI.Button(new Rect(10, 10, 50, 50), "Exit"))
        {
            StartCoroutine(Quit());
        }
    }

    public static IEnumerator Quit()
    {
        yield return new WaitForEndOfFrame();
        Application.Quit();
    }
}
person Denis L.    schedule 04.12.2015
comment
Спасибо за ответ Денис. Теперь я попробовал ваш код, и все то же самое происходит, когда я использую Touch. - person Madhu; 04.12.2015
comment
Еще одна вещь, которую вы можете попробовать, это: System.Diagnostics.Process.GetCurrentProcess().Kill(); вместо Application.Quit(); Я не знаю, работает ли это в Windows, но мне это помогло решить некоторые сбои со старой версией Unity на Android. - person Denis L.; 06.12.2015
comment
Спасибо Денис. Кажется, это решает проблему сбоя. Но будут ли побочные эффекты при использовании GetCurrentProcess().Kill()? - person Madhu; 14.12.2015
comment
Сделайте несколько тестов и посмотрите, показывает ли Windows какие-либо сообщения об ошибках. Я использовал это решение для некоторых своих игр на Android и никогда не получал жалоб. - person Denis L.; 16.12.2015
comment
Используйте if(!Application.isEditor) { System.Diagnostics.Process.GetCurrentProcess().Kill(); }, иначе это также приведет к сбою плеера/Unity! Хотя это решение работает, это сложный выход, и его не следует использовать, если Application.Quit() работает. К сожалению, предложенная версия IEnumerator по-прежнему заставляет мое приложение зависать, поэтому у меня нет выбора. :/ - person Neph; 17.04.2020

if (Input.GetKey("escape")) Application.Quit();

person Maaz Irfan    schedule 22.08.2017
comment
вы можете использовать это не только для окон, но и для сборки Android. - person Maaz Irfan; 22.08.2017