<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【Unity3D技巧】在Unity中使用事件/委托機制(event/delegate)進行GameObject之間的通信 (二) : 引入中間層NotificationCenter

      作者:王選易,出處:http://www.rzrgm.cn/neverdie/ 歡迎轉載,也請保留這段聲明。如果你喜歡這篇文章,請點【推薦】。謝謝!

      QQ圖片20140529123319

      一對多的觀察者模式機制有什么缺點?

      想要查看完整源代碼,還是訪問這個項目的GitHub:https://github.com/MrNerverDie/Unity-Flappy-Bird

      如果你對如何在Unity中使用事件/委托機制還不太了解,建議您查看我的前一篇文章:【Unity3D技巧】在Unity中使用事件/委托機制(event/delegate)進行GameObject之間的通信

      在前一篇博客里面,我們寫到:【Unity3D技巧】在Unity中使用事件/委托機制(event/delegate)進行GameObject之間的通信,其中使用了EventHandler這個委托作為通用的事件類型,實現了一對多的觀察者模式。但是這樣做有什么缺點呢?我們還是舉前文所說的小鳥撞上管道為例:

      bird1

      在這里面,小鳥撞倒管道時,小鳥會發送一個 產生碰撞的 消息傳送給所有觀察者,那么,如果我們新加入一個名為天鵝,它也能在天上飛,那么我們就要在它的類內部實現一個同樣功能的 產生碰撞的 消息傳送給所有觀察者,這樣就產生了代碼重復,軟件中解決代碼重復的問題一般使用的事引入中間層的辦法,所以我仿照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 Dictionary<string, EventHandler> eventTable;
      
          protected INotificationCenter()
          {
              eventTable = new Dictionary<string, 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 Dictionary<string, EventHandler> handlers;
      
          void Awake() {
              handlers = new Dictionary<string, EventHandler>();
              center = NotificationCenter.GetInstance();
          }
      
          void OnDestroy() {
              foreach (KeyValuePair<string, 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);
          }
      }
      posted @ 2014-06-16 14:22  月出漸分明  閱讀(10097)  評論(13)    收藏  舉報
      主站蜘蛛池模板: 酒店大战丝袜高跟鞋人妻| 欧洲精品免费一区二区三区| 在线免费播放av观看| 男女啪啪免费观看网站| 亚洲精品成人一二三专区| 广丰县| 日韩精品国产中文字幕| 潮喷失禁大喷水无码| 波多野结衣久久一区二区| 亚洲一区二区三区啪啪| 97久久精品人人做人人爽| 内射干少妇亚洲69XXX| 国精品无码人妻一区二区三区| 亚洲精品一区二区三区综合| 在线观看无码av五月花| 国产一区二区在线激情往| 久久天天躁夜夜躁狠狠ds005 | 欧美成人h亚洲综合在线观看| 成人亚洲a片v一区二区三区动漫| 无码av不卡免费播放| 日韩中文字幕免费在线观看 | 精品国产乱码久久久久夜深人妻| 91密桃精品国产91久久| 最近中文字幕日韩有码| 华人在线亚洲欧美精品| 亚洲人成自拍网站在线观看 | 久99久热免费视频播放| 石台县| 国产午夜福利视频合集| 粉嫩蜜臀av一区二区三区| 午夜三级成人在线观看| 女性高爱潮视频| 好男人日本社区www| 亚洲男人的天堂在线观看| 久久se精品一区二区三区| 精品国产午夜福利在线观看 | 午夜成人精品福利网站在线观看 | 庄河市| 一本一道av无码中文字幕麻豆| 乱色欧美激惰| 中文熟妇人妻av在线|