В веб-запросе Unity сопрограмма запускается дважды - PullRequest
0 голосов
/ 23 апреля 2020

У меня проблемы с пониманием того, что происходит. У меня есть этот скрипт, который загружает файл на сервер. Это работает, но работает несколько раз, и это не хорошо. Я пытаюсь сделать 2 вещи:

  1. отправить запрос, когда пользователь нажимает кнопку
  2. Получить ответ от сервера. Если положительный, тогда загрузите EndScene. Если значение отрицательное, загрузите ManualUpdateScene

Проблемы:

  • a) пользователь нажимает кнопку, запрос отправляется более одного раза
  • b) Я не понимаю, как вернуть мой класс Controller, если ответ сервера был положительным или отрицательным (так что я могу загрузить следующую сцену).

В этом коде ниже я делать ужасные хаки, чтобы предотвратить выполнение запроса дважды, но это означает, что я не могу получить ответ сервера. Какой правильный способ справиться с этим? Спасибо

Вот мой код

using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;

public class DataUploader: MonoBehaviour
{
    public bool isUploaded;
    public bool isError;

    public void Start()
    {
        isUploaded = isError = false;
    }

    public void UploadFile()
    {
        StartCoroutine(Upload());
    }

    IEnumerator Upload()
    {
        Debug.Log("UPLOADING...");
        string path = Application.dataPath + "/data_" + StaticData.GetDeviceId() + ".csv";

        WWWForm form = new WWWForm();

        UnityWebRequest dataFile = UnityWebRequest.Get(path);
        yield return dataFile.SendWebRequest();
        form.AddBinaryData("dataFile", dataFile.downloadHandler.data, Path.GetFileName(path));

        UnityWebRequest req = UnityWebRequest.Post("myserverurl/getFile.php", form);
        yield return req.SendWebRequest();

        Debug.Log("SERVER: " + req.downloadHandler.text);

        if (req.isHttpError || req.isNetworkError || !(req.downloadHandler.text.Contains("FILE OK")))
            isError = true;// Debug.Log(req.error);
        else
            isUploaded = true;

        yield break;
    }
}

и вот откуда я его называю

using UnityEngine;
using UnityEngine.SceneManagement;

namespace Send_Email
{
    public class Controller : MonoBehaviour
    {
        public InputManager button;
        public DataUploader dataUploader;
        private bool flag;

        private void Start()
        {
            // write results to file
            DataWriter.Initialize();
            DataWriter.WriteFile(StaticData.GetData());
            flag = false;
        }

        void Update()
        {
            if (button.IsPressed())
            {
                if (!flag)
                {
                    flag = true;

                    if (!dataUploader.isUploaded)
                        dataUploader.UploadFile(); //upload the file        
                }
                else
                    LoadScene();
            }

            if(dataUploader.isError){
                SceneManager.LoadScene("ManualUpdateScene");
            }
        }

        public void LoadScene()
        {
            SceneManager.LoadScene("EndScene");
        }
    }
}
...