在Unity3D中,是否有任何方法可以立即检查网络可用性? “即时”是指在一个帧内,因为此检查下面的代码行需要根据网络可用性工作。

这一切都发生在Start()期间。我知道我可以ping通网页,并根据网页下载过程中发生的任何错误获得网络可用性。但是,这样的操作需要花费几秒钟,而我需要立即知道结果,然后再移到脚本中的下一行代码。

最佳答案

这一切都发生在Start()


是的,这是可能的,并且在这种情况下可以在一帧中完成。如果在Update函数中的每一帧都执行此操作,我会感到非常沮丧,但事实并非如此。如果这是在应用程序的开头完成的,那很好。如果在游戏运行时执行此操作,则会影响性能。


  但是这样的操作要花几秒钟


这样做是为了避免阻塞主线程。

网络操作应在Threadasync方法中进行,以避免阻塞主线程。这就是大多数Unity网络API(例如WWWUnityWebRequest)的工作方式。他们在后台使用Thread,然后通过在帧中产生/等待协程函数直到网络请求完成,从而为协程提供协程以管理该线程。

要在一帧中完成此操作,只需使用HttpWebRequest并提供服务器URL进行检查。大多数示例都使用google.com,因为它始终在线,但请确保提供“ User-Agent”,以便在移动设备上不会拒绝连接。最后,如果HttpStatusCode不是200或存在异常,则说明存在问题,否则假定它已连接。

bool isOnline()
{
    bool success = true;
    try
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://google.com");
        request.Method = "GET";

        //Make sure Google don't reject you when called on mobile device (Android)
        request.changeSysTemHeader("User-Agent", "Mozilla / 5.0(Windows NT 10.0; WOW64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 55.0.2883.87 Safari / 537.36");

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        if (response == null)
        {
            success = false;
        }

        if (response != null && response.StatusCode != HttpStatusCode.OK)
        {
            success = false;
        }
    }
    catch (Exception)
    {
        success = false;
    }

    return success;
}


用于更改用户代理的自定义changeSysTemHeader函数的类:

public static class ExtensionMethods
{
    public static void changeSysTemHeader(this HttpWebRequest request, string key, string value)
    {
        WebHeaderCollection wHeader = new WebHeaderCollection();
        wHeader[key] = value;

        FieldInfo fildInfo = request.GetType().GetField("webHeaders",
                                                System.Reflection.BindingFlags.NonPublic
                                                   | System.Reflection.BindingFlags.Instance
                                                   | System.Reflection.BindingFlags.GetField);

        fildInfo.SetValue(request, wHeader);
    }
}


通过一帧完成Start函数的简单用法:

void Start()
{
    Debug.Log(isOnline());
}

关于c# - 如何在单帧期间检查互联网可用性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48385756/

10-13 06:57