动画控制器¶
动画控制器(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):从当前状态转移到目标状态时动画融合的时长。
- 状态变量(State Variable):仅在该状态内声明并供被引用动画使用的变量。
状态机检查当前状态的所有转移条件时,会按定义顺序依次求值。第一个返回非0值的条件会触发状态转移,且每帧最多处理一个转移。因此,转移列表同时表达条件和优先级。
初始状态¶
每个动画控制器必须包含一个名为default的状态作为初始状态(Initial State)。实体创建时,动画控制器从default状态开始运行。也可以通过initial_state字段指定其他名称的初始状态。
服务端动画控制器¶
与客户端动画控制器对应,行为包中也可以定义服务端动画控制器(Server Animation Controller)。服务端动画控制器不控制视觉动画,而是用于管理服务端逻辑的状态机,例如在不同状态下执行不同的命令或触发不同的事件。
服务端动画控制器的文件存放在行为包的animation_controllers/目录中,并在实体的行为定义文件中通过animate数组引用。
动画与动画控制器的挂接¶
在客户端实体定义文件中,animations字段将动画和动画控制器的标识符映射为短名称,animate数组声明在每帧更新时执行的动画和控制器。动画控制器在animate数组中以短名称引用。
类似地,在服务端实体定义文件中,也可以通过animations和animate字段挂接服务端动画和服务端动画控制器。