Unity中的观察者模式

发表于2017-11-29
评论0 4.2k浏览

做Unity开发的都会用到观察者模式,项目中用处也很大,考虑有些人可能还不熟悉,下面就给大家介绍下观察者模式。


观察者模式:

1. 概述

有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。


2. 解决的问题
将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。


观察者模式用到了c#的delegate知识,不懂的同学可以去百度一下。我目前觉得观察者模式很适合的地方是更新人物的属性完成时,自动更新UI界面的相应部分,起到了牵一发动全身的效果。


下面是示例代码,大概表明观察者模式的应用过程。

首先是delegate声明的脚本:

public delegate void  OnPlayerInfoChangedEvent(InfoType infoType);  
public event OnPlayerInfoChangedEvent OnPlayerInfoChanged;  

然后在其他脚本UI需要更新的地方写好相应的函数,函数里面可以做相应的筛选,然后注册delegate,

void OnPlayerInfoChanged(InfoType infoType)  
   {  
       if (infoType == InfoType.Name || infoType == InfoType.HeadPortrait || infoType == InfoType.Level || infoType == InfoType.Energy || infoType == InfoType.Toughen || infoType == InfoType.All)  
       {  
           UpdateShow();  
       }  
   }  
void Awake()  
   {  
       PlayerInfo.Instance.OnPlayerInfoChanged += OnPlayerInfoChanged;  
   }  

注意在销毁或其他必要的时候取消注册,否则会造成不必要的麻烦。

<strong>  </strong>  void OnDestroy()  
    {  
        PlayerInfo.Instance.OnPlayerInfoChanged -= OnPlayerInfoChanged;  
    }  


最后回到原来的声明delegate的脚本,在人物信息更新后及时作出UI更改:

// Update is called once per frame  
    void Update () {  
        //体力自动增长  
    if (Energy<100)  
    {  
        energyTimer += Time.deltaTime;  
        if (energyTimer>60)  
        {  
            Energy += 1;  
            energyTimer -=60;  
            OnPlayerInfoChanged(InfoType.Energy);  
        }  
    }  
    else  
    {  
        energyTimer = 0;  
    }  
        if (Toughen<50)  
        {  
            toughenTimer += Time.deltaTime;  
            if (toughenTimer>60)  
            {  
                Toughen += 1;  
                toughenTimer -= 60;  
            }  
            <strong>OnPlayerInfoChanged(InfoType.Toughen);</strong>  
        }  
        else  
        {  
            toughenTimer = 0;  
        }  
    }  

通过这种方式,有很多的需要更新UI的脚本写好相应的更新函数,等角色信息一更新就及时统一调用,方便管理和维护。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引