位置: 编程技术 - 正文

在Unity中使用事件/委托机制(event/delegate)进行GameObject之

编辑:rootadmin
欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,【狗刨学习网】unity极致学院,致力于打造业内unity3d培训、学习第一品牌。  一对多的观察者模式机制有什么缺点?    如果你对如何在Unity中使用事件/委托机制还不太了解,建议您查看我的前一篇文章:【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信  在前一篇博客里面,我们写到:【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信,其中使用了EventHandler这个委托作为通用的事件类型,实现了一对多的观察者模式。但是这样做有什么缺点呢?我们还是举前文所说的小鸟撞上管道为例:    在这里面,小鸟撞倒管道时,小鸟会发送一个 产生碰撞的 消息传送给所有观察者,那么,如果我们新加入一个名为天鹅,它也能在天上飞,那么我们就要在它的类内部实现一个同样功能的 产生碰撞的 消息传送给所有观察者,这样就产生了代码重复,软件中解决代码重复的问题一般使用的事引入中间层的办法,所以我仿照Cocos2d-x中的CCNotificationCenter写了一个CCNotificationCenter来存储各种消息并转发来当作中间层。  引入中间层 -- NotificationCenter   NotificationCenter基本的设计思路是基于MessageDispatcher模式的,即使用一个字典(Dictionary)来记录各种需要转发的信息,以及这些信息的观察者,然后再恰当的时候进行消息的转发。NotificationCenter还应当提供观察者订阅和取消订阅的方法。  NotificationCenter是基于单件模式的,它在第一次被调用GetInstance方法时被初始化的,使用单件的原因是要让NotificationCenter的生命期比任何一个观察者都长,这样才不会出现NotificationCenter为空的情况。  在下面的代码里,我把INotificationCenter做成抽象类的原因是:希望通过这个继承这个类来创建多个子类,比如可以创建UINotificationCenter,BattleNotificationCenter,TradeNotificationCenter。来进行消息的分组。  下面我把自己的代码分享一下,供大家参考:  using UnityEngine;  using System;  using System.Collections;  using System.Collections.Generic;  // NotificationCenter的拓展类,在这里弄出多个INotificationCenter的子类,  // 分别处理不同的消息转发,便于消息分组  public class NotificationCenter : INotificationCenter  {  private static INotificationCenter singleton;  private event EventHandler GameOver;  private event EventHandler ScoreAdd;  private NotificationCenter()  : base()  {  // 在这里添加需要分发的各种消息  eventTable[GameOver]  = GameOver;  eventTable[ScoreAdd]  = ScoreAdd;  }  public static INotificationCenter GetInstance()  {  if (singleton == null)  singleton = new NotificationCenter();  return singleton;  }  }  // NotificationCenter的抽象基类  public abstract class INotificationCenter  {  protected Dictionarystring, EventHandler eventTable;  protected INotificationCenter()  {  eventTable = new Dictionarystring, EventHandler();  }  // PostNotification -- 将名字为name,发送者为sender,参数为e的消息发送出去  public void PostNotification(string name)  {  this.PostNotification(name, null, EventArgs.Empty);  }  public void PostNotification(string name, object sender)  {  this.PostNotification(name, name, EventArgs.Empty);  }  public void PostNotification(string name, object sender, EventArgs e)  {  if (eventTable[name]  != null)  {  eventTable[name](sender, e);  }  }  // 添加或者移除了一个回调函数。  public void AddEventHandler(string name, EventHandler handler)  {  eventTable[name]  &#;= handler;  }  public void RemoveEventHandler(string name, EventHandler handler)  {  eventTable[name]  -= handler;  }  }  对观察者进行抽象化 -- 引入Observer  在加入了NotificationCenter之后,我们要面对的下一个问题就是,我们的每一个观察者都需要在自己的Start方法中添加回调函数,在OnDestroy方法中取消回调函数,那么,我们可以把这部分的代码抽象在一个Observer组件中,使用另一个字典记载下所有的该GameObject注册的回调函数,在Observer的OnDestroy方法里面一次全部取消订阅。代码如下:  using UnityEngine;  using System.Collections;  using System.Collections.Generic;  using System;  public class Observer : MonoBehaviour {  private INotificationCenter center;  private Dictionarystring, EventHandler handlers;  void Awake() {  handlers = new Dictionarystring, EventHandler();  center = NotificationCenter.GetInstance();  }  void OnDestroy() {  foreach (KeyValuePairstring, EventHandler kvp in handlers) {  center.RemoveEventHandler(kvp.Key, kvp.Value);  }  }  public void AddEventHandler(string name, EventHandler handler) {  center.AddEventHandler(name, handler);  handlers.Add(name, handler);  }  }更多内容,请访问【狗刨学习网】unity极致学院 声明:此篇文档时来自于【狗刨学习网】社区-unity极致学院,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。

推荐整理分享在Unity中使用事件/委托机制(event/delegate)进行GameObject之,希望有所帮助,仅作参考,欢迎阅读内容。

在Unity中使用事件/委托机制(event/delegate)进行GameObject之

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

unity游戏开发之防空防灾游戏来了 防雾霾的游戏还会远么 狗刨学习网报道/昨日,狗刨学习网曾有过《[穹顶之下]刷屏谁来做款雾霾主题手游?》的相关报道。同样就在昨日,由福建省人防办组织研发的国内首款

unity3d游戏开发之多人网络翻译 Aboutthistutorial我一直认为unity需要一个好一点的多人网络的教程。当我开始用unity网络功能的时候,我感觉unity自带的例子太混乱了;一个好的网络功能的

unity3d中实现聊天功能 【狗刨学习网】usingUnityEngine;usingSystem.Collections;publicclassChat:MonoBehaviour{boolusingChat=false;boolshowChat=false;stringinputField=;Vector2scrollposition;intwidth=;intheight=;st

标签: 在Unity中使用事件/委托机制(event/delegate)进行GameObject之

本文链接地址:https://www.jiuchutong.com/biancheng/381565.html 转载请保留说明!

上一篇:[置顶] unity团队如何解决项目资源依赖缺失问题和资源命名规范化([置顶]马粥街残酷史)

下一篇:unity游戏开发之防空防灾游戏来了 防雾霾的游戏还会远么(unity 开发游戏)

  • 公司的纳税人识别号怎么查询
  • 现金回收期计算公式
  • 一般纳税人结转销售成本怎么算
  • 个体工商户怎么变更法人
  • 公司购买手机如何入账
  • 车辆保险车船税怎么做会计分录
  • 幼儿园属于小型幼儿吗
  • 电子发票冲红后算金额吗?
  • 高新技术企业费用认定
  • 投标函中的其他是指什么
  • 在账务处理过程中,最关键的环节是
  • 机动车销售统一专票可以抵扣进项税额吗
  • 诉讼费走哪个会计科目
  • 跨年多计提社保个人部分怎么调整
  • 打款金额少于开票金额
  • 发票 抵扣联
  • 纳税人所在地为
  • 企业整体资产转让增值税
  • 应收账款重组
  • 商贸流通企业的构成
  • 增值税专用发票的税率是多少啊
  • 公司购买基金怎样入账
  • PHP:xml_set_end_namespace_decl_handler()的用法_XML解析器函数
  • 误解苹果
  • 生产和提供的区别
  • 施工企业工程结算
  • 印花税计提缴纳时间
  • PHP:pg_result_error()的用法_PostgreSQL函数
  • 现金折扣的会计处理方法
  • php初学者用什么软件
  • 购货方开具红字发票怎么做账
  • yolo 源码
  • 整体租赁合同
  • 涅迪克角灯塔上的节日彩灯,缅因州 (© Walter Bibikow/Alamy)
  • 将时间序列转化为图像
  • 申报表已申报未交款后作废
  • next frame
  • java web 购物车
  • php多进程处理大数据
  • php读取php文件内容
  • 企业会计准则季报利润表填写
  • python2多进程
  • 建筑安装增值税纳税地点
  • 深入浅出夏寒陆行全文免费阅读笔趣阁番外
  • access ms
  • 贷款计入什么科目
  • 小规模纳税人销售商品会计分录
  • 所得税汇算清缴调整后要账务处理吗
  • 登记会计账簿的基本要求
  • 母公司无偿借款给子公司
  • 公司员工报销没有发票挂内账有风险吗
  • 一次性医疗补助金怎么计算
  • 固定资产公司
  • 发生的计提费用没有发生怎么办
  • 小企业会计制度废止
  • 一般纳税人车辆租赁费的税率是多少
  • 影响营业利润和利润总额的因素
  • 房屋出租要交的税有哪些
  • 累计折旧减少记哪方
  • Windows10下mysql 5.7.17 安装配置方法图文教程
  • win7 64位系统关机按钮不见了怎么找回 win7关机按钮设置步骤
  • ubuntu20.04忘记用户密码怎么办
  • solaris配置ip地址
  • windows server 2016 域控
  • windows10体验指数如何查看
  • fsma32.exe进程是什么文件 fsma32是什么进程
  • 英雄联盟windows10
  • opengl画曲线
  • GLSL Tessellation Shader的编程入门介绍
  • android opengles2.0教程
  • ObjectAnimator Demo
  • js中的表达式是什么
  • nodejs爬虫技术
  • javascript中用于声明变量的关键字
  • 置顶聊天折叠怎么关闭
  • 社保逾期未申报会造成什么影响,要怎么处理
  • 小规模纳税人开专票
  • 农村饮水扶持资金申请报告
  • 百旺税控盘口令错误被锁了怎么办
  • 2021年十大慈善企业
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设