死亡触发命令¶
"实体死亡时做某事"是实体开发中的常见需求,但也很容易实现错误。本页介绍两种可靠的实现方式。
错误做法¶
以下两种方式不应使用:
- 在实体文件中检测死亡、添加组件,再在动画控制器中检测该组件:实体在动画控制器有机会执行之前就已从世界中移除,命令永远不会执行。
- 从外部检测实体死亡(如计时命令方块):虽然并非完全错误,但代价高昂且容易失效。
使用q.is_alive查询¶
推荐的方法是在行为包动画控制器中使用q.is_alive查询。当实体即将被移除时,q.is_alive会返回假,触发转移到死亡状态,on_entry中的命令会在实体被移除之前执行完毕。
BP/animation_controllers/death.ac.json
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.death": {
"initial_state": "default",
"states": {
"default": {
"transitions": [
{ "dead": "!q.is_alive" }
]
},
"dead": {
"on_entry": ["/say 我死了!"]
}
}
}
}
}
dead状态是终态——没有任何转移,因此命令只会在第一次死亡时执行一次。
对玩家实体的处理¶
玩家实体在死亡后可以复活,因此必须在dead状态中添加转回default状态的转移,确保下一次死亡时状态能够重新触发:
BP/animation_controllers/death.ac.json
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.death": {
"initial_state": "default",
"states": {
"default": {
"transitions": [
{ "dead": "!q.is_alive" }
]
},
"dead": {
"on_entry": ["/say 我死了!"],
"transitions": [
{ "default": "q.is_alive" }
]
}
}
}
}
}
当玩家复活后,q.is_alive重新返回真,控制器转回default状态,等待下次死亡。
使用minecraft:on_death组件¶
对于简单的死亡回调,可以直接在行为包实体文件中使用minecraft:on_death组件,无须构建动画控制器。在components中添加:
在events中定义事件:
提示
使用queue_command方式时,即使实体已死亡,仍然可以对其添加分数和标签。
两种方法各有适用场景:minecraft:on_death更简洁,适合简单的死亡回调;q.is_alive动画控制器方法则更灵活,可以与其他状态机逻辑结合使用。