跳转至

事件

事件(Event)是Minecraft基岩版中连接游戏逻辑各环节的通信机制。事件用于通知特定的状态变化或触发预定的行为响应,广泛应用于实体系统、方块系统、脚本API和动画控制器等领域。

概述

基岩版的数据驱动架构依赖事件系统来实现灵活的运行时行为控制。通过事件,开发者可以在不修改引擎代码的前提下定义当某种条件满足时应执行的操作。事件通常由游戏引擎内部触发,也可以由附加包中的定义或脚本显式触发。

实体事件

实体事件是数据驱动实体系统的核心组成部分。在行为包的实体定义文件中,事件定义在events字段下,每个事件由一个赋命名空间标识符标识。

事件响应

实体事件被触发时,可以执行以下类型的事件响应(Event Response)

  • add:向实体添加指定的组件组。
  • remove:从实体移除指定的组件组。
  • set_property:设置实体属性的值。
  • queue_command:排列一条待执行的命令。
  • trigger:触发另一个事件。
  • sequence:按顺序执行一系列事件响应。
  • randomize:从一组事件响应中随机选择一个执行,每个选项可指定权重。

内置事件

游戏引擎会在特定时机自动触发一些内置事件,常见的包括:

  • minecraft:entity_spawned:实体首次生成时触发。
  • minecraft:entity_born:实体通过繁殖出生时触发。
  • minecraft:entity_transformed:实体发生类型转化时触发。
  • minecraft:on_primeTNT被激活时触发。

开发者可以在实体定义中为这些内置事件编写响应逻辑。

过滤器

过滤器(Filter)是一种用于检测条件的机制,可以在事件触发链路中作为门控。过滤器通过filters字段附加在事件响应、环境感知组件或其他需要条件判断的位置。每个过滤器测试由测试名称、目标、运算符和值组成,多个过滤器可以通过all_ofany_ofnone_of进行逻辑组合。

方块事件

自定义方块可以通过events字段定义方块事件,由方块的触发器(Trigger)组件触发。方块触发器组件在满足条件时触发关联的事件,事件可以执行的响应包括:

  • set_block_state:改变方块的方块状态属性值。
  • set_block_property:旧版写法,功能同上。
  • run_command:执行命令。
  • damage:对实体造成伤害。
  • decrement_stack:减少玩家手持物品的堆叠数量。
  • die:摧毁方块。
  • play_effect:播放粒子特效。
  • play_sound:播放音效。
  • remove_mob_effect:移除实体的状态效果。
  • teleport:传送实体。
  • transform_item:转换物品。

脚本事件

脚本API提供了一套基于发布/订阅模式的事件系统。开发者可以订阅引擎触发的内置事件(如worldInitializeentityHurt等),也可以使用/scriptevent命令和system.afterEvents.scriptEventReceive等接口实现脚本与命令系统之间的事件通信。

脚本事件分为前置事件(Before Event)后置事件(After Event)两类。前置事件在引擎执行相应逻辑之前触发,允许取消操作;后置事件在逻辑执行完毕之后触发,用于响应已经发生的变化。

动画事件

在动画和动画控制器中,可以通过时间轴定义动画事件(Animation Event)。在动画播放到达指定时间点时触发,可以执行命令、触发实体事件或播放音效和粒子特效。动画控制器在状态转移时也可以触发入口事件和退出事件。