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

在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;  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

charles抓包

1、去官网下载最新版本&#xff0c;避免出现不必要的问题 2、mac 上charles 的菜单栏在最顶上 3、mac 上安装根证书不受信任 双击下不受信任的正证书&#xff0c;点开信任小文字&#xff0c;然后把下面的这些全部设置为始终信任 4、手机上安装证书 先把wifi代理设置好 如果安…

条码二维码读取设备在医疗设备自助服务的重要性

医疗数字信息化建设的深入推进&#xff0c;医疗设备自助服务系统已成为医疗服务领域的一大趋势&#xff0c;条码二维码读取设备作为自助设备的重要组成部分&#xff0c;通过快速、准确地读取条形码二维码信息&#xff0c;不公提升了医疗服务效率&#xff0c;还为患者提供了更加…

一文了解Java中 Vector、ArrayList、LinkedList 之间的区别

目录 1. 数据结构 Vector 和 ArrayList LinkedList 2. 线程安全 Vector ArrayList 和 LinkedList 3. 性能 插入和删除操作 随机访问 4. 内存使用 ArrayList 和 Vector LinkedList 5. 迭代器行为 ArrayList 和 Vector LinkedList 6. 扩展策略 ArrayList Vecto…

深度相机辅助导航避障(三):地面点云滤除

前面的章节介绍了坐标变换,以及如何设置深度相机的坐标变换。那就可以很直观从机器人的坐标系对深度相机扫描到的障碍物点云进行处理。 在实际应用中,机器人正确估计周围地形,对于道路的可通过性、路径规划和障碍物检测等方面都很重要。那么在获取深度相机点云数据后就得准…

绕过命令过滤器:探索UnixLinux中的Bypass技术

前言 在Unix或Linux系统的安全测试和网络防御中&#xff0c;了解如何绕过命令过滤器是非常重要的。今天&#xff0c;我们将探讨几种利用shell命令绕过安全限制的技巧&#xff0c;这些技巧常用于渗透测试中&#xff0c;以检测系统的安全漏洞。 0x00 命令介绍 一般而言&#x…

学生选课管理系统(JAVA课设)PS:有前端界面

1.课设要求描述 实现系统的所有功能&#xff0c;包括但不限于&#xff1a; 学生信息管理&#xff08;增加、删除、修改、查询&#xff09;课程信息管理选课操作成绩管理 2.制作思路及基础讲解 此项目主要是用于完成大二下半学期的JAVA大作业&#xff0c;也可当作课设&…

树莓派pico入坑笔记,uart使用

uart原理自行百度&#xff0c;相关内容很多其他博主写过并且质量很高&#xff0c;这里不再赘述。 调用circuitpy的busio模块来使用uart&#xff0c;除此以外&#xff0c;spi、iic等要需要使用该模块&#xff0c;使用方法见 官方教程 &#xff0c;详细信息见文档 官方的例子简…

文本生成图像综述

本调查回顾了扩散模型在生成任务中广泛流行的背景下文本到图像的扩散模型。作为一份自成一体的作品&#xff0c;本调查首先简要介绍了基本扩散模型如何用于图像合成&#xff0c;然后介绍了条件或指导如何改善学习。基于这一点&#xff0c;我们介绍了文本到图像生成方面的最新方…

# 深入理解 Java 虚拟机 (二)

深入理解 Java 虚拟机 &#xff08;二&#xff09; Java内存模型 主内存与工作内存 所有的变量存储在主内存&#xff08;虚拟机内存的一部分&#xff09;每条线程有自己的工作内存&#xff0c;线程对变量的所有操作&#xff08;读取、赋值&#xff09;都必须在工作内存中进行…

VMware Windows sever 虚拟机互联网连接配置

一、VMware配置 1、虚拟网络编辑 从左上角 编辑→虚拟网络编辑器 进入 2、配置NAT模式 配置的子网IP&#xff0c;在虚拟机中获取到的ip跟子网IP的前三个是一样的 1.配置网关 2.配置DHCP设置 这个主要是分配ip最后一位获取的区间 3、虚拟机配置 二、Windows Server 虚拟机配置…

【Linux】进程 | 控制块pcb | task_struct | 创建子进程fork

目录 Ⅰ. 进程的概念&#xff08;Process&#xff09; 1. 什么是进程&#xff1f; 2. 多进程管理 3. 进程控制块&#xff08;PCB&#xff09; task_struct 的结构 Ⅱ. 进程查看与管理 1. 使用指令查看进程 2. /proc 查看进程信息 3. 获取进程 ID 4. 创建子进程 原因&…

Spring Boot中的自动配置机制详解

Spring Boot中的自动配置机制详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Spring Boot中的自动配置机制&#xff0c;这是Spring Boot…

STM32启动流程 和 map文件的作用

一&#xff0c;启动流程 1. 复位/上电 2. 根据 BOOT0/BOOT1 确定程序从哪个存储位置执行 3. 初始化 SP 及 PC 指针 将 0X08000000 位置的栈顶地址存放在 SP 指针中 将 0x08000004 位置存放的向量地址装入 PC 程序计数器 4. 初始化系统时钟 5. 初始化用户堆栈 6. 进入main函数 二…

如何用ChatGPT实现智能化编程

如何用ChatGPT实现智能化编程 ChatGPT&#xff0c;作为一个强大的AI助手&#xff0c;可以极大地提高编程效率&#xff0c;帮助更快地实现创新。本文将探讨如何利用ChatGPT辅助编程&#xff0c;从代码生成到优化&#xff0c;再到调试和学习新技术&#xff0c;全面提升编程体验。…

Jmeter TCP接口测试-实例

1、TCP接口结构 TCP接口&#xff1a;只有IP和PORT 传参数据类型根据开发定义的类型 需要添加一个ascii码的十进制字节结束符&#xff0c;tcp才会关闭 2、TCP接口环境搭建 在testfan-tcp-server.jar目录下&#xff0c;启动cmd命令行&#xff0c;输入&#xff1a; java -jar…

Socket编程【个人简单】

介绍 Socket是计算机网络中的一种通信端点&#xff0c;通过它应用程序可以在网络上发送和接收数据。它可以是基于TCP&#xff08;传输控制协议&#xff09;的流套接字&#xff0c;也可以是基于UDP&#xff08;用户数据报协议&#xff09;的数据报套接字。 TCP、UDP、HTTP和We…

Vim插件革命:Linux环境下的终极自动化编辑指南

在Vim中安装插件可以大大增强编辑器的功能。以下是详细的步骤来安装Vim插件&#xff1a; 1. 确认Vim版本 首先&#xff0c;确保你的Vim版本支持插件。在大多数现代Linux发行版中&#xff0c;Vim通常已经配置为支持插件。 vim --version2. 配置Vim 确保你的.vimrc文件允许使…

如何在 SwiftUI 视图中显示应用图标和版本

文章目录 前言获取应用图标获取应用版本创建 SwiftUI 视图总结前言 在应用中显示应用图标和版本是为用户提供快速识别应用版本和变体的好方法,无论是内部用户(如测试人员或利益相关者)还是外部用户。 在本文中,我将展示如何创建一个可访问的 SwiftUI 视图,既能显示应用图…

linux虚拟机部署docker时拉取image遇到的问题

1&#xff1a;防火墙问题 手动检查防火墙是否已经关闭 2&#xff1a;daemon.json问题 docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 192.168.152.2:443: connect: connection refused.解决 { "registry-mirrors&…

信创国产化大背景下的操纵系统开发之变:鸿蒙操作系统上的开发持续增多,为未来开发,必须知道的鸿蒙系统开发,现在很多国企都要求鸿蒙系统

鸿蒙操作系统的来龙去脉 1. 背景与动机 华为鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为于2019年8月9日正式发布的分布式操作系统。鸿蒙的开发动机主要源于全球科技竞争的加剧以及华为在全球市场上面临的挑战。在被美国列入实体清单后&#xff0c;华为面临着使用安…