1. 程式人生 > >unity c# 標準事件模式

unity c# 標準事件模式

.Net框架為事件定義了標準模式。他的目的是保持框架和使用者程式碼之間的一致性標準事件模式的核心是System.EventArgs--------預定義的沒有成員的框架類。 EventArgs是用於為事件傳遞資訊的基類。 我們在unity中寫個簡單的例子,目錄結構如下圖 NameChangedEventArgs中的程式碼如下
public class NameChangedEventArgs {
    public string LastName;
    public string NewName;
    public NameChangedEventArgs(string lastName,string newName) {
        LastName = lastName;
        NewName = newName;
    }
}
可以看到我們想要在監聽的事件發生的時候傳回一個NameChangedEventArgs結構的引數 MethodEvent中的程式碼如下
public class MethodEvent {
    //public event EventHandler<NameChangedEventArgs> DataChangeNotice;
    public delegate void NameChangedEventHandler(object sender, NameChangedEventArgs e);
    public event NameChangedEventHandler NameChanged;
    private string name;
    private string oldName;
    private static MethodEvent Instance;

    public static MethodEvent GetInstance(){
	if (Instance == null) {
		Instance = new MethodEvent();
	}
	return Instance; 
    }
    public void OnNameChangedName(string name){
       Debug.Log("MethodEvent  SetName DataChangeNotice "+ nameChanged);
       oldName = this.name;
       this.name = name;
       if (nameChanged != null) {
         NameChanged(this,new NameChangedEventArgs(oldName, this.name));
        }
    }
}
在 .net框架中 public event EventHandler<NameChangedEventArgs> DataChangeNotice; 和 public delegate void NameChangedEventHandler(object sender, NameChangedEventArgs e);
public event NameChangedEventHandler nameChanged; 表示的含義是一樣的 EventHandler是.net定義的一個泛華委託 委託的名字必須以EventHandler結尾 就像這樣 public delegate void NameChangedEventHandler(object sender, NameChangedEventArgs e); 方法名和事件名一致,以On作為開頭 public void OnNameChangedName(string name){。。。} 下面是UIViewEvent中的程式碼
using UnityEngine;
using System.Collections;

public class UIViewEvent : MonoBehaviour {
	private MethodEvent methodEvent;
	// Use this for initialization
	void Start () {
        methodEvent = MethodEvent.GetInstance ();
        methodEvent.NameChanged += DataChange;
	}
	
	// Update is called once per frame
	void Update () {
	
	}
	public void DataChange(object sender, NameChangedEventArgs e) {
		Debug.Log ("oldName "+e.LastName+" newName "+e.NewName);
	}

	void OnDestroy(){
        methodEvent.NameChanged -= DataChange;
	}
}

在這裡我們只可以這樣寫 methodEvent.NameChanged += DataChange; 而不可以這樣寫 methodEvent.NameChanged = DataChange; 下面是TestEvent程式碼
using UnityEngine;
using System.Collections;

public class TestEvent : MonoBehaviour {
	private MethodEvent methodEvent;
	public string name;
	// Use this for initialization
	void Start () {
            methodEvent = MethodEvent.GetInstance ();
	}
	
	public void SetName(){
            methodEvent.OnNameChangedName(name);
	}
}