UI框架从0到1第一节:【事件转发起步】让按钮自己“走上来”找逻辑处理

在 UnityUI 开发中,我们经常会遇到这样的烦恼:

  • UI 搭建完毕后,每个按钮都要手动绑定点击事件;

  • 用 Inspector 拖脚本引用不仅繁琐,而且运行时很难排查引用链条

  • 如果 UI 面板一多,手动操作就变得极其低效。

有没有办法写一套脚本框架,实现按钮自动获取 + 自动转发事件,而不是手动一一拖拽绑定?

有的,兄弟,有的,而且代码非常简单。


🎯 第一步:通用按钮脚本

我们先写一个 ButtonCustom 脚本,挂载到任意带有 Button 的物体上,它会自动监听点击事件。

cs 复制代码
using  UnityEngine;
using  UnityEngine.UI;

public  class  ButtonCustom : MonoBehaviour
{
	private  Button  btn;
	private  void  Init()
	{
		btn = GetComponent<Button>();
		btn.onClick.AddListener(() =>
		{ 
			Debug.Log("触发点击事件");
		});
	}
}

通过这种方式,你不需要再手动拖引用到外部管理器,只要挂上这个脚本,就能在点击时响应逻辑。


🤔 问题来了:谁来接收这个按钮事件?

上面的写法只能打印一句调试语句,那如果我们要真正调用逻辑,比如"点击开始游戏"或"点击退出"该怎么办?

答案是:我们要有一个"页面逻辑接收器",专门集中处理 UI 的业务逻辑。

我们定义一个 PanelBase 类,作为每个 UI 页面的逻辑中心:

cs 复制代码
using  UnityEngine;

public  class  PanelBase : MonoBehaviour
{
	public  void  ProcessEvent(ButtonCustom  btn)
	{
		switch (btn.name)
		{
			case  "开始游戏":
				Debug.Log("开始游戏");
			break;
			
			case  "退出游戏":
				Debug.Log("退出游戏");
			break;
			
			default:
				Debug.LogWarning($"未处理的按钮:{btn.name}");
			break;
		}
	}
}

这样,每个按钮在点击时,只要告诉 PanelBase 自己是谁,它就能根据按钮名称处理对应逻辑。


🔁 第二步:按钮转发事件给页面

我们更新一下 ButtonCustom 的逻辑,让它在初始化时向上查找父物体中挂载的 PanelBase,然后把事件转发过去:

cs 复制代码
using  UnityEngine;
using  UnityEngine.UI;

public  class  ButtonCustom : MonoBehaviour
{
	private  Button  btn;
	private  PanelBase  targetPanel;
	
	private  void  Init()
	{
		Transform  current = transform;
		while (current != null)
		{
			targetPanel = current.GetComponent<PanelBase>();
			if (targetPanel != null)
			break;
			current = current.parent;
		}
		if (targetPanel == null)
		{
			Debug.LogWarning("No parent with PanelBase found.");
			return;
		}
		btn = GetComponent<Button>();
		btn.onClick.AddListener(() =>
		{
			targetPanel.ProcessEvent(this);
			Debug.Log($"{name} 触发点击事件");
		});
	}
}

通过这种方式,按钮事件与页面逻辑完全解耦,你不再需要在脚本中显式绑定按钮,只要 UI 节点命名规范、结构正确,就可以完成自动事件转发。


🧩 但问题还没完:只处理 Button 不够

到目前为止,我们的 PanelBase.ProcessEvent() 只能接收 ButtonCustom,那其他控件,比如 Toggle、InputField 呢?

难道我们每种控件都要写一个新的方法?

当然不需要。在下一节中,我们将通过基类继承 + 泛型限制来扩展整个事件转发体系,让 Toggle、InputField 等所有控件都能复用同一套机制。

这才是我们要实现的"通用事件系统"的第一步。

敬请期待第二节内容。

相关推荐
泉城老铁7 天前
VUE2实现加载Unity3d
前端·vue.js·unity3d
evamango9 天前
《Unity Shader入门精要》十一、让画面动起来
unity3d
Thomas游戏开发9 天前
Unity Android性能优化设置指南
前端框架·unity3d·游戏开发
Thomas游戏开发12 天前
Unity3D C#监听Button点击事件
前端·unity3d·游戏开发
谷宇.15 天前
【Unity3D实例-功能-拔枪】角色拔枪(三)IK的使用-紧握武器
游戏·unity·c#·unity3d·游戏开发·游戏编程·steam
evamango15 天前
《Unity Shader入门精要》十、高级纹理
unity3d
白色牙膏15 天前
从零到搞定:URP Lit彩色箱子材质的开发碎碎念
unity3d
半夜微笑狗17 天前
数据持久化-PlayerPrefs
unity3d
Thomas游戏开发18 天前
博毅创为 Unity_0基础就业班
前端框架·unity3d·游戏开发
谷宇.19 天前
【Unity3D实例-功能-拔枪】角色拔枪(二)分割上身和下身
游戏·unity·c#·游戏程序·unity3d·游戏开发·游戏编程