c# - 在 Unity 的公共静态 void 中启动协程?
问题描述
是的,我真的被困在一个简单的协程上。在我的 Unity 游戏中,我一直试图弄清楚如何在公共静态空间中使用这样的东西:
StartCoroutine(ExampleCoroutine())
我知道没有办法在公共静态空白中使用该行,但我正在尝试找到一种解决方法来做同样的事情。到目前为止,互联网并没有提供帮助,但我最接近解决问题的方法是创建实例。我不明白,因为我只是一个新手,但这可能是一个线索,因为这是我在创建时遇到的错误:
error CS0120: An object reference is required for the non-static field, method, or property 'MonoBehaviour.StartCoroutine(IEnumerator)'
协程启动的 IEnumerator 被标记为 public static,如果这有帮助的话。谢谢你的时间和幽默我的愚蠢
编辑:我被要求显示更多代码,所以我开始了!
public static void NeedsToBeAccessedElsewhere()
{
StartCoroutine(NeedsDeley());
//Do Stuff
}
public static IEnumerator NeedsDelay()
{
//results
}
解决方案
MonoBehaviour
协程总是需要一个负责激发它的实例。因此StartCoroutine
不是一个static
实例方法,而是一个实例方法,并且必须在 的实例上调用MonoBehavior
。
因此,如果您的方法是static
您要么必须传递MonoBehaviour
参考,例如
public static void NeedsToBeAccessedElsewhere(MonoBehaviour instance)
{
instance.StartCoroutine(NeedsDeley());
}
public static IEnumerator NeedsDelay()
{
//results
}
或者作为后备,您可以确保有一个按需创建的默认行为
public class CoroutineExecuter : MonoBehaviour { }
做
private static CoroutineExecuter instance;
public static void NeedsToBeAccessedElsewhere()
{
if(!instance)
{
instance = FindObjectOfType<CoroutineExecuter>();
if(!instance)
{
instance = new GameObject ("CoroutineExecuter").AddComponent<CoroutineExecuter>();
}
}
instance.StartCoroutine(NeedsDeley());
}
public static IEnumerator NeedsDelay()
{
//results
}
但是,请注意,一般来说:您发表了评论// Do stuff
,但请记住该调用。StartCoroutine
立即终止并且不会延迟调用它的方法。如果这是您的计划,您应该传入一个回调,例如
public static IEnumerator NeedsDelay(Action afterDelay)
{
yield return new WaitForSeconds(3f);
afterDelay?.Invoke();
}
并像使用它一样
instance.StartCoroutine(NeedsDelay(() =>
{
Debug.Log("Delay has finished");
}));
推荐阅读
- python-3.x - 调用没有 () 的类工作正常,但没有提供所需的输出
- jenkins - 有没有办法以自动化的方式将 maven 项目转换为管道
- java - Java Socket - 在 Android 中使用 AsyncTask 上传多个文件
- sql - 更新后插入存储过程
- android - 分页库过滤器/搜索页面列表
- c# - 如何以编程方式重新路由 visio 中的连接器?
- c# - Xamarin.Android 中的 Auth0 注销问题
- google-maps - Google Map UI Experience 在 api 中不可用(边框,样式)?
- ios - 从图像 url 下载图像方面,URLSession 与 GCD 有什么区别?
- xslt-2.0 - 如何控制表中多行中的字符串值流。值用逗号分隔,并带有点