来说说Unity观察者(Observer)模式

何为观察者模式,大家都比较形象的例子,和报纸的订阅差不多,订阅者就属于观察者,我想要订阅报纸了,然后就像报刊社订阅报纸,然后每天都有邮递员向您这送报纸,不想订阅了,就自己取消,然后第二天就不会有人给你送报纸。我们来利用Delegate实现一个简单的观察着模式.

创建一个消息封装体Class,用来传递需要的消息

using System;
using UnityEngine;

namespace UniEventDispatcher{

	//时间分发着
	public class Notification
	{	
		public GameObject m_sender;
		public object m_param;

		public Notification (GameObject  sender,object param)
		{
			m_sender = sender;
			m_param = param;
		}
		public Notification (object param)
		{
			m_sender = null;
			m_param = param;
		}

		public string getSring()
		{
			return string.Format("sender = {0},param = {1}",m_sender,m_param);
		}
	}
}
创建一个单例的主题。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace UniEventDispatcher{

	public class NotificationCenter
	{	

		///<summary>
		///定义事件分发委托
		///</summary>
		public delegate void onNotificaton(Notification notific);
		public onNotificaton  m_onNotificaton;

		public void Notice(Notification notific)
		{
			if(m_onNotificaton != null)
			{
				m_onNotificaton (notific);
			}
		}
		///<summary>
		///通知单例中心
		///</summary>
		private static NotificationCenter instance = null;
		public static NotificationCenter Get()
		{
			if(instance == null)
			{
				instance = new NotificationCenter ();
				return instance;
			}
			return instance;
		}
			
	}
}
	

我们来创建一个观察者脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniEventDispatcher;

public class ObserverObjects : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
		NotificationCenter.Get ().m_onNotificaton += changeColor;
	}

	void changeColor(Notification  notification)
	{
		Debug.Log ("notification:getParam() : "+ notification.getSring());
		GetComponent< Renderer> ().material.color = (Color)notification.m_param;
	}
	
	// Update is called once per frame
	void Update () {

	}

	void OnDestory()
	{
		NotificationCenter.Get ().m_onNotificaton -= changeColor;
	}
}
创建一个发布者脚本

using System;
using UnityEngine;
using UnityEngine.UI;
using UniEventDispatcher;

public  class SubjectObjects :  MonoBehaviour
{

	public Slider m_SliderA;
	public Slider m_SliderB;
	public Slider m_SliderC;

	void Start()
	{	
		m_SliderA = GameObject.FindWithTag ("SliderA").GetComponent<Slider> ();
		m_SliderB = GameObject.FindWithTag ("SliderB").GetComponent<Slider> ();
		m_SliderC = GameObject.FindWithTag ("SliderC").GetComponent<Slider> ();

		m_SliderA.onValueChanged.AddListener(onChangeColor);
		m_SliderB.onValueChanged.AddListener(onChangeColor);
		m_SliderC.onValueChanged.AddListener(onChangeColor);
	}

	public void onChangeColor(float f)
	{
		float r = m_SliderA.value;
		float g = m_SliderB.value;
		float b = m_SliderC.value;

		//发布消息
		NotificationCenter.Get ().Notice (new Notification(new Color (r, g, b)));
	}
}

3,创建如下的图




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章