【設計模式】使用unity實現觀察者模式(delegate,event)
阿新 • • 發佈:2019-02-07
最近開發的時候,發現要用到設計模式中的觀察者模式,所以就找了一些資料來看看,然後自己結合Unity來實現了一下觀察者模式,
由於本人是初學者,寫的不好,望請指導。
首先,擺好如圖所示的UI的介面:
然後建立如下的指令碼:
1、Subject(這個指令碼是事件的派發類,所有發生的事件都由這個類來派發)
using UnityEngine; using System.Collections; using System; using UnityEngine.UI; public delegate void ObserverTest(); public class Subject : MonoBehaviour { public static event ObserverTest ObserverTestEvent; void Start() { Button btn = transform.Find("Button").GetComponent<Button>(); btn.onClick.AddListener(onClick); } public void onClick() { if (ObserverTestEvent != null) ObserverTestEvent(); } }
然後是作為示例的三個觀察者:
1、ButtonObserver.cs
using UnityEngine; using System.Collections; using UnityEngine.UI; public class ButtonObserver : MonoBehaviour { void Start() { Subject.ObserverTestEvent += ChangeButton; } public void ChangeButton() { Button btn = transform.Find("Button1").GetComponent<Button>(); Image image = btn.GetComponent<Image>(); Text txt = btn.transform.Find("Text").GetComponent<Text>(); image.color = Color.red; txt.text = "On Change Button Text"; } void OnDestroy() { Subject.ObserverTestEvent -= ChangeButton; } }
2、TextObserver_1
using UnityEngine; using System.Collections; using UnityEngine.UI; public class TextObserver_1 : MonoBehaviour { // Use this for initialization void Start () { Subject.ObserverTestEvent += ChangeText; } private void ChangeText() { Text txt = transform.Find("Text1").GetComponent<Text>(); txt.text = "hi, Eagle1"; } void OnDestroy() { Subject.ObserverTestEvent -= ChangeText; } }
3、TextObservere_2
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class TextOberver_2 : MonoBehaviour {
// Use this for initialization
void Start()
{
Subject.ObserverTestEvent += ChangeText;
}
private void ChangeText()
{
Text txt = transform.Find("Text2").GetComponent<Text>();
txt.text = "hi, Eagle2";
}
void OnDestroy()
{
Subject.ObserverTestEvent -= ChangeText;
}
}
然後點選(圖中紅框的button),有如下效果:
所有指令碼都放在canvas上面