You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity运行时为按钮加监听器报错:无法将void转为UnityAction

问题解决:Unity按钮AddListener报错"cannot convert from 'void' to 'UnityEngine.Events.UnityAction'"

错误原因

你直接调用了craftTextController.DisplayItemText(index),这会立刻执行该方法并返回void,但button.onClick.AddListener()需要接收的是UnityAction类型的委托(即方法的引用),而非方法执行后的返回值,因此出现类型转换错误。

修复方案

提供三种常用的解决方式:

1. 使用Lambda表达式(最简洁)

直接用Lambda包裹带参数的方法调用,将其转换为符合要求的委托:

private void Purchase()
{
    button.onClick.RemoveAllListeners();
    // 用Lambda包装方法调用,点击按钮时才执行
    button.onClick.AddListener(() => craftTextController.DisplayItemText(index));
}

2. 显式创建UnityAction委托

和Lambda方式原理一致,只是显式声明委托类型:

private void Purchase()
{
    button.onClick.RemoveAllListeners();
    button.onClick.AddListener(new UnityAction(() => craftTextController.DisplayItemText(index)));
}

3. 新增无参数中间方法

如果偏好更清晰的代码结构,可以写一个不带参数的中间方法,在内部调用带参数的目标方法:

[SerializeField] private CraftTextController craftTextController;
[SerializeField] private int index;

private void Purchase()
{
    button.onClick.RemoveAllListeners();
    button.onClick.AddListener(OnPurchaseButtonClicked);
}

// 中间无参数方法,点击按钮时触发
private void OnPurchaseButtonClicked()
{
    craftTextController.DisplayItemText(index);
}

内容的提问来源于stack exchange,提问作者SJC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:47:34