// Copyright (c) Pixel Crushers. All rights reserved. using UnityEngine; using System; namespace PixelCrushers { /// /// Uses the MessageSystem to keep data synchronized between a source and a listener. /// [AddComponentMenu("")] // Use wrapper instead. public class DataSynchronizer : MonoBehaviour, IMessageHandler { /// /// Message that data source sends to inform listeners that the value changed. /// public const string DataSourceValueChangedMessage = "Data Source Value Changed"; /// /// Message that listeners send to request this data synchronizer to change the data source's value. /// public const string RequestDataSourceChangeValueMessage = "Request Data Source Change Value"; [Tooltip("A name to associate with the data source. Data change messages that reference this name will invoke the value update events.")] [SerializeField] private string m_dataSourceName; [SerializeField] private ObjectUnityEvent m_onRequestDataSourceChangeValue = new ObjectUnityEvent(); /// /// A name to associate with the data source. Data change messages that reference this name will invoke the value update events. /// public string dataSourceName { get { return m_dataSourceName; } set { m_dataSourceName = value; } } /// /// Event to send to data source to request it to change value. /// public ObjectUnityEvent onRequestDataSourceChangeValue { get { return m_onRequestDataSourceChangeValue; } set { m_onRequestDataSourceChangeValue = value; } } protected virtual void OnEnable() { MessageSystem.AddListener(this, RequestDataSourceChangeValueMessage, dataSourceName); } protected virtual void OnDisable() { MessageSystem.RemoveListener(this, RequestDataSourceChangeValueMessage, dataSourceName); } /// /// Handles messages requesting to change the value of the data source. On receipt of the /// RequestDataSourceChangeValueMessage, invokes the onRequestDataSourceChangeValue event, /// passing the first argument of the message as the new value. /// /// First argument is the new value. public void OnMessage(MessageArgs messageArgs) { onRequestDataSourceChangeValue.Invoke(messageArgs.firstValue); } /// /// When the data source has changed its value, it should call this method to inform listeners. /// /// The data source's new value. public void DataSourceValueChanged(object newValue) { MessageSystem.SendMessage(this, DataSourceValueChangedMessage, dataSourceName, newValue); } } }