观察者设计模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。这种模式非常适合用于处理事件驱动的系统,比如游戏中的UI更新。在游戏中,玩家的金币和钻石数量可能会因为各种事件(如完成任务、购买道具等)而发生变化。通过使用观察者模式,我们可以将金币和钻石的UI元素注册为观察者,当这些资源数量发生变化时,UI元素会自动更新,而不需要手动去触发更新逻辑。这不仅简化了代码结构,还提高了系统的可维护性和扩展性。观察者模式还能用在游戏中群里群体出动的怪物等,当一群怪物中的其中一只被攻击了,就通知其他怪物群体攻击玩家等。

草图:

第一步创建2个文本

第二步创建一个脚本InterfaceManager用来管理接口


//定义观察者接口
public interface IObserver
{
    //接收信息
    void Receiving();
}
//定义被观察者接口
public interface ISubject
{
    //注册观察者
    void RegisterObserver(IObserver observer);
    //注销观察者
    void RemoveObserver(IObserver observer);
    //通知观察者
    void NotifyObservers();
}

第三步创建一个被观察者脚本ConcreteSubject。被观察者继承ISubject接口并实现里面的三个方法(当用户按下空格的时候通知其他观察者)

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

public class ConcreteSubject : MonoBehaviour,ISubject
{
    // 定义一个观察者列表
    private List<IObserver> _observers = new List<IObserver>();
    // 实现注册观察者的方法
    public void RegisterObserver(IObserver observer)
    {
        _observers.Add(observer);
    }
    // 实现移除观察者的方法
    public void RemoveObserver(IObserver observer)
    {
        _observers.Remove(observer);
    }
    // 实现通知观察者的方法
    public void NotifyObservers()
    {
        foreach (var observer in _observers)
        {
            observer.Receiving();
        }
    }
    void  Start()
    {
        //注册观察者
        RegisterObserver(FindObjectOfType<GoldObserver>());//注册金币观察者
        RegisterObserver(FindObjectOfType<MasonryObserver>());//注册钻石观察者
    }
    void Update()
    {
        //按下空格键通知所有的观察者
        if (Input.GetKeyDown(KeyCode.Space)) 
        {
            NotifyObservers();
        }
    }
}

第四步创建金币观察者(GoldObserver)和钻石观察者 (MasonryObserver)脚本

金币观察者脚本: 

using UnityEngine;
using UnityEngine.UI;

public class GoldObserver : MonoBehaviour, IObserver
{
    private int goldnum = 0;
    private Text goldnum_text;
    void Awake()
    {
        goldnum_text = gameObject.GetComponent<Text>();
        goldnum_text.text = "金币:" + goldnum.ToString();
    }
    public void Receiving()
    {
        goldnum += 10;
        goldnum_text.text = "金币:" + goldnum.ToString();
        //Debug.Log("我是金币观察者,收到消息" + goldnum.ToString());
    }
}

 钻石观察者脚本:

using UnityEngine;
using UnityEngine.UI;

public class MasonryObserver : MonoBehaviour, IObserver
{
    private int masonrynum = 0;
    private Text masonry_text;
    void Awake()
    {
        masonry_text = gameObject.GetComponent<Text>();
        masonry_text.text = "钻石:" + masonrynum.ToString();
    }
    public void Receiving()
    {
        masonrynum += 50;
        masonry_text.text = "钻石:" + masonrynum.ToString();
        //Debug.Log("我是钻石观察者,收到消息");
    }
}

 第五步创建一个空对象,并把被观察者脚本拖到这个空对象上,并且把金币和钻石观察者拖到对应的文本上。

第六步运行游戏按下空格就会发现金币和钻石的数量更新了(这里为了区分这里按下空格金币一次加10,钻石加50)

 

Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐