c# - 使用 C# 从 Unity 中的静态方法调用 IEnumerator 的最佳方法
问题描述
编辑器:Unity - C#
你能给我一些信息和提示我如何从静态方法启动 IEnumerator。到目前为止,我所知道的是以下选项:
A):使调用 IEnumerator 的方法 (METHOD_1) 成为非静态的,然后像这样搜索脚本
FindObjectOfType<Scriptname>().METHOD_1();
B):使用 MonoBehaviour 启动协程
Scriptname.METHOD_1(this);
public static void METHOD_1(MonoBehaviour StartThisStatic)
{
StartThisStatic.StartCoroutine(Test());
}
public static IEnumerator Test()
{
yield return new WaitForSeconds(2f);
}
C):在唤醒/启动中使用实例
就性能和稳定性而言,最佳选择是什么?可以简单的给我解释一点背景知识吗?
非常感谢!
解决方案
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CoroutineController : MonoBehaviour
{
static CoroutineController _singleton;
static Dictionary<string,IEnumerator> _routines = new Dictionary<string,IEnumerator>(100);
[RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.BeforeSceneLoad )]
static void InitializeType ()
{
_singleton = new GameObject($"#{nameof(CoroutineController)}").AddComponent<CoroutineController>();
DontDestroyOnLoad( _singleton );
}
public static Coroutine Start ( IEnumerator routine ) => _singleton.StartCoroutine( routine );
public static Coroutine Start ( IEnumerator routine , string id )
{
var coroutine = _singleton.StartCoroutine( routine );
if( !_routines.ContainsKey(id) ) _routines.Add( id , routine );
else
{
_singleton.StopCoroutine( _routines[id] );
_routines[id] = routine;
}
return coroutine;
}
public static void Stop ( IEnumerator routine ) => _singleton.StopCoroutine( routine );
public static void Stop ( string id )
{
if( _routines.TryGetValue(id,out var routine) )
{
_singleton.StopCoroutine( routine );
_routines.Remove( id );
}
else Debug.LogWarning($"coroutine '{id}' not found");
}
public static void StopAll () => _singleton.StopAllCoroutines();
}
然后:
CoroutineController.Start( Test() );
您还可以通过给它们标签来停止特定的协程:
CoroutineController.Start( Test() , "just a test" );
// <few moments later, meme>
CoroutineController.Stop( "just a test" );
推荐阅读
- javascript - 我可以在 ReactJS 中的哪里放置自动身份验证代码?
- c - 在 C 中拆分 char 数组,同时保留分隔符
- selenium-webdriver - Passing Driver.Instance.FindElement parameters as a variable
- php - 95|会话|Amadeus API 的非活动对话和标头无效
- grails - Grails 3 JNDI 数据源抛出 javax.management.InstanceAlreadyExistsException
- visual-studio-code - How do I figure out which extension or service is making a VS Code Helper process use 100% CPU?
- python-3.x - 学python 3的艰辛之路 Ex46指令不清楚
- python-3.x - 将 pandas 中的数据框转换为数组
- javascript - Can glsl be used instead of webgl?
- html - Apply a CSS style to a child span with a dynamic id on hover of a parent div with a dynamic id