SharedState组件更改状态通知

作为上一篇有关组件的一般状态的文章的继续,我将进一步开发该主题,并希望实现一种功能,该功能将捕获并处理每个组件中的状态更改事件(当某些组件中的一般状态数据发生更改时)。

链接到项目

通常,为了跟踪组件中的数据更改,将创建直接连接,即我们要么在Update方法中检查数据是否在那里已更改,


通过Update方法进行预帧数据验证

或者我们订阅了一个非常特定的事件,该事件在“跟踪”组件中被独立调用,然后进行后续处理。


订阅组件中的事件并对其进行处理

这种方法有很多缺点,大多数缺点已在上一篇文章中进行了介绍。 这些缺点的主要原因是强大的一致性和复杂的维护(支持,开发项目和重构的能力)。

创建状态通知解决方案


现在,您已经有了一个系统,可以放松组件之间的连接以及在组件之间创建邮件的方式,您可以摆脱通常情况下对值的手动检查,如下所示:


一般状态变更通知方案

在上一篇文章中描述的实现中,数据在SharedState组件的索引器中的一个位置更改,因此控制它们的更改非常简单


一般情况下的索引器

在索引器的设置器中,我们分配状态值。

现在,对于SharedState组件,您需要添加对SharedEvents的依赖关系,因为我将使用它来发送通知。 为SharedState添加属性


从SharedEvents添加SharedState依赖项

并创建一个从EventData继承的类以在状态通知中发送数据。 它将包含状态中的参数名称及其新值


添加一个包含有关常规状态更改信息的类

现在,您需要添加一个指向SharedEvents的链接,从SharedState组件中的游戏对象获取它


在SharedState组件中获取SharedEvents

现在,我们将更改索引器的设置器,以便每次状态更改时,都会创建一个名称为“ sharedstatechanged”的通知,并传递一个包含有关更改的所有数据的对象


更改索引器设置器

现在,仍然需要订阅组件中的更改,更改另一个组件中的数据并检查其工作方式。

假设SecondComponent更改状态,例如“ somedata”参数,并且FirstComponent组件通过订阅通知来监视状态更改

SecondComponent中,我们称参数更改


变更资料通话

现在,在FirstComponent方法中, 我们添加一个处理程序并将有关常规状态更改的信息打印到控制台


常规状态更改事件处理

现在,如果您开始游戏,则在SecondComponent中更改常规状态后,在FirstComponent组件中,我们将收到一条通知,并将数据输出到控制台



现在,这可以工作了,您可以进行一些重构,并使代码更加方便。 为此,您需要将一般状态更改通知的预订转移到SharedStateComponent基类,并创建一个抽象方法,通过实现该方法,每个组件将自行决定是否处理其中的状态更改。

将订阅转移到SharedStateComponent


订阅基类中的一般状态更改通知

添加一个抽象方法并在事件处理程序中调用它


添加抽象方法来处理子类中的事件

现在,在FirstComponentSecondComponent的每个子组件中您需要实现此方法并处理其中的一般状态更改。 但是我们将像以前一样将其打印到控制台


在FirstComponent和SecondComponent组件中实现抽象方法

现在,当我们开始游戏时,我们将在控制台中看到两个组件中的2个条目。



重要!


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

Source: https://habr.com/ru/post/zh-CN438628/


All Articles