【问题标题】:Initiating a Coroutine in a public static void in Unity?在 Unity 的公共静态 void 中启动协程?
【发布时间】:2021-03-14 21:04:40
【问题描述】:

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

StartCoroutine(ExampleCoroutine())

我知道没有办法在公共静态 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
}

【问题讨论】:

  • 没有。我正在尝试在公共静态 void 中启动协程。
  • 是的,这就是我想知道该怎么做。
  • 我分享了一个相同的错误。
  • 编辑完成。

标签: c# unity3d c#-4.0 coroutine ienumerator


【解决方案1】:

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

【讨论】:

  • 抱歉回来晚了:我收到了这个错误:错误 CS7036:没有给出与“MyScript.MyVoid(MonoBehaviour)”所需的形参“instance”相对应的参数
  • @Spectre 那么你没有传入所需的实例;)
猜你喜欢
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2020-07-15
  • 2022-12-18
相关资源
最近更新 更多