1. 程式人生 > >【設計模式】使用unity實現觀察者模式(delegate,event)

【設計模式】使用unity實現觀察者模式(delegate,event)

最近開發的時候,發現要用到設計模式中的觀察者模式,所以就找了一些資料來看看,然後自己結合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上面