Unity如何启动协程OnApplicationQuit?

问题描述 投票:0回答:2

我想触发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();

    }

我该怎么做?

unity3d exit coroutine
2个回答
0
投票

我了解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();

    }
}

0
投票

如果在OnApplicationQuit中启动协程,则在协程有机会完成之前,应用程序将退出,并且所有对象都将被销毁。

根据此线程,一个简单的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();
}
© www.soinside.com 2019 - 2024. All rights reserved.