在 Unity 中的 public static void 中启动协程?
Initiating a Coroutine in a public static void in Unity?
是的,我确实被困在一个简单的协程上。在我的 Unity 游戏中,我一直在尝试弄清楚如何在 public static void:
中使用这样的东西
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 静态,如果这有帮助的话。
谢谢你的时间和幽默我的愚蠢
编辑:我被要求显示更多代码,所以我开始了!
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");
}));
是的,我确实被困在一个简单的协程上。在我的 Unity 游戏中,我一直在尝试弄清楚如何在 public static void:
中使用这样的东西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 静态,如果这有帮助的话。 谢谢你的时间和幽默我的愚蠢
编辑:我被要求显示更多代码,所以我开始了!
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");
}));