作为
上一篇有关组件的一般状态的文章的继续,我将进一步开发该主题,并希望实现一种功能,该功能将捕获并处理每个组件中的状态更改事件(当某些组件中的一般状态数据发生更改时)。
链接到项目通常,为了跟踪组件中的数据更改,将创建直接连接,即我们要么在Update方法中检查数据是否在那里已更改,
通过Update方法进行预帧数据验证或者我们订阅了一个非常特定的事件,该事件在“跟踪”组件中被独立调用,然后进行后续处理。
订阅组件中的事件并对其进行处理这种方法有很多缺点,大多数缺点已在上一篇文章中进行了介绍。 这些缺点的主要原因是强大的一致性和复杂的维护(支持,开发项目和重构的能力)。
创建状态通知解决方案
现在,您已经有了一个系统,可以放松组件之间的连接以及在组件之间创建邮件的方式,您可以摆脱通常情况下对值的手动检查,如下所示:
一般状态变更通知方案在上一篇文章中描述的实现中,数据在SharedState组件的索引器中的一个位置更改,因此控制它们的更改非常简单
一般情况下的索引器在索引器的设置器中,我们分配状态值。
现在,对于
SharedState组件,您需要添加对
SharedEvents的依赖关系,因为我将使用它来发送通知。 为
SharedState添加属性
。
从SharedEvents添加SharedState依赖项并创建一个从EventData继承的类以在状态通知中发送数据。 它将包含状态中的参数名称及其新值
添加一个包含有关常规状态更改信息的类现在,您需要添加一个指向
SharedEvents的链接,从
SharedState组件中的游戏对象获取它
在SharedState组件中获取SharedEvents现在,我们将更改索引器的设置器,以便每次状态更改时,都会创建一个名称为“ sharedstatechanged”的通知,并传递一个包含有关更改的所有数据的对象
更改索引器设置器现在,仍然需要订阅组件中的更改,更改另一个组件中的数据并检查其工作方式。
假设
SecondComponent更改状态,例如“ somedata”参数,并且
FirstComponent组件通过订阅通知来监视状态更改
在
SecondComponent中,我们称参数更改
变更资料通话现在,在
FirstComponent方法中,
我们添加一个处理程序并将有关常规状态更改的信息
打印到控制台
常规状态更改事件处理现在,如果您开始游戏,则在
SecondComponent中更改常规状态后,在
FirstComponent组件中,我们将收到一条通知,并将数据输出到控制台

现在,这可以工作了,您可以进行一些重构,并使代码更加方便。 为此,您需要将一般状态更改通知的预订转移到
SharedStateComponent基类,并创建一个抽象方法,通过实现该方法,每个组件将自行决定是否处理其中的状态更改。
将订阅转移到
SharedStateComponent
订阅基类中的一般状态更改通知添加一个抽象方法并在事件处理程序中调用它
添加抽象方法来处理子类中的事件现在,在
FirstComponent和
SecondComponent的每个子组件中
,您需要实现此方法并处理其中的一般状态更改。 但是我们将像以前一样将其打印到控制台
在FirstComponent和SecondComponent组件中实现抽象方法现在,当我们开始游戏时,我们将在控制台中看到两个组件中的2个条目。

重要!
在先前的实现中,
SharedEvents类中存在一个错误
,要解决该问题,您需要将
Subscribe方法更改为:
