Как проверить доступность Интернета без создания накладных расходов в 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 кадров.

Другие вопросы по тегам