【问题标题】:How to launch coroutine in Editor with the "Editor coroutine" package?如何使用“编辑器协程”包在编辑器中启动协程?
【发布时间】:2019-04-01 07:21:06
【问题描述】:

我正在尝试在 Unity 编辑器中自己构建一个带有 EditorWindow 的工具。这个工具需要通过 PHP 文件访问 MySQL 数据库,所以我需要使用协程。我寻找了一个解决方案并找到了一个预览包“Editor Coroutine”并安装了它。我看不出它是如何工作的,文档也没有说明如何使用它(或任何我理解的东西)。你知道有什么方法可以让这个东西正常工作吗?

我试图简单地做一个“StartCoroutine()”,从编辑器类中调用它或创建一个对象(GameObject)来调用它,但这些都不起作用:/。

【问题讨论】:

    标签: c# unity3d coroutine


    【解决方案1】:

    请注意,已接受答案的 while 循环会完全阻止编辑器,直到下载完成。对于可能没问题的简单文本,但对于较大的文件,这可能会成为问题。

    但是,您可以订阅EditorApplication.update,以便在编辑器中的每一帧调用一个方法。因此,对于 EditorWindow,您可以执行类似的操作

    private IEnumerator currentDownload;
    
    private void ProcessDownload()
    {
        if(currentDownload!=null) currentDownload.MoveNext();
    }
    
    private IEnumerator UpdateVersion(string message)
    {
        string post_url = NetworkManager.baseUrl + "VersionUpdate.php";
        WWWForm form = new WWWForm();
        form.AddField("Message", message); 
        form.AddField("Version", Application.version);
    
        UnityWebRequest www = UnityWebRequest.Post(post_url, form);
        www.chunkedTransfer = false;
        yield return www.SendWebRequest();
    
        if(www.error == null){
            Debug.Log(www.downloadHandler.text);
        } else {
            Debug.Log("error!: " + www.error);
        }
    }
    

    并像使用它

    // makes sure the callback is added only once
    EditorApplication.update -= ProcessDownload;
    EditorApplication.update += ProcessDownload;
    
    currentDownload = UpdateVersion("whatever string");
    

    【讨论】:

    • 感谢您的回答,不过我稍后会研究这个问题,我在一个时间有限的项目中,即使接受的答案不完美,它也有效,我需要继续前进:/
    【解决方案2】:

    我遇到了同样的问题。我最终得到了以下代码,它以非协程方法执行 webrequest。

    private void UpdateVersion(string message)
    {
        string post_url = NetworkManager.baseUrl + "VersionUpdate.php";
        WWWForm form = new WWWForm();
        form.AddField("Message", message); 
        form.AddField("Version", Application.version);
    
        UnityWebRequest www = UnityWebRequest.Post(post_url, form);
        www.chunkedTransfer = false;
        www.SendWebRequest();
    
        while (!www.isDone)
        {
            // do nothing
        }   
    
        if(www.error == null){
            Debug.Log(www.downloadHandler.text);
        } else {
            Debug.Log("error!: " + www.error);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-19
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 2014-06-16
      • 2014-07-17
      相关资源
      最近更新 更多