簡介
在Unity中實現(xiàn)觀察者模式,我們可以創(chuàng)建一個Subject(目標(biāo)/主題)類,它負(fù)責(zé)維護訂閱者列表,并且當(dāng)其狀態(tài)改變時通知所有觀察者。下面通過5個代碼示例來詳細(xì)展示如何在Unity C#腳本中應(yīng)用觀察者模式:
示例1 - 簡單的文本更新通知
using System.Collections;
using System.Collections.Generic;
// 觀察者接口
public interface IObserver
{
void OnUpdate(string message);
}
// 被觀察者接口
public interface IObservable
{
void Register(IObserver observer);
void Remove(IObserver observer);
void NotifyObservers(string message);
}
// 具體的被觀察者類
public class TextDisplay : MonoBehaviour, IObservable
{
private List<IObserver> observers = new List<IObserver>();
public void Register(IObserver observer)
{
observers.Add(observer);
}
public void Remove(IObserver observer)
{
observers.Remove(observer);
}
public void NotifyObservers(string message)
{
foreach (var observer in observers)
{
observer.OnUpdate(message);
}
}
// 模擬狀態(tài)改變
public void UpdateText(string newText)
{
Debug.Log("Text has been updated to: " + newText);
NotifyObservers(newText);
}
}
// 具體的觀察者類
public class ConsoleLogger : MonoBehaviour, IObserver
{
public void OnUpdate(string message)
{
Debug.Log("Console Logger received update: " + message);
}
}
// 使用示例
public class GameManager : MonoBehaviour
{
public TextDisplay display;
public ConsoleLogger logger;
void Start()
{
display.Register(logger);
display.UpdateText("Hello, World!");
}
}
示例2 - 多觀察者監(jiān)聽游戲分?jǐn)?shù)變化
public interface IScoreObserver : IObserver
{
void OnScoreChanged(int newScore);
}
public class ScoreManager : MonoBehaviour, IObservable
{
private List<IScoreObserver> scoreObservers = new List<IScoreObserver>();
public void Register(IScoreObserver observer)
{
scoreObservers.Add(observer);
}
public void Remove(IScoreObserver observer)
{
scoreObservers.Remove(observer);
}
public void NotifyScoreObservers(int newScore)
{
foreach (var observer in scoreObservers)
{
observer.OnScoreChanged(newScore);
}
}
public void IncreaseScore(int points)
{
int currentScore = GetTotalScore(); // 假設(shè)這是一個獲取當(dāng)前分?jǐn)?shù)的方法
int newScore = currentScore + points;
SetTotalScore(newScore); // 假設(shè)這是一個設(shè)置總分?jǐn)?shù)的方法
NotifyScoreObservers(newScore);
}
}
public class ScoreUI : MonoBehaviour, IScoreObserver
{
public void OnScoreChanged(int newScore)
{
GetComponent<Text>().text = "Score: " + newScore;
}
}
public class HighScoreTracker : MonoBehaviour, IScoreObserver
{
public void OnScoreChanged(int newScore)
{
if (newScore > PlayerPrefs.GetInt("HighScore"))
{
PlayerPrefs.SetInt("HighScore", newScore);
}
}
}
// 使用示例
public class GameInitializer : MonoBehaviour
{
public ScoreManager scoreManager;
public ScoreUI scoreUI;
public HighScoreTracker highScoreTracker;
void Start()
{
scoreManager.Register(scoreUI);
scoreManager.Register(highScoreTracker);
// 游戲過程中調(diào)用scoreManager.IncreaseScore()增加分?jǐn)?shù)
}
}
示例3 - 事件系統(tǒng)實現(xiàn)觀察者模式
using UnityEngine.Events;
public class SubjectWithEvent : MonoBehaviour
{
public UnityEvent<string> OnTextUpdated;
public void UpdateText(string newText)
{
Debug.Log("Text has been updated to: " + newText);
OnTextUpdated.Invoke(newText);
}
}
public class ObserverUsingEvent : MonoBehaviour
{
public SubjectWithEvent subject;
void Start()
{
subject.OnTextUpdated.AddListener(OnTextUpdatedHandler);
}
void OnDestroy()
{
subject.OnTextUpdated.RemoveListener(OnTextUpdatedHandler);
}
void OnTextUpdatedHandler(string message)
{
Debug.Log("Received text update: " + message);
}
}
示例4 - 泛型觀察者和可序列化的事件系統(tǒng)
[System.Serializable]
public class GenericEvent<T> : UnityEvent<T>
{
}
public class ObservableGeneric<T> : MonoBehaviour
{
public GenericEvent<T> OnStateChanged;
public T State { get; private set; }
public void ChangeState(T newState)
{
State = newState;
OnStateChanged?.Invoke(newState);
}
}
public class ObserverForGeneric<T> : MonoBehaviour
{
public ObservableGeneric<T> observable;
public void Awake()
{
observable.OnStateChanged.AddListener(StateChangedHandler);
}
public void OnDestroy()
{
observable.OnStateChanged.RemoveListener(StateChangedHandler);
}
void StateChangedHandler(T newState)
{
Debug.Log($"New state received: {newState}");
}
}
// 使用示例
public class ExampleUsage : MonoBehaviour
{
public ObservableGeneric<int> healthObservable;
public ObserverForGeneric<int> healthObserver;
void Start()
{
healthObserver.observable = healthObservable;
}
}
示例5 - 使用C#委托簡化版
public class SimpleObservable
{
public delegate void MessageEventHandler(string message);
public event MessageEventHandler OnMessageEvent;
public void SendMessage(string message)
{
OnMessageEvent?.Invoke(message);
}
}
public class SimpleObserver : MonoBehaviour
{
public SimpleObservable observable;
void Start()
{
observable.OnMessageEvent += HandleMessageEvent;
}
void OnDestroy()
{
observable.OnMessageEvent -= HandleMessageEvent;
}
void HandleMessageEvent(string message)
{
Debug.Log("Received message: " + message);
}
}
// 使用示例
public class SimpleExample : MonoBehaviour
{
public SimpleObservable messageSource;
public SimpleObserver messageRecipient;
void Start()
{
messageRecipient.observable = messageSource;
messageSource.SendMessage("Hello from the Observable");
}
}
以上每個示例都展示了觀察者模式的基本原理:當(dāng)被觀察者的狀態(tài)發(fā)生改變時,它會通知所有已注冊的觀察者進行相應(yīng)的響應(yīng)或更新操作。
python推薦學(xué)習(xí)匯總連接:
50個開發(fā)必備的Python經(jīng)典腳本(1-10)
50個開發(fā)必備的Python經(jīng)典腳本(11-20)
50個開發(fā)必備的Python經(jīng)典腳本(21-30)
50個開發(fā)必備的Python經(jīng)典腳本(31-40)
50個開發(fā)必備的Python經(jīng)典腳本(41-50)
————————————————文章來源:http://www.zghlxwxcb.cn/news/detail-834248.html
?最后我們放松一下眼睛文章來源地址http://www.zghlxwxcb.cn/news/detail-834248.html
到了這里,關(guān)于Unity 觀察者模式(實例詳解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!