当前位置: 首页> 汽车> 车展 > Unity在非继承自MonoBehaviour的脚本启动协程

Unity在非继承自MonoBehaviour的脚本启动协程

时间:2025/7/11 14:32:22来源:https://blog.csdn.net/tianjuewudi/article/details/139872207 浏览次数: 0次

在Unity中,协程通常是通过MonoBehaviour的StartCoroutine方法来启动的。很多时候,我们写逻辑层代码的时候也希望能够调用协程,例如网络通讯等功能,这就需要一个中介来帮你做这件事。这个中介通常是一个继承自MonoBehaviour的管理类,它可以提供启动和管理协程的方法。

以下是一个简单的协程管理类的实现:

using System.Collections;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;/// <summary>
/// 协程启动类(适用于非继承自MonoBehaviour的脚本启动协程)
/// </summary>
public class CoroutineStarter : MonoBehaviour
{private static CoroutineStarter _instance;private static bool editor_mode = false;private static CoroutineStarter Instance{get{
#if UNITY_EDITORif (!Application.isPlaying) return null;
#endifif (editor_mode) return null;if (_instance == null){GameObject obj = new GameObject("CoroutineStarter");obj.AddComponent<CoroutineStarter>();}return _instance;}}#if UNITY_EDITORprivate static void EditorApplicationStateChanged(PlayModeStateChange state){switch (state){case PlayModeStateChange.ExitingPlayMode:editor_mode = true;break;case PlayModeStateChange.ExitingEditMode:editor_mode = false;break;case PlayModeStateChange.EnteredEditMode:editor_mode = true;break;case PlayModeStateChange.EnteredPlayMode:editor_mode = false;break;}}
#endifvoid Awake(){_instance = this;DontDestroyOnLoad(gameObject);
#if UNITY_EDITOREditorApplication.playModeStateChanged += EditorApplicationStateChanged;
#endif}/// <summary>/// 启动协程(适用于在非继承自MonoBehaviour的脚本中启动协程),且通过该方法启动的协程不会因为切换场景而停止/// </summary>/// <param name="enumerator"></param>public static Coroutine Start(IEnumerator enumerator){if (Instance == null){return null;}return Instance.StartCoroutine(enumerator);}/// <summary>/// 停止由CoroutineStarter启动的协程 /// </summary>/// <param name="coroutine"></param>public static void Stop(Coroutine coroutine){if (Instance == null) return;Instance.StopCoroutine(coroutine);}private void OnDestroy(){_instance = null;#if UNITY_EDITOREditorApplication.playModeStateChanged -= EditorApplicationStateChanged;
#endif}}

这个脚本使用时会自动生成一个空物体并完成挂载
使用时:

CoroutineStarter.Start(MyCoroutine());  
IEnumerator MyCoroutine()  
{  // 协程的逻辑代码  yield return null;  
}
关键字:Unity在非继承自MonoBehaviour的脚本启动协程

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: