【Unity/UI】实践记录-button的click等事件的管理

说在前面

  • Unity版本:2017.4.37
  • NGUI版本:3.11.2
  • 其他:本篇文章中使用到了NGUI插件,但是不影响理解方法。同时,涉及了c#的委托,和函数指针有些类似,不熟悉的建议查阅相关资料

说明

  • 通常按钮是放在某个容器中,例如Panel,并且这个容器可能包含不止一个按钮(例如关闭、主要功能等),如果为每一个按钮都“直接”绑定相应的事件,就不便于管理

在这里插入图片描述

  • 一个相对合适的实践是这样的,在每一个button类中声明委托,在包含这些button“容器类”中确定每一个button中委托的指向,这样就可以在这个“容器类”中统一管理该容器下所有button的事件(如上图)。

实例

  • 界面

    • 层次结构如下
      在这里插入图片描述

    • Panel配置如下,最后的Panel(Script)为自定义脚本(见后面代码),需要将上面的button1/2/3拖动过去(或者点后面的小圆点)
      在这里插入图片描述

    • Button配置如下,其他两个基本相同,注意Box ColliderButton Listener为自定义脚本(代码见后面)
      在这里插入图片描述

  • 代码

    • Panel
      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class Panel : MonoBehaviour {
      
          public GameObject button1; // 对应上面panel脚本中的button1
          public GameObject button2;
          public GameObject button3;
      
          private void Awake()
          {
              ButtonListener.Get(button1).onClick = OnButton1Click; // 确定每一个button委托的指向
              ButtonListener.Get(button2).onClick = OnButton2Click;
              ButtonListener.Get(button3).onClick = OnButton3Click;
          }
      
          private void OnButton1Click(GameObject go) // button1对应的click事件
          {
              Debug.Log("Button 1 clicked!");
          }
      
          private void OnButton2Click(GameObject go)
          {
              Debug.Log("Button 2 clicked!");
          }
      
          private void OnButton3Click(GameObject go)
          {
              Debug.Log("Button 3 clicked!");
          }
      
      }
      
    • ButtonListener
      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class ButtonListener : MonoBehaviour {
      
          public delegate void VoidDelegate(GameObject go);
      
          public VoidDelegate onClick; 
      
      	void  OnClick()
          {
              if(onClick != null) // 若该委托不为空
              {
                  onClick(gameObject); // 那么就调用该委托(指向的函数),gameObject为自身
              }
          }
      
          public static ButtonListener Get(GameObject go)
          {
              ButtonListener listener = go.GetComponent<ButtonListener>();
              if (listener == null)
                  listener = go.AddComponent<ButtonListener>();// 防止未创建
              return listener;
          }
      }
      
      
  • 结果

    • 界面
      在这里插入图片描述

    • 运行后,点击对应的按钮,在Console输出结果如下
      在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值