[Unity Editor]Editor下使用協程

前段時間接到一個批處理FBX默認材質的任務,它需要在Unity回調中執行才能起作用。由于我的批處理邏輯和回調不是順序執行,要得到正確的效果就需要等待一點時間,保證一個FBX處理完后才處理下一個。
  經過一番搜索找到了Editor下每幀執行的Update回調EditorApplication.update。Unity提供這個接口,是方便了我們,但是回調的形式有時卻很繁瑣……用的時候要+=,用完可能還要 -=。這里我想到了用Update來模擬協程,把繁瑣的事情變成一次性的,就不能算繁瑣~~
  下面上代碼:

/// <summary>
/// UnityEditor下模擬協程
/// </summary>
public class EditorCoroutine
{
    /// <summary>
    /// 迭代列表
    /// </summary>
    private static List<IEnumerator> _itors = null;

    /// <summary>
    /// 要從迭代列表中移除的索引
    /// </summary>
    private static List<int> _removeIdxs = null;

    private static EditorApplication.CallbackFunction _updateFunc = null;

    /// <summary>
    /// Update方法是否在執行
    /// </summary>
    private static bool _isUpdateRuning = false;

    static EditorCoroutine()
    {
        _itors = new List<IEnumerator>();
        _removeIdxs = new List<int>();
        _updateFunc = _Update;
    }

    public static void Start(IEnumerator itor)
    {
        _itors.Add(itor);
        _RunUpdate(true);
    }

    private static void _RunUpdate(bool isRun)
    {
        if (isRun == _isUpdateRuning) return;

        // 運行Update
        if (isRun)
        {
            EditorApplication.update += _updateFunc;
        }
        // 停止運行Update
        else
        {
            EditorApplication.update -= _updateFunc;
        }
        _isUpdateRuning = isRun;
    }

    private static void _Update()
    {
        if (null == _itors || _itors.Count <= 0) return;
        for (int i = 0, c = _itors.Count; i < c; ++i)
        {
            if (!_itors[i].MoveNext())
            {
                _removeIdxs.Add(i);
            }
        }

        if (_removeIdxs.Count <= 0) return;
        for (int i = _removeIdxs.Count - 1; i >= 0; --i)
        {
            _itors.RemoveAt(_removeIdxs[i]);
            _removeIdxs.RemoveAt(i);
        }

        if (_itors.Count == 0)
        {
            _RunUpdate(false);
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容