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. Serverless 时代下大规模微服务应用运维的最佳实践

    简介: 原来的微服务用户需要自建非常多的组件,包括 PaaS 微服务一些技术框架,运维 IaaS.K8s,还包括可观测组件等.SAE 针对这些方面都做了整体的解决方案,使用户只需要关注自己的业务系统, ...

  2. [Cryptocurrency] rDAI 与 DAI 的区别, 如何质押 rDAI 获取利息

    以下合约操作需要在安装 MetaMask ( 以太坊的浏览器钱包 ) 的情况下进行. rDAI 通过和 DAI  1 : 1 互换得到,在 rDAI 提供的 dapp 上面操作 https://app ...

  3. 使用open webui+ollama部署本地大模型

    使用open webui+ollama部署本地大模型 上次使用了angthingllm + ollama部署了本地大模型,详情见:https://www.cnblogs.com/jokingremar ...

  4. vue-hbuilder打包-调取摄像头或上传图片

    方法一: <input type="file" accept="image/*" capture="camera" > 方法二: ...

  5. 【停用词】NLP中的停用词怎么获取?我整理了6种方法

    目录 一.停用词介绍 二.停用词应用场景 2.1 提取高频词 2.2 词云图 三.停用词获取方法 3.1 自定义停用词 3.2 用wordcloud调取停用词 3.3 用nltk调取停用词 3.3.1 ...

  6. golang向上取整、向下取整和四舍五入

    一.概述 官方的math 包中提供了取整的方法,向上取整math.Ceil() ,向下取整math.Floor() 二.用法 package main import ( "fmt" ...

  7. 网络安全—PGP8.1软件应用

    文章目录 安装PGP8 了解 工作原理 PGP使用 准备工作 加密与解密 加密者视角(发送方) 接收者视角(接收方) 签名 签名方(发送方) 验证签名方(接收方) 补充 加密签名一段文字 签名后的格式 ...

  8. DashVector x 通义千问大模型:打造基于专属知识的问答服务

    本教程演示如何使用向量检索服务(DashVector),结合LLM大模型等能力,来打造基于垂直领域专属知识等问答服务.其中LLM大模型能力,以及文本向量生成等能力,这里基于灵积模型服务上的通义千问 A ...

  9. springboot 整合mail 发送邮件

    springboot 整合mail 发送邮件 pom.xml <properties> <java.version>1.8</java.version> <p ...

  10. ThreadLocal原理详解——终于弄明白了ThreadLocal

    目录 概述 API介绍 ThreadLocal的理解 ThreadLocal的原理分析 总结 概述 在java学习生涯中可能很多人都会听到ThreadLocal变量,从字面上理解ThreadLocal ...