事件系统¶
在现代逻辑开发中,事件系统已经成为解耦常规手段的主流选择。为此,许多框架都内置了事件系统,以便开发者能够更方便地进行模块之间的解耦与通信。这不仅提升了代码的可维护性,还促进了系统的灵活性和扩展性。
事件参数¶
框架的事件订阅机制基于参数作为条件,只需订阅特定参数,即可接收并处理相应的事件。这使得事件的处理更加灵活和精准,订阅者可以根据实际需求选择感兴趣的参数,从而避免接收不相关的事件,提高了系统的效率和响应速度。
struct事件参数¶
在大多数情况下,使用 struct 作为事件参数已经足够了。选择 struct 作为事件参数的一个显著优点是它不会触发垃圾回收 (GC),因此可以提高程序的性能和减少内存开销,特别是在需要频繁触发事件的场景下。此外,struct 参数通常是值类型,能避免额外的内存分配,从而减少延迟并提高系统的响应速度。
Entity事件参数¶
在极少数情况下,如果需要将现有的 Entity 作为参数发送出去,此时就会用到这个方法。但需要注意的一点是:默认情况下,Entity 会在发送给所有订阅者后调用 Entity.dispose 方法。如果这个 Entity 是从对象池中创建的,它将会在处理完毕后再次回到对象池。
然而,如果你不希望在事件结束后自动执行 dispose 方法,可以通过设置 isDisposed 参数为 false 来阻止这一操作,从而告知事件不要对该 Entity 执行 dispose 方法。这样可以避免 Entity 在事件结束后被销毁或返回对象池,以便在后续逻辑中继续使用。
订阅事件¶
普通事件¶
您需要定义一个类,该类需要继承自 EventSystem。EventSystem 是一个接受泛型参数的系统,这个泛型参数用于指定您要订阅的事件类型和事件参数。通过继承 EventSystem,您可以更灵活地订阅特定事件,并在事件触发时接收相应的事件参数。
订阅普通事件
异步事件¶
您需要定义一个类,该类需要继承自 AsyncEventSystem。AsyncEventSystem 是一个接受泛型参数的系统,这个泛型参数用于指定您要订阅的事件类型和事件参数。通过继承 AsyncEventSystem,您可以更灵活地订阅特定事件,并在事件触发时接收相应的事件参数。
订阅异步事件
以上示例中,我们使用了 struct 类型的事件参数进行订阅。同样地,Entity 类型的事件参数也可以通过类似的方式进行订阅。无论使用哪种类型的事件参数,订阅的步骤和处理方式基本一致,确保了灵活性与一致性。
发布事件¶
在发布事件时,需要使用当前场景(Scene)中的 EventComponent 组件。EventComponent 提供了两个主要的发布事件方法,分别是 Publish 和 PublishAsync。这些方法允许你灵活地在场景中触发和管理事件,从而实现更丰富的交互效果和逻辑控制。
Publish¶
当发布一个普通事件时,如果发布的参数中包含了 Entity 类型,将会额外生成一个 isDisposed 参数。该参数用于指定在事件发送完成后,是否调用该 Entity 的 dispose 方法,以释放相关资源。
Publish
// 发布一个以struct为参数的事件。
scene.EventComponent.Publish(new TestEvent()
{
Age = 1
});
// 发布一个以Entity为参数的事件,默认在事件完成后执行这个Entity的dispose方法。
scene.EventComponent.Publish(new TestEventEntity()
{
Age = 1
});
// 发布一个以Entity为参数的事件,告诉在事件完成后不执行这个Entity的dispose方法。
scene.EventComponent.Publish(new TestEventEntity()
{
Age = 1
},false);
PublishAsync¶
当发布一个异步事件时,如果发布的参数中包含了 Entity 类型,将会额外生成一个 isDisposed 参数。该参数用于指定在事件发送完成后,是否调用该 Entity 的 dispose 方法,以释放相关资源。
Publish
// 发布一个以struct为参数的事件。
scene.EventComponent.PublishAsync(new TestEvent()
{
Age = 1
});
// 发布一个以Entity为参数的事件,默认在事件完成后执行这个Entity的dispose方法。
scene.EventComponent.PublishAsync(new TestEventEntity()
{
Age = 1
});
// 发布一个以Entity为参数的事件,告诉在事件完成后不执行这个Entity的dispose方法。
scene.EventComponent.PublishAsync(new TestEventEntity()
{
Age = 1
},false);