EventManager

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement; /// <summary>
/// 事件类型枚举
/// </summary>
public enum EVENT_TYPE
{
SPAWBLUEARMY,
SPAWBLUEARMYFINISH,
CLEARSCENE,
}; public class EventManager : SingletonMonoBehaviour<EventManager>
{ #region variables //事件委托
public delegate void OnEvent(EVENT_TYPE Event_Type, Component Sender, object Param = null); //存储每个事件类型下的订阅
private Dictionary<EVENT_TYPE, List<OnEvent>> Listeners = new Dictionary<EVENT_TYPE, List<OnEvent>>();
#endregion
//-----------------------------------------------------------
#region methods void Awake() {
SceneManager.sceneLoaded += OnSceneLoaded;
}
/// <summary>
/// 添加订阅
/// </summary> public void AddListener(EVENT_TYPE Event_Type, OnEvent Listener)
{
List<OnEvent> ListenList = null; if (Listeners.TryGetValue(Event_Type, out ListenList))
{
//List exists, so add new item
ListenList.Add(Listener);
return;
} ListenList = new List<OnEvent>();
ListenList.Add(Listener);
Listeners.Add(Event_Type, ListenList);
}
//-----------------------------------------------------------
/// <summary>
/// 分发事件,调用该事件类型下的所有订阅者的委托方法
/// </summary>
public void PostNotification(EVENT_TYPE Event_Type, Component Sender, object Param = null)
{
List<OnEvent> ListenList = null; if (!Listeners.TryGetValue(Event_Type, out ListenList))
return; for (int i = 0; i < ListenList.Count; i++)
{
if (!ListenList[i].Equals(null))
ListenList[i](Event_Type, Sender, Param);
}
}
//-----------------------------------------------------------
public void RemoveEvent(EVENT_TYPE Event_Type)
{
Listeners.Remove(Event_Type);
}
//-----------------------------------------------------------
//移除订阅字典中无效订阅者
public void RemoveRedundancies()
{
Dictionary<EVENT_TYPE, List<OnEvent>> TmpListeners = new Dictionary<EVENT_TYPE, List<OnEvent>>(); foreach (KeyValuePair<EVENT_TYPE, List<OnEvent>> Item in Listeners)
{
for (int i = Item.Value.Count - 1; i >= 0; i--)
{
if (Item.Value[i].Equals(null))
Item.Value.RemoveAt(i);
} if (Item.Value.Count > 0)
TmpListeners.Add(Item.Key, Item.Value);
} Listeners = TmpListeners;
} //单例下换场景不会销毁,因此需要在场景加载后清除无效的订阅
void OnSceneLoaded()
{
RemoveRedundancies();
}
//-----------------------------------------------------------
#endregion
}

使用案例

using UnityEngine;
using System.Collections; public class EnemyObject : MonoBehaviour
{
//-------------------------------------------------------
//C# accessors for private variables
public int Health
{
get{return _health;}
set
{
//Clamp health between 0-100
_health = Mathf.Clamp(value, 0, 100); //Post notification - health has been changed
EventManager.Instance.PostNotification(EVENT_TYPE.HEALTH_CHANGE, this, _health);
}
}
//-------------------------------------------------------
public int Ammo
{
get{return _ammo;}
set
{
//Clamp ammo between 0-50
_ammo = Mathf.Clamp(value,0,50); //Post notification - ammo has been changed
EventManager.Instance.PostNotification(EVENT_TYPE.AMMO_CHANGE, this, _health);
}
}
//-------------------------------------------------------
//Internal variables for health and ammo
private int _health = 100;
private int _ammo = 50;
//-------------------------------------------------------
//Called at start-up
void Start()
{
//Add myself as listener for health change events
EventManager.Instance.AddListener(EVENT_TYPE.HEALTH_CHANGE, OnEvent);
}
//-------------------------------------------------------
// Update is called once per frame
void Update ()
{
//If you press space bar, the health is reduce
if(Input.GetKeyDown(KeyCode.Space))
{
//Take some damage of space bar press
Health -= 5;
}
}
//-------------------------------------------------------
//Called when events happen
public void OnEvent(EVENT_TYPE Event_Type, Component Sender, object Param = null)
{
//Detect event type
switch(Event_Type)
{
case EVENT_TYPE.HEALTH_CHANGE:
OnHealthChange(Sender, (int)Param);
break;
}
}
//-------------------------------------------------------
//Function called when health changes
void OnHealthChange(Component Enemy, int NewHealth)
{
//If health has changed of this object
if(this.GetInstanceID() != Enemy.GetInstanceID()) return; Debug.Log ("Object: " + gameObject.name + " Health is: " + NewHealth.ToString());
}
//-------------------------------------------------------
}

工具类——EventManager的更多相关文章

  1. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  2. Android—关于自定义对话框的工具类

    开发中有很多地方会用到自定义对话框,为了避免不必要的城府代码,在此总结出一个工具类. 弹出对话框的地方很多,但是都大同小异,不同无非就是提示内容或者图片不同,下面这个类是将提示内容和图片放到了自定义函 ...

  3. [转]Java常用工具类集合

    转自:http://blog.csdn.net/justdb/article/details/8653166 数据库连接工具类——仅仅获得连接对象 ConnDB.java package com.ut ...

  4. js常用工具类.

    一些js的工具类 复制代码 /** * Created by sevennight on 15-1-31. * js常用工具类 */ /** * 方法作用:[格式化时间] * 使用方法 * 示例: * ...

  5. Guava库介绍之实用工具类

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...

  6. Java程序员的日常—— Arrays工具类的使用

    这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ...

  7. .net使用正则表达式校验、匹配字符工具类

    开发程序离不开数据的校验,这里整理了一些数据的校验.匹配的方法: /// <summary> /// 字符(串)验证.匹配工具类 /// </summary> public c ...

  8. WebUtils-网络请求工具类

    网络请求工具类,大幅代码借鉴aplipay. using System; using System.Collections.Generic; using System.IO; using System ...

  9. JAVA 日期格式工具类DateUtil.java

    DateUtil.java package pers.kangxu.datautils.utils; import java.text.SimpleDateFormat; import java.ut ...

  10. 安卓---Toast工具类,有点懒

    package com.liunan.myfirstapp.util; import android.content.Context; import android.widget.Toast; /** ...

随机推荐

  1. 阿里云消息队列 RocketMQ 5.0 全新升级:消息、事件、流融合处理平台

    ​简介: RocketMQ5.0 的发布标志着阿里云消息从消息领域正式迈向了"消息.事件.流"场景大融合的新局面.未来阿里云消息产品的演进也将继续围绕消息.事件.流核心场景而开展. ...

  2. 技术干货|基于Apache Hudi 的CDC数据入湖「内附干货PPT下载渠道」

    ​简介: 阿里云技术专家李少锋(风泽)在Apache Hudi 与 Apache Pulsar 联合 Meetup 杭州站上的演讲整理稿件,本议题将介绍典型 CDC 入湖场景,以及如何使用 Pulsa ...

  3. dotnet 根据基线包版本实现库版本兼容

    本文来告诉大家如何根据 基线包版本 的功能来实现自动在构建过程中,告诉开发者,当前版本是否存在不兼容旧版本的变更.其不兼容变更包括二进制中断变更和 API 不兼容变更和源代码中断变更.可以让库开发者花 ...

  4. 9.按需创建PV和PVC并使用

    官方文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-stor ...

  5. XAMPP安装与部署使用

    #注:本文章资料借鉴自于Sunny王维,地址:https://blog.csdn.net/qq_36595013/article/details/80373597 [一]XAMPP介绍 XAMPP. ...

  6. 【OpenVINO™】使用OpenVINO™ C# API 部署 YOLO-World实现实时开放词汇对象检测

    YOLO-World是一个融合了实时目标检测与增强现实(AR)技术的创新平台,旨在将现实世界与数字世界无缝对接.该平台以YOLO(You Only Look Once)算法为核心,实现了对视频中物体的 ...

  7. Git/SourceTree版本管理

    目录 视频课程: 工作区: 文件状态: 回退版本: 合并分支 合并提交 冲突 删除分支 忽略文件 汉英对照表 多端同步 添加远程仓库 推送代码到远程仓库 拉取代码 视频课程: https://www. ...

  8. SATA与PCI-E速度对比

    SATA SATA接口已经发展到了第三代,理论上的最大速度达到600MB/s.平时大家见到的SATA SSD使用的都是SATA三代,实际测试速度在550MB/s左右,这比普通的机械硬盘的速度100MB ...

  9. js图片懒加载,在不做分页的情况下的解决方案

    Intersection Observer API 1.注意点 一般都是后端返回数据, 用 this.$nextTick(() => { this.handleScroll(); }); 确保d ...

  10. Gradle常用功能拾掇

    介绍 Gradle 是一个基于groovy动态语言的java项目管理工具,灵活性和速度好于java,他的build脚本完全可以以写groovy代码的方式来实现,所以灵活性很高,当然也就比maven的x ...