Unity如何在Editor下执行协程(coroutine)

2024-02-11 17:32

本文主要是介绍Unity如何在Editor下执行协程(coroutine),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在处理Unity5新的AssetBundle的时候,我有一个需求,需要在Editor下(比如一个menuitem的处理函数中,游戏没有运行,也没有MonoBehaviour)加载AssetBundle。而加载AssetBundle的时候又需要使用yield return www;这样的协程用法。

所以就有了一个需求,在Editor下执行协程。我从网上找到一个EditorCoroutine,其代码如下:

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;public static class EditorCoroutineRunner
{private class EditorCoroutine : IEnumerator{private Stack<IEnumerator> executionStack;public EditorCoroutine(IEnumerator iterator){this.executionStack = new Stack<IEnumerator>();this.executionStack.Push(iterator);}public bool MoveNext(){IEnumerator i = this.executionStack.Peek();if (i.MoveNext()){object result = i.Current;if (result != null && result is IEnumerator){this.executionStack.Push((IEnumerator)result);}return true;}else{if (this.executionStack.Count > 1){this.executionStack.Pop();return true;}}return false;}public void Reset(){throw new System.NotSupportedException("This Operation Is Not Supported.");}public object Current{get { return this.executionStack.Peek().Current; }}public bool Find(IEnumerator iterator){return this.executionStack.Contains(iterator);}}private static List<EditorCoroutine> editorCoroutineList;private static List<IEnumerator> buffer;public static IEnumerator StartEditorCoroutine(IEnumerator iterator){if (editorCoroutineList == null){// testeditorCoroutineList = new List<EditorCoroutine>();}if (buffer == null){buffer = new List<IEnumerator>();}if (editorCoroutineList.Count == 0){EditorApplication.update += Update;}// add iterator to buffer firstbuffer.Add(iterator);return iterator;}private static bool Find(IEnumerator iterator){// If this iterator is already added// Then ignore it this timeforeach (EditorCoroutine editorCoroutine in editorCoroutineList){if (editorCoroutine.Find(iterator)){return true;}}return false;}private static void Update(){// EditorCoroutine execution may append new iterators to buffer// Therefore we should run EditorCoroutine firsteditorCoroutineList.RemoveAll(coroutine => { return coroutine.MoveNext() == false; });// If we have iterators in bufferif (buffer.Count > 0){foreach (IEnumerator iterator in buffer){// If this iterators not existsif (!Find(iterator)){// Added this as new EditorCoroutineeditorCoroutineList.Add(new EditorCoroutine(iterator));}}// Clear bufferbuffer.Clear();}// If we have no running EditorCoroutine// Stop calling update anymoreif (editorCoroutineList.Count == 0){EditorApplication.update -= Update;}}
}

这里需要注意几个地方:
1、EditorApplication.update,这个是一个delegate,可以绑定一个函数,从而在编辑器下执行Update。

2、EditorCoroutineRunner.StartEditorCoroutine(Routine1()); 这样可以在编辑器下开启一个协程。

3、另外一个思路是不使用协程,绑定一个Update函数,然后判断www.isDone来获取AssetBundle。这个我并没有实际验证。


文章转载自Unity如何在Editor下执行协程(coroutine),感谢原作者提供好文章

这篇关于Unity如何在Editor下执行协程(coroutine)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/700395

相关文章

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

MySQL中SQL的执行顺序详解

《MySQL中SQL的执行顺序详解》:本文主要介绍MySQL中SQL的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql中SQL的执行顺序SQL执行顺序MySQL的执行顺序SELECT语句定义SELECT语句执行顺序总结MySQL中SQL的执行顺序

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用