Unity Как запустить подпрограмму OnApplicationQuit? - PullRequest
1 голос
/ 27 февраля 2020

Я хочу запустить StartCoroutine(LogOutUser(url, () => { Debug.Log("logOut req done"); }));, который отправляет данные на сервер, по функции OnApplicationQuit. однако это выдает эту ошибку *

NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта RegisterLogIn + d__16.MoveNext () (в Assets / Scripts / RegisterLogIn.cs: 71) *

RegisterLogIn - это класс кода ниже

void LogOut()
    {

        string url = String.Format("http://localhost:7989/RegisterApi/logout?myTempID={0}", myTempID);
        StartCoroutine(LogOutUser(url, () => { Debug.Log("logOut req done"); }));
    }

    private async void OnApplicationQuit()
    {
        LogOut();
        await websocket.Close();
    } 

IEnumerator LogOutUser(string url, Action onSuccess)
    {
        UnityWebRequest req = UnityWebRequest.Get(url);

        yield return req.SendWebRequest();
        while (!req.isDone)
            yield return null;

        string result = req.downloadHandler.text;

        onSuccess();

    }

как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Если вы запускаете сопрограмму в OnApplicationQuit .. приложение завершит работу, прежде чем сопрограмма сможет завершить sh, и все объекты будут уничтожены.

В соответствии с этим потоком простой Get SendWebRequest будет не имеет зависимости от основного потока, поэтому безопасно завершить основной поток до завершения.

https://forum.unity.com/threads/http-requests-without-coroutines.495418/

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

Попробуйте это:

void LogOut()
{
    string url = String.Format("http://localhost:7989/RegisterApi/logout?myTempID={0}", myTempID);
    LogOutUser(url, () => { Debug.Log("logOut req done"); });
}

private async void OnApplicationQuit()
{
    LogOut();
    await websocket.Close();
} 

void LogOutUser(string url, Action onSuccess)
{
    UnityWebRequest req = UnityWebRequest.Get(url);

    req.SendWebRequest();
    while (!req.isDone) {
        System.Threading.Thread.Sleep(100);
    }

    string result = req.downloadHandler.text;
    onSuccess();
}
0 голосов
/ 27 февраля 2020

Я понимаю, что OnApplicationQuit не ждет сопрограмм, потому что похож на другой поток и продолжает свою работу. Вы можете обернуть свое собственное приложение, чтобы завершить выход из системы.

public class MyGame : MonoBehaviour
{
    public void GameLogic()
    {
        MyApplication.QuitWithLogOut();
    }
}
public class MyApplication : Application
{
    public static void QuitWithLogOut()
    {
        Quiter quiter = new GameObject().AddComponent<Quiter>();

        quiter.Quit();
    }
}
public class Quiter : MonoBehaviour
{
    private bool isLogOutDone;

    public void Quit()
    {
        string url = String.Format("http://localhost:7989/RegisterApi/logout?myTempID={0}", myTempID);
        StartCoroutine(LogOutUser(url, () => { Debug.Log("logOut req done"); }));
    }

    LogOutUser(string url, Action onSuccess)
    {
        UnityWebRequest req = UnityWebRequest.Get(url);

        yield return req.SendWebRequest();
        while (!req.isDone)
            yield return null;

        string result = req.downloadHandler.text;
        isLogOutDone = true;
        onSuccess();

    }
}
...