在Unity3D中,是否有任何方法可以立即检查网络可用性? “即时”是指在一个帧内,因为此检查下面的代码行需要根据网络可用性工作。
这一切都发生在Start()
期间。我知道我可以ping通网页,并根据网页下载过程中发生的任何错误获得网络可用性。但是,这样的操作需要花费几秒钟,而我需要立即知道结果,然后再移到脚本中的下一行代码。
最佳答案
这一切都发生在Start()
是的,这是可能的,并且在这种情况下可以在一帧中完成。如果在Update
函数中的每一帧都执行此操作,我会感到非常沮丧,但事实并非如此。如果这是在应用程序的开头完成的,那很好。如果在游戏运行时执行此操作,则会影响性能。
但是这样的操作要花几秒钟
这样做是为了避免阻塞主线程。
网络操作应在Thread
或async
方法中进行,以避免阻塞主线程。这就是大多数Unity网络API(例如WWW
和UnityWebRequest
)的工作方式。他们在后台使用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/