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

Unity中按钮OnClick传递Hackable类型数组的解决方案

解决Unity按钮OnClick不显示自定义类数组参数方法的问题

问题原因

Unity编辑器的UI事件系统(EventSystem)在可视化配置OnClick回调时,仅支持识别基本数据类型(int、float、string等)和Unity内置引用类型(GameObject、Transform、Material等),自定义类Hackable的数组不在默认识别范围内,所以你在OnClick列表里看不到对应的方法。

可行解决方案

1. 用无参中间方法过渡

在按钮绑定的脚本里先存储目标Hackable[],再写一个无参方法作为桥梁,在方法内部调用小游戏的带参逻辑:

public class HackingPanelController : MonoBehaviour
{
    // 在编辑器里直接赋值要破解的目标数组
    public Hackable[] targetHackables;
    public HackingGameManager gameManager;

    // 这个无参方法能在OnClick列表里显示
    public void StartHackingGame()
    {
        // 调用小游戏的带参方法传入目标数组
        gameManager.LaunchGame(targetHackables);
        // 打开hacking-panel的逻辑
        GetComponent<Canvas>().enabled = true;
    }
}

操作步骤:把这个脚本挂在按钮所在的对象上,在编辑器里给targetHackables赋值,然后把按钮的OnClick绑定到StartHackingGame方法即可。

2. 代码动态绑定点击事件

绕过编辑器的可视化配置,直接在代码里给按钮添加回调,这样可以直接传递自定义类型参数:

public class HackingPanelController : MonoBehaviour
{
    public Button hackButton;
    public Hackable[] targetHackables;
    public HackingGameManager gameManager;

    void Awake()
    {
        // 动态绑定点击事件
        hackButton.onClick.AddListener(() => 
        {
            gameManager.LaunchGame(targetHackables);
            GetComponent<Canvas>().enabled = true;
        });
    }
}

这种方式不需要在编辑器里配置OnClick,只要确保hackButton引用正确即可。

3. 动态创建小游戏实例(对应你的需求)

如果要每次开始破解时创建小游戏实例,可以按以下步骤实现:

  1. 把小游戏做成预制体(Prefab);
  2. 在点击按钮时实例化预制体,然后给小游戏脚本传递目标Hackable数组:
public class HackingPanelController : MonoBehaviour
{
    public Button hackButton;
    public Hackable[] targetHackables;
    public GameObject hackingGamePrefab;
    public Transform gameParent; // 小游戏实例的父节点(比如hacking-panel)

    void Awake()
    {
        hackButton.onClick.AddListener(CreateAndStartHackingGame);
    }

    void CreateAndStartHackingGame()
    {
        // 实例化小游戏预制体
        GameObject gameInstance = Instantiate(hackingGamePrefab, gameParent);
        // 获取小游戏的核心脚本
        HackingGame gameScript = gameInstance.GetComponent<HackingGame>();
        // 传入目标数组并初始化游戏
        gameScript.SetTargetHackables(targetHackables);
        gameScript.InitGame();
        // 打开hacking-panel
        GetComponent<Canvas>().enabled = true;
    }
}

额外建议

可以专门写一个HackingManager单例脚本,负责全局管理破解目标、小游戏的生命周期,这样不用在多个脚本里重复处理逻辑,比如:

public class HackingManager : MonoBehaviour
{
    public static HackingManager Instance;
    private Hackable[] currentTargets;

    void Awake()
    {
        Instance = this;
    }

    public void SetHackTargets(Hackable[] targets)
    {
        currentTargets = targets;
    }

    public void StartHackingGame()
    {
        // 这里处理小游戏启动逻辑,直接用currentTargets
    }
}

在打开hacking-panel前,先调用HackingManager.Instance.SetHackTargets(目标数组),之后不管是按钮点击还是其他触发方式,都能直接获取到要破解的目标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:45:19