使用委托 delegate 灵活地 监听到 UI按下的是什么键

本文介绍了一种在Unity中使用委托(delegate)来灵活处理UI按钮点击事件的方法。通过在按钮上添加ButtonEvent脚本并注册到消息控制中心MessageControl,实现对不同按钮点击事件的统一管理和响应。涉及Main、StartTest等脚本的使用,以及如何通过MessageDelegate传递字符串数据。
摘要由CSDN通过智能技术生成

使用委托 灵活地获取到UI点击了什么按钮  在 button 上添加委托delegate 。可以随时监听到按下的是什么键,然后执行自己想要的方法。

主要使用方法 Main.Instance.message.RegisterReceive(gameObject, Receive);

最简单的。需要4个脚本:

UI按钮下添加ButtonEvent脚本 ,脚本主要是在按钮点击后,添加一个事件,然后发送消息出去,Main脚本是为了只有一个控制中心,StartTest就是调用使用获取到点击了什么按钮

下载链接下载链接

1.MessageControl (消息控制中心) 

public delegate void MessageDelegate(string data);


/// <summary>
/// 消息控制中心
/// </summary>
public class MessageControl
{
    //创建一个集合存储 谁接收什么委托传递过来的什么消息
    private Dictionary<GameObject, MessageDelegate> dict_Messages;
    public MessageControl()
    {
        
        dict_Messages = new Dictionary<GameObject, MessageDelegate>();
        Debug.Log("new成功");
    }

    /// <summary>
    /// 注册添加数据
    /// </summary>
    /// <param name="go"></param>
    /// <param name="data"></param>
    public void RegisterReceive(GameObject go, MessageDelegate Handler)
    {
        Debug.Log("注册获取"+ go+ Handler);
        if (dict_Messages == null) return;
        if (!dict_Messages.ContainsKey(go))     //如果里面没有就继续添加,如果有就不添加了
        {
            dict_Messages.Add(go, Handler);
        }
    }

    /// <summary>
    /// 发送数据
    /// </summary>
    /// <param name="data"></param>
    public void SendMessage(string data)
    {
        foreach (var item in dict_Messages)
        {
            Debug.Log("SendMessage" + item.Value + data);
            item.Value.Invoke(data);            // Value 是 StartTest  Receive()方法  传递到StartTest脚本中
        }
    }

    /// <summary>
    /// 移除数据
    /// </summary>
    /// <param name="go"></param>
    public void RemoveReceive(GameObject key)
    {
        //先判断有没有储存,再判断是否有这个key
        if (dict_Messages == null) return;
        if (dict_Messages.ContainsKey(key))
        {
            dict_Messages.Remove(key);
        }

    }

}

2.ButtonEvent(按钮事件) 

// <summary>
/// 脚本挂在Button下面
/// </summary>
[RequireComponent(typeof(Button))]
public class ButtonEvent : MonoBehaviour
{
    private string data;
    private Button button;
	void Start () {
      
	    data = name;

        button = GetComponent<Button>();

        if (button !=null)
	    {
	        button.onClick.AddListener(OnClik);     //按钮点击一下,就发送一次信息
        }
	}

    public void OnClik()
    {
        Debug.Log("添加OnClik");
        Main.Instance.message.SendMessage( data);
    }
}

3.Main  (这个脚本主要是 调用 MessageControl 脚本 )

/// <summary>
/// 调用这个脚本去注册
/// </summary>
public class Main : MonoBehaviour {

    public MessageControl message;

    public static Main Instance;

    public void Awake()
    {
        Instance = this;
        message = new MessageControl();  // 脚本从这new ,保证只new一次。
    }
}

4.StartTest(挂物体身上)

/// <summary>
/// 测试脚本
/// </summary>
public class StartTest : MonoBehaviour
{
	void Start ()
    {
      Main.Instance.message.RegisterReceive(gameObject, Receive);
	}

    private void Receive(string data)
    {
        Debug.Log("这个是"+data);
    }

    void Desyory()
    {
        Main.Instance.message.RemoveReceive(gameObject);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值