事件的监听与广播

一.创建字典

创建脚本EventType,枚举类型,存放键值。

public enum EnventType
{

}

创建脚本EventCenter,EventType就是创建的枚举类型,表示键,后面的Delegate为值,要引入命名空间System。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class EventCenter  {
    //创建字典
    private static Dictionary<EventType, Delegate> s = new Dictionary<EventType, Delegate>();

}

二.添加监听事件

创建脚本CallBack,存放各种重载方法

public delegate void CallBack();
public delegate void CallBack<T>(T arg);//一个参数的委托事件

在EventCenter中,定义添加监听事件的方法

   //添加监听事件
    private static void AddListener(EventType enventType,CallBack callBack)
    {
        //判断事件码是否在字典里
        if (!enventDic.ContainsKey(enventType)){
            enventDic.Add(enventType, null);
        }
        //判断传入的委托与定义的键对应的委托事件是否一致(因为有许多重载,判断参数是否一致)
        Delegate delegateFromKey = enventDic[enventType];//得到定义的键对应的值
        //如果值不为空,且值与传入委托事件一致
        if (delegateFromKey != null && delegateFromKey.GetType() != callBack.GetType())
        {
            throw new Exception(String.Format("尝试为事件{0}添加不同类型的委托,当前事件所对应的委托是{1},需要添加的事件委托是{2}"
                , enventType, delegateFromKey.GetType(), callBack.GetType()));
        }
        //经过上面两个if步骤后,可以将两个事件关联
        enventDic[enventType] =(CallBack)enventDic[enventType]+ callBack;//类似于链式结构
    }

三.广播监听事件(无参)

//广播监听:无参
    public static void BroadCast(EnventType enventType)
    {
        Delegate d;
        if(enventDic.TryGetValue(enventType,out d))
        {
            CallBack callBack = d as CallBack;
            if(callBack != null)
            {
                callBack();
            }
            else
            {
                throw new Exception(string.Format("广播事件错误,事件{0}具有不同类型的委托", enventType));
            }
        }

    }

测试无参监听与广播

需要显示的文本框挂载脚本,代码如下,监听的委托就是显示该文本Show()方法

 private void Awake()
    {
        gameObject.SetActive(false);
        EnventCenter.AddListener(EnventType.ShowText,Show);
    }
    private void OnDestroy()
    {
        EnventCenter.RemoveListener(EnventType.ShowText, Show);
    }

    private void Show()
    {
        gameObject.SetActive(true);
    }

添加鼠标监听事件,广播无参委托

private void Awake()
    {
        GetComponent<Button>().onClick.AddListener(() =>
        {
            EnventCenter.BroadCast(EnventType.ShowText);
        });
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值