在 Unity 的公共静态空间中启动协程?

3 c# ienumerator coroutine unity-game-engine c#-4.0

是的,我确实被困在一个简单的协程上。在我的 Unity 游戏中,我一直试图弄清楚如何在公共静态空间中使用类似的东西:

StartCoroutine(ExampleCoroutine())
Run Code Online (Sandbox Code Playgroud)

我知道无法在公共静态空白中使用该行,但我正在尝试找到一种可以完成相同操作的解决方法。到目前为止,互联网还没有提供帮助,但我最接近解决问题的是创建一个实例。我不明白它,因为我只是一个新手,但这可能是一个线索,因为这是我在创建时遇到的错误:

error CS0120: An object reference is required for the non-static field, method, or property 'MonoBehaviour.StartCoroutine(IEnumerator)'
Run Code Online (Sandbox Code Playgroud)

协程启动的 IEnumerator 被标记为公共静态(如果有帮助的话)。谢谢你抽出时间来嘲笑我的愚蠢

编辑:我被要求显示更多代码,所以我开始了!

public static void NeedsToBeAccessedElsewhere()
{
     StartCoroutine(NeedsDeley());
     //Do Stuff
}

public static IEnumerator NeedsDelay()
{
     //results
}
Run Code Online (Sandbox Code Playgroud)

der*_*ugo 5

协程总是需要一个MonoBehaviour负责执行它的实例。因此StartCoroutine不是 astatic而是实例方法,必须在 的实例上调用MonoBehavior

因此,如果您的方法是,static您要么必须传递一个MonoBehaviour引用,例如

public static void NeedsToBeAccessedElsewhere(MonoBehaviour instance)
{
     instance.StartCoroutine(NeedsDeley());
}

public static IEnumerator NeedsDelay()
{
     //results
}
Run Code Online (Sandbox Code Playgroud)

或者作为后备,您可以确保有一个按需创建的默认行为

public class CoroutineExecuter : MonoBehaviour { }
Run Code Online (Sandbox Code Playgroud)

并做

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
}
Run Code Online (Sandbox Code Playgroud)

但请注意,一般来说:您发表了评论,// Do stuff但记住了该调用。StartCoroutine立即终止并且不会延迟调用它的方法。如果这是您的计划,您应该传递像这样的回调

public static IEnumerator NeedsDelay(Action afterDelay)
{
     yield return new WaitForSeconds(3f);

     afterDelay?.Invoke();
}
Run Code Online (Sandbox Code Playgroud)

并像使用它一样

instance.StartCoroutine(NeedsDelay(() =>
{
    Debug.Log("Delay has finished");
}));
Run Code Online (Sandbox Code Playgroud)