Skip to content

事件系统

在现代逻辑开发中,事件系统已经成为解耦常规手段的主流选择。为此,许多框架都内置了事件系统,以便开发者能够更方便地进行模块之间的解耦与通信。这不仅提升了代码的可维护性,还促进了系统的灵活性和扩展性。

事件参数

框架的事件订阅机制基于参数作为条件,只需订阅特定参数,即可接收并处理相应的事件。这使得事件的处理更加灵活和精准,订阅者可以根据实际需求选择感兴趣的参数,从而避免接收不相关的事件,提高了系统的效率和响应速度。

struct事件参数

在大多数情况下,使用 struct 作为事件参数已经足够了。选择 struct 作为事件参数的一个显著优点是它不会触发垃圾回收 (GC),因此可以提高程序的性能和减少内存开销,特别是在需要频繁触发事件的场景下。此外,struct 参数通常是值类型,能避免额外的内存分配,从而减少延迟并提高系统的响应速度。

struct事件参数

public struct TestEvent
{
   public int Age;
}

Entity事件参数

在极少数情况下,如果需要将现有的 Entity 作为参数发送出去,此时就会用到这个方法。但需要注意的一点是:默认情况下,Entity 会在发送给所有订阅者后调用 Entity.dispose 方法。如果这个 Entity 是从对象池中创建的,它将会在处理完毕后再次回到对象池。

然而,如果你不希望在事件结束后自动执行 dispose 方法,可以通过设置 isDisposed 参数为 false 来阻止这一操作,从而告知事件不要对该 Entity 执行 dispose 方法。这样可以避免 Entity 在事件结束后被销毁或返回对象池,以便在后续逻辑中继续使用。

Entity事件参数

public class TestEventEntity : Entity
{
   public int Age;
}

订阅事件

普通事件

您需要定义一个类,该类需要继承自 EventSystem。EventSystem 是一个接受泛型参数的系统,这个泛型参数用于指定您要订阅的事件类型和事件参数。通过继承 EventSystem,您可以更灵活地订阅特定事件,并在事件触发时接收相应的事件参数。

订阅普通事件

public class OnTestEvent : EventSystem<TestEvent>
{
   public override void Handler(TestEvent self)
   {
       Log.Debug($"接收到TestEvent事件{self.Age}");
   }
}

异步事件

您需要定义一个类,该类需要继承自 AsyncEventSystem。AsyncEventSystem 是一个接受泛型参数的系统,这个泛型参数用于指定您要订阅的事件类型和事件参数。通过继承 AsyncEventSystem,您可以更灵活地订阅特定事件,并在事件触发时接收相应的事件参数。

订阅异步事件

public class OnTestEventAsync : AsyncEventSystem<TestEvent>
{
   public override async FTask Handler(TestEvent self)
   {
       Log.Debug($"接收到TestEvent 异步事件{self.Age}");
       await FTask.CompletedTask;
   }
}

以上示例中,我们使用了 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);