程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【Unity3D技巧】在Unity中使用事件/委托機制(event/delegate)進行GameObject之間的通信 (二) : 引入中間層NotificationCenter

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

編輯:C#入門知識

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

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);
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved