最近开发的时候,发现要用到设计模式中的观察者模式,所以就找了一些资料来看看,然后自己结合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上面