【问题标题】:Unity, Calling a IEnumerator function from Button onClickUnity,从Button onClick调用IEnumerator函数
【发布时间】:2020-02-11 23:54:56
【问题描述】:

我尝试通过单击按钮调用 IEnumerator 函数,以便我可以返回一些内容,但我无法从检查器的 On Click() 下拉菜单中选择该函数。

我试图从另一个函数调用IEnumerator 并将该函数分配给按钮,不起作用!

显然我不能在 void 函数中执行 yield return

那么请有人这么好心教我该怎么做!?

非常感谢!

【问题讨论】:

  • 不,你不能在 void 上做收益回报 - 它的 void 它没有回报
  • 你的IEnumerator基本上是协程吗?
  • 你可以做yield return null;tho

标签: function unity3d onclick buttonclick ienumerator


【解决方案1】:

有一些规则可以将函数与检查器的统一事件挂钩。

1) 函数必须是public 才能从检查器中选择。

2) 返回类型必须为void,因此您将无法选择具有任何返回类型的函数,并且由于您的IEnumerator 函数返回IEnumerator,因此您将无法选择它来自检查员。

3) 函数参数必须与事件参数匹配,除非UnityEvent不带任何参数,如Button.onClick事件(感谢@derHugo纠正),例如按钮onClick事件不带任何参数,所以要从检查器中为它选择一个函数,函数必须看起来像

public void ChoosableTemplateForOnClickButton() { }

但是你想从检查器中调用一个 IEnumerator,所以你可以做的就是将它包装在一个 void 函数中:

假设你的 IEnumerator 函数看起来像

public IEnumerator MyRoutine()
{
   yield and enjoy...
}

将其包装在一个 void 函数中:

public void RoutineWrap()
{
   StartCoroutine(MyRoutine());
}

现在您可以从检查器中选择RoutineWrap

【讨论】:

  • 3) The function parameters must match the event parameters, 的观点不太正确! UnityEvent 允许添加 static 参数方法(带有01 参数并且仅限于基本类型(floatstringboolint、 etc 和 Object 参考))或者您可以添加 dynamic 参数方法。在onClick 的情况下,没有,但您可以使用多个动态参数实现自定义UnityEvent<T> ;)
  • 是的,但最终要将方法挂钩到来自“检查器”的事件,签名(参数)必须匹配,即带有(bool,string)参数的事件只能选择带有(bool)的函数,string) 参数,这就是我所说的,我是说事件只看到与其参数匹配的函数,并没有说它不能有多个参数:D
  • 这就是我所说的不正确的地方;)在普通的UnityEvent(如Button.onClick)中,您仍然可以引用没有或一个基本类型作为参数的方法,并以静态方式传递它。
  • 哦,哦,是的,我现在明白你的意思了,这是真的,我会将声明编辑为The function parameters must match the event parameters, unless the event is parameterless.
【解决方案2】:

除了this correct answer,您还可以随时通过脚本在运行时添加回调。

在 Unity 中,每个协程都必须使用 StartCoroutine 启动:

public Button button;

private void Awake()
{
    button.onClick.AddListener(() => StartCoroutine(MyRoutine()));
}

private IEnumerator MyRoutine()
{
    ...
}

【讨论】:

    猜你喜欢
    • 2016-07-28
    • 2017-04-27
    • 2020-07-28
    • 2015-02-17
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多