跳转至

动画控制器

动画控制器(Animation Controller)是Minecraft基岩版中管理实体动画播放逻辑的系统。动画控制器使用状态机(State Machine)模型,通过定义一组状态(State)和状态之间的状态转移(State Transition)条件,来控制实体在不同情况下播放不同的动画。

概述

一个实体通常拥有多个可播放的动画(如待机、行走、攻击等),动画控制器负责根据实体的实时状态决定当前应该播放哪一个动画。动画控制器文件以JSON格式定义,存放在资源包的animation_controllers/目录中。

动画控制器的标识符通常格式为controller.animation.<实体名>.<功能名>,例如controller.animation.zombie.move

状态机

动画控制器的核心是状态机。状态机在任一时刻处于且仅处于一个状态中。每个状态定义了:

  • 动画(Animations):该状态下播放的一个或多个动画。
  • 状态转移(Transitions):离开当前状态的条件列表,每个条件是一个Molang表达式。当某个条件的求值结果为真时,状态机转移到对应的目标状态。
  • 进入和退出命令(On Entry/On Exit):在进入或离开该状态时执行的Molang表达式或命令。
  • 融合时间(Blend Transition):从当前状态转移到目标状态时动画融合的时长。

状态机在每个游戏刻中检查当前状态的所有转移条件,按定义顺序依次求值,第一个为真的条件触发状态转移。

初始状态

每个动画控制器必须包含一个名为default的状态作为初始状态(Initial State)。实体创建时,动画控制器从default状态开始运行。也可以通过initial_state字段指定其他名称的初始状态。

服务端动画控制器

与客户端动画控制器对应,行为包中也可以定义服务端动画控制器(Server Animation Controller)。服务端动画控制器不控制视觉动画,而是用于管理服务端逻辑的状态机,例如在不同状态下执行不同的命令或触发不同的事件。

服务端动画控制器的文件存放在行为包的animation_controllers/目录中,并在实体的行为定义文件中通过animate数组引用。

动画与动画控制器的挂接

在客户端实体定义文件中,animations字段将动画和动画控制器的标识符映射为短名称,animate数组声明在每帧更新时执行的动画和控制器。动画控制器在animate数组中以短名称引用。

类似地,在服务端实体定义文件中,也可以通过animationsanimate字段挂接服务端动画和服务端动画控制器。