Как проверить доступность Интернета без создания накладных расходов в Unity3d
Мне нужно проверить, доступен ли интернет в моих играх, чтобы я мог принять решение. Существует два разных типа решений, когда интернет работает и когда интернет не работает. Я нашел способ, но он создает накладные расходы для процессора. В настоящее время я использую этот тип решения. Есть ли лучший способ проверить доступность интернета или нет?
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class DeviceConnected : MonoBehaviour
{
private const bool allowCarrierDataNetwork = false;
private const string pingAddress = "8.8.8.8"; // Google Public DNS server
private const float waitingTime = 2.0f;
public Text txtInternetConnectStatus;
private Ping ping;
private float pingStartTime;
private bool isInternetAvailable = false;
public void Start()
{
InvokeRepeating("OnStartCheck", 0f,3.0f);
}
public void OnStartCheck()
{
bool internetPossiblyAvailable;
switch (Application.internetReachability)
{
case NetworkReachability.ReachableViaLocalAreaNetwork:
internetPossiblyAvailable = true;
break;
case NetworkReachability.ReachableViaCarrierDataNetwork:
internetPossiblyAvailable = allowCarrierDataNetwork;
break;
default:
internetPossiblyAvailable = false;
break;
}
if (!internetPossiblyAvailable)
{
InternetIsNotAvailable();
return;
}
ping = new Ping(pingAddress);
pingStartTime = Time.time;
}
public void Update()
{
if (ping != null)
{
Debug.Log("Hi");
bool stopCheck = true;
if (ping.isDone)
{
if (ping.time >= 0)
InternetAvailable();
else
InternetIsNotAvailable();
}
else if (Time.time - pingStartTime < waitingTime)
stopCheck = false;
else
InternetIsNotAvailable();
if (stopCheck)
ping = null;
}
}
private void InternetIsNotAvailable()
{
if (isInternetAvailable == false)
{
Debug.Log("No Internet :(");
txtInternetConnectStatus.text = "No Internet :(";
isInternetAvailable = true;
}
}
private void InternetAvailable()
{
if (isInternetAvailable==true)
{
Debug.Log("Internet is available! ;)");
txtInternetConnectStatus.text = "Internet is available! ;)";
isInternetAvailable = false;
}
}
public void OnClickShowMediationSuite()
{
ShowAds.instance.ShowMediationSuite();
}
}
1 ответ
Это было написано на лету без единства, поэтому могут быть некоторые ошибки. Этот код теперь использует StartCorutine
вместо InvokeRepeating
и повторяющиеся части теперь являются циклами внутри функции, используя yield return WaitForSeconds(timeBetweenChecks);
для длительных задержек и yield return null;
для задержек одного кадра.
public class DeviceConnected : MonoBehaviour
{
private const bool allowCarrierDataNetwork = false;
private const string pingAddress = "8.8.8.8"; // Google Public DNS server
private const float waitingTime = 2.0f;
private const float timeBetweenChecks = 3.0f;
public Text txtInternetConnectStatus;
private float pingStartTime;
private bool isInternetAvailable = false;
public void Start()
{
//Start out with the assumption that the internet is not available.
InternetIsNotAvailable();
StartCoroutine(InternetCheck());
}
public IEnumerator InternetCheck()
{
//If you want it to stop checking for internet once it has a successful connection,
//just remove "while (true)" loop
while (true)
{
bool internetPossiblyAvailable = false;
while (!internetPossiblyAvailable)
{
switch (Application.internetReachability)
{
case NetworkReachability.ReachableViaLocalAreaNetwork:
internetPossiblyAvailable = true;
break;
case NetworkReachability.ReachableViaCarrierDataNetwork:
internetPossiblyAvailable = allowCarrierDataNetwork;
break;
default:
internetPossiblyAvailable = false;
break;
}
if (!internetPossiblyAvailable)
{
InternetIsNotAvailable();
//Wait to check again.
yield return WaitForSeconds(timeBetweenChecks);
}
}
Ping ping = new Ping(pingAddress);
pingStartTime = Time.time;
Debug.Log("Hi");
bool stopCheck = true;
while (!ping.isDone && Time.time - pingStartTime < waitingTime)
{
//Wait one frame;
yield return null;
}
if (ping.isDone && ping.time >= 0)
InternetAvailable();
else
InternetIsNotAvailable();
//Wait to check again.
yield return WaitForSeconds(timeBetweenChecks);
}
}
private void InternetIsNotAvailable()
{
//Only log when we are going from true to flase.
if (isInternetAvailable != false)
{
Debug.Log("No Internet :(");
txtInternetConnectStatus.text = "No Internet :(";
isInternetAvailable = false; //This was changed from true to false.
}
}
private void InternetAvailable()
{
//Only log when we are going from false to true.
if (isInternetAvailable != true)
{
Debug.Log("Internet is available! ;)");
txtInternetConnectStatus.text = "Internet is available! ;)";
isInternetAvailable = true; //This was changed from false to true
}
}
public void OnClickShowMediationSuite()
{
ShowAds.instance.ShowMediationSuite();
}
}
Надеемся, что это будет иметь более низкие накладные расходы. Вы могли бы даже заменить yield return null
с yield return WaitForSeconds(0.5f);
поэтому он ждет 500 миллисекунд, чтобы проверить, завершен ли пока пинг. При 30 кадрах в секунду это будет означать, что у вас будет небольшая накладная стоимость, чтобы проверить, выполняется ли пинг один раз каждые 15 кадров.