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

pgpifvop  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(235)

是的,我真的被困在一个简单的协程上了。在我的Unity游戏中,我一直试图弄清楚如何在一个公共静态空白中使用这样的东西:

StartCoroutine(ExampleCoroutine())

我知道在一个public static void中没有办法使用这行代码,但是我正在尝试找到一个解决方法来做同样的事情。到目前为止,互联网并没有帮助我,但是我得到的最接近我的问题被解决的是关于创建一个示例的东西。我不理解它,因为我只是一个新手,但是它可能是一个线索,因为这是我在创建时得到的错误:

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
}
bvjxkvbb

bvjxkvbb1#

一个协程总是需要一个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");
}));

相关问题