unity 观察者模式

介绍:

       观察者模式是一种一对多的定义关系,让多个观察者对象同时监听一个主要对象,当这个主要对象发生变化时,会通知所有的观察者对象,使其发生相应的改变。

比较经典的例子为C#种的猫叫了,老鼠跑了,主人醒了。

所运用的关键字delegate  event

打个在游戏具体场景的例子,当游戏结束时,需要弹出视频广告,并且显示结算界面UI

首先是游戏控制类:

public class GameController
{

    private static GameController instance;
    public static GameController Instance
    {
        get {
            if (instance==null)
            {
                instance = new GameController();
            }
            return instance;
        }
    }

    public delegate void MyDelegate();

    public event MyDelegate myEvent;

    public void GameOver()
    {
        Debug.Log("游戏结束");
        if (myEvent != null)
        {
            myEvent();
        }        
    }
}

定义一个MyDelegate的委托方法,委托我理解为这是一个可以变成任何它想成为的方法体,因为太飘渺了,所以在使用委托的时候脑子里先想好写出这个委托是用来干嘛的,在这里这个委托是用来装载当游戏结束是触发的一系列关联的方法体的。

有了这个想法,就基于委托下建立一个事件myEvent,事件在我的理解里就是一种通知,一个连接,a到b的一条线,几个台灯和插头用线连接着,插头通上电,台灯就亮了。

上面的委托是放了一些需要使用的方法,这里基于委托的对象(可能很多个台灯)定义一个事件(线)用来连接这个GameOver(插头)使其当一定条件下GameOver会触发事件来让台灯做出相应的反应。

广告的类:

public class Ads : MonoBehaviour {

    public static Ads instance;

    void Awake()
    {
        instance = this;
    }

    public void Show()
    {
        Debug.Log("显示广告");
    }
}

结束界面的UI:

public class UIPanel : MonoBehaviour
{
    public static UIPanel instance;

    void Awake()
    {
        instance = this;
    }
    public void GameEndPanel()
    {
        Debug.Log("游戏结束界面");
    }
}

此时其实这几个类与方法都没有任何的交集,下面来让他们互动起来

	void Start () {

        GameController.Instance.myEvent += Ads.instance.Show;
        GameController.Instance.myEvent += UIPanel.instance.GameEndPanel;

        GameController.Instance.GameOver();
	}

额···为了图方便所以全用了单例形式表示,感觉这样理解观察者模式比较清楚一点,Ads.instance.Show(广告显示订阅了这个事件),UIPanel.instance.GameEndPanel(结束界面UI订阅的这个事件),然后只需要在某个阶段或者其他逻辑里只单单触发一下游戏结束GameOver(),相应的广告以及UI逻辑也会跟着执行了。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中的观察者模式是一种设计模式,用于实现对象之间的一对多依赖关系。它允许一个被观察的对象(称为主题或被观察者)维护一组依赖于它的对象列表(称为观察者),并在状态发生变化时自动通知观察者。 在Unity中,可以使用C#语言和相关的Unity API来实现观察者模式。下面是一个简单的示例: ```csharp // 定义观察者接口 public interface IObserver { void OnNotify(); } // 定义被观察者类 public class Subject { private List<IObserver> observers = new List<IObserver>(); public void AddObserver(IObserver observer) { observers.Add(observer); } public void RemoveObserver(IObserver observer) { observers.Remove(observer); } public void NotifyObservers() { foreach (var observer in observers) { observer.OnNotify(); } } } // 实现观察者类 public class Observer : IObserver { public void OnNotify() { // 处理通知的逻辑 } } // 使用观察者模式 public class Example : MonoBehaviour { private Subject subject = new Subject(); private Observer observer = new Observer(); private void Start() { subject.AddObserver(observer); } private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { subject.NotifyObservers(); } } } ``` 在上面的示例中,Subject类是被观察者,它维护了一个观察者列表。Observer类是观察者,它实现了IObserver接口的OnNotify方法来处理通知的逻辑。Example类演示了如何使用观察者模式,在Start方法中将观察者添加到被观察者的列表中,在Update方法中按下空格键时通知观察者。 这只是一个简单的例子,实际应用中可能会有更复杂的场景和逻辑。观察者模式Unity中的应用广泛,可以用于处理事件、消息传递、UI更新等各种情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值