Bool возвращает другое значение при ссылке в других скриптах - PullRequest
0 голосов
/ 05 марта 2019

Я проверяю подключение к интернету, используя следующий скрипт:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CheckInternets : MonoBehaviour
{
    private string url = "some photo on my google drive";
    private string wwww;

    public static bool InternetON = false; 

    // Start is called before the first frame update
    void Start()
    {        
        StartCoroutine(CheckConnection());
    }

    IEnumerator CheckConnection()
    {
        var www = new WWW(url);

        yield return www;

        if (www.isDone && www.bytesDownloaded > 0)
        {
            InternetON = true;
            Debug.Log("MAIN Script Check :: Online! :)");                        
        }

        if (www.isDone && www.bytesDownloaded == 0)
        {
            InternetON = false;
            Debug.LogWarning("MAIN Script Check :: Offline! :(");
        }
    }
}

Пробовал это на моем (Android) телефоне, подключенном к мобильным данным (без него), он работает просто отлично.

Проблемы возникают, как только я ссылаюсь на InternetON bool в других скриптах, то есть указанные скрипты всегда читают его как false (или true, если я устанавливаю его в thatIn CheckInternets.cs), так что я догадываюсь, что яя ссылаюсь на него неправильно, или я неправильно использую bool, но не могу понять, как это сделать.

Пример других сценариев:

void Start()
{        
    if (CheckInternets.InternetON)
    {
        //do some stuff
        Debug.Log("OTHER Script Check :: Online! :)");
    }
    else
    {
        //do some other stuff
        Debug.Log("OTHER Script Check :: Offline! :(");
    }
}

В этом случае, если яЯ нахожусь в сети, моя Консоль будет читать:

  • ДРУГАЯ Проверка скрипта :: Не в сети!: (

  • MAIN Script Check :: Online!:)

Если я в автономном режиме, он будет говорить Offline для них обоих.

Есть совет?Ура!

1 Ответ

0 голосов
/ 05 марта 2019

StartCoroutine(CheckConnection()); запускает сопрограмму в Start() ... НО , она не будет выполнена, пока не получит вызов MoveNext(), которыйпроисходит после того, как он получил Update вызов

с Документация по заказу на выполнение :

Обычные обновления сопрограмм выполняются после Update функция возвращает.

Update не вызывается до тех пор, пока все Start вызовы сцены не будут завершены при проверке bool in Start в вашем другом сценарииCheckConnection() даже не выполнит первую yield.


Вместо этого вам придется подождать, пока проверка не закончится.

Вот несколько способов, как вы могли бы сделать это, используяIEnumerator Start
Unity позволяет сделать это, чтобы задержать Start до тех пор, пока что-то не будет завершено ... именно то, что вы хотите сделать:

  1. yield CheckConnection

    Вы можете просто yield return любой другой IEnumerator в сопрограмме, чтобы ждать, пока тот другой не закончил

    public class CheckInternets : MonoBehaviour
    {
        private static string url = "some photo on my google drive";
        private static string wwww;
    
        public static bool InternetON = false; 
    
        public static IEnumerator CheckConnection()
        {
            var www = new WWW(url);
    
            yield return www;
    
            if (www.isDone && www.bytesDownloaded > 0)
            {
                InternetON = true;
                Debug.Log("MAIN Script Check :: Online! :)");                        
            }
    
            if (www.isDone && www.bytesDownloaded == 0)
            {
                InternetON = false;
                Debug.LogWarning("MAIN Script Check :: Offline! :(");
            }
        }
    }
    

    и

    public class OtherScript : MonoBehaviour
    {
        IEnumerator Start()
        {
            // starts an internet check and waits until it finished
            yield return CheckInternets.CheckConnection();
    
            if (CheckInternets.InternetON)
            {
                //do some stuff
                Debug.Log("OTHER Script Check :: Online! :)");
            }
            else
            {
                //do some other stuff
                Debug.Log("OTHER Script Check :: Offline! :(");
            }
        }
    }
    
  2. Дополнительный флаг

    Добавьте флаг, например, checkFinished и используйте WaitUntil

    public class CheckInternets : MonoBehaviour
    {
        private string url = "some photo on my google drive";
        private wwww;
    
        public static bool InternetON = false;
        public static bool IsFinished = false;
    
        // Start is called before the first frame update
        private void Start()
        {
            StartCoroutine(CheckConnection());
        }
    
        public IEnumerator CheckConnection()
        {
            IsFinished = false;
    
            var www = new WWW(url);
    
            yield return www;
    
            if (www.isDone && www.bytesDownloaded > 0)
            {
                InternetON = true;
                Debug.Log("MAIN Script Check :: Online! :)");
            }
    
            if (www.isDone && www.bytesDownloaded == 0)
            {
                InternetON = false;
                Debug.LogWarning("MAIN Script Check :: Offline! :(");
            }
    
            IsFinished = true;
        }
    }
    

    и сделать

    public class OtherScript : MonoBehaviour
    {
        private IEnumerator Start()
        {
            // starts an internet check and waits until it finished
            yield return new WaitUntil(() => CheckInternets.IsFinished);
    
            if (CheckInternets.InternetON)
            {
                //do some stuff
                Debug.Log("OTHER Script Check :: Online! :)");
            }
            else
            {
                //do some other stuff
                Debug.Log("OTHER Script Check :: Offline! :(");
            }
        }
    }
    
  3. Обратный вызов

    Добавить обратный вызов Action, чтобы вы могли ждатьрезультат без использования IEnumerator

    public class CheckInternets : MonoBehaviour
    {
        private string url = "some photo on my google drive";
        private string wwww;
    
        // now you wouldn't need this anymore and could make it 
        // a local variable in the CheckConnectionRoutine
        public static bool InternetON = false;
    
        public void CheckConnection(Action<bool> callback)
        {
            StartCoroutine(CheckConnectionRoutine(callback));
        }
    
        private IEnumerator CheckConnectionRoutine(Action<bool> callback)
        {
            var www = new WWW(url);
    
            yield return www;
    
            if (www.isDone && www.bytesDownloaded > 0)
            {
                InternetON = true;
                Debug.Log("MAIN Script Check :: Online! :)");
            }
    
            if (www.isDone && www.bytesDownloaded == 0)
            {
                InternetON = false;
                Debug.LogWarning("MAIN Script Check :: Offline! :(");
            }
    
            callback?.Invoke(InternetON);
        }
    }
    

    и используйте его либо с методом

    public class OtherScript : MonoBehaviour
    {
        private void Start()
        {
            // somehow get a reference instead of using static
            // that's always the cleaner way
            var check = FindObjectOfType<CheckInternets>();
    
            // starts an internet check
            check?.CheckConnection(OnConnectionCheckFinished);
        }
    
        private void OnConnectionCheckFinished(bool isConnected)
        {
            if (isConnected)
            {
                //do some stuff
                Debug.Log("OTHER Script Check :: Online! :)");
            }
            else
            {
                //do some other stuff
                Debug.Log("OTHER Script Check :: Offline! :(");
            }
        }
    }
    

    , либо непосредственно с лямбда-выражением

    public class OtherScript : MonoBehaviour
    {
        private void Start()
        {
            // somehow get a reference instead of using static
            // that's always the cleaner way
            var check = FindObjectOfType<CheckInternets>();
    
            // starts an internet check
            check?.CheckConnection((isConnected) =>
            {
                if (isConnected)
                {
                    //do some stuff
                    Debug.Log("OTHER Script Check :: Online! :)");
                }
                else
                {
                    //do some other stuff
                    Debug.Log("OTHER Script Check :: Offline! :(");
                }
            });
        }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...