实体计时器
基于时间的交互机制是地图制作中极其有用的工具。本文旨在全面介绍各种计时器的实现方法。为方便阅读,本文将分为两大主要部分:基于组件的计时器和基于动画的计时器。每种方法都有其独特的优缺点,我们将在各自章节中详细说明。 您可能还会对计分板计时器感兴趣。
基于组件的计时器
这类计时器通过行为包的entity.json文件实现。其最大优势在于实体重载后仍能保持计时状态,但受限于计时组件的数量限制(重复组件会相互覆盖,这意味着无法使用多个minecraft:timer组件来创建多个计时器)。
minecraft:timer组件
这是最简单却最有效的计时组件,能在指定时间后触发事件。minecraft:timer组件提供三种时间定义方式:
- 精确计时:设定固定时间后触发事件(例如3.4秒)
- 随机区间:设定时间范围,事件将在该区间内随机时刻触发(例如3到5秒之间)
- 加权随机选择:定义多个时间点并分配权重,系统将根据权重选择触发时刻(例如20%概率在5秒触发,80%概率在20秒触发)
在原版行为包中,该组件被广泛应用。例如:
- 海豚在陆地上20秒后会脱水死亡
- 蜜蜂在蜇人后10至60秒内死亡
- 流浪商人只会停留2400或3600秒
基础示例(5.6秒后触发事件):
"minecraft:timer": {
"time": 5.6,
"time_down_event": {
"event": "wiki:my_event"
}
}复杂示例(使用加权值实现随机延迟):
"minecraft:timer": {
"looping": false, //true表示每次执行后都触发事件,false表示仅触发一次
"random_time_choices": [
{"weight": 25, "value": 0.5}, //0.5秒延迟
{"weight": 25, "value": 10}, //10秒延迟
{"weight": 25, "value": 30}, //30秒延迟
{"weight": 25, "value": 120} //2分钟延迟
],
"time_down_event": {
"event": "wiki:event",
"target": "self"
}
}高效利用技巧:通过单个循环执行的minecraft:timer组件配合事件中的randomize参数,可以在每次计时器触发时(或按设定频率)处理不同事件。权重值决定了各事件的触发频率,这样能最大化单个计时器组件的效用。
"wiki:do_event": {
"randomize": [
{
"weight": 1,
"add": {"component_groups": ["wiki:my_event"]}
},
{
"weight": 5,
"add": {"component_groups": ["wiki:my_more_frequent_event"]}
},
{
"weight": 50 //50%概率不触发任何事件
}
]
}minecraft:environment_sensor组件
结合hourly_clock_time或clock_time过滤器,minecraft:environment_sensor组件可实现基于游戏时间的触发机制。
示例(游戏时间800刻时触发每日事件):
"minecraft:environment_sensor": {
"triggers": [{
"filters": {
"test": "hourly_clock_time",
"operator": "=",
"value": 800
},
"event": "wiki:my_daily_event"
}]
}minecraft:ageable组件
若实体行为中未使用minecraft:ageable组件,可将其作为额外计时器。注意需同时定义minecraft:is_baby组件。
示例(4秒后触发事件):
"minecraft:is_baby": {},
"minecraft:ageable": {
"duration": 4,
"grow_up": {
"event": "wiki:my_other_event",
"target": "self"
}
}其他替代计时方案
查阅文档可发现其他具有"time_down_event"或"duration"参数的组件也能用于计时,例如:
minecraft:angry(需指定目标,时间必须为整数)minecraft.behavior.hideminecraft:behavior.celebrate
基于动画的计时器
行为包动画是触发定时事件的强大工具。其优势在于可创建"无限"数量的计时器,但缺点是在实体重载时(如退出重进世界或区块卸载)会重置计时状态。
(注:若您不熟悉行为包动画机制,建议先查阅官方文档或wiki相关页面)
简单计时器
通过动画控制器或脚本直接触发动画,可以在时间轴(timeline)上按特定时刻执行事件、命令或Molang表达式。
配置示例:
{
"format_version": "1.8.0",
"animations": {
"animation.command.example_timeline": {
"timeline": {
"0.0": "/say 立即触发",
"3.0": "/say 3秒后触发"
},
"animation_length": 3.1
},
"animation.command.example_timeline_2": {
"timeline": {
"100": "/say 100秒后触发",
"0.0": [
"/say 可同时触发多个事件",
"/say 通过时间轴实现"
],
"55.55": "/say 55.55秒后触发"
},
"animation_length": 100.1
}
}
}随机区间实现
通过动画控制器可模拟timer组件的随机区间功能。以下示例展示当实体获得minecraft:is_sheared组件时,在2-7秒随机间隔后触发事件(使用1.10.0版本动画控制器):
"controller.animation.shanewolf.random_interval": {
"initial_state": "inactive",
"states": {
"inactive": {
"transitions": [{"active": "q.is_sheared"}]
},
"active": {
"on_entry": [
"v.random_interval = math.random(2, 7);",
"/say 随机间隔开始"
],
"animations": ["wiki:animate_interval"],
"transitions": [{
"inactive": "q.anim_time >= v.random_interval"
}],
"on_exit": [
"@s wiki:stop_random_interval",
"/say 随机间隔结束"
]
}
}
}实现原理:进入动画状态时生成2-7秒的随机值,当动画时间超过该值时退出状态。
注意事项:
- 动画长度应大于最大时间范围(示例使用100作为模板值)
- 使用math.random(a, b)函数生成区间[a,b]的随机值
- 如需整数结果可使用math.floor(math.random(a, b.99))
- 动画结束时执行的命令应放在on_exit中
加权随机选择实现
以下示例展示当实体获得minecraft:is_charged组件时,按30/60/10的权重比例在2/5/9秒触发事件:
"controller.animation.shanewolf.random_choices": {
"initial_state": "inactive",
"states": {
"inactive": {
"transitions": [{"active": "q.is_powered"}]
},
"active": {
"on_entry": [
"v.random_choices = math.random(0, 100);",
"/say 随机选择开始"
],
"animations": ["wiki:animate_choices"],
"transitions": [
{"inactive": "q.anim_time >= 2.0 && v.random_choices < 30"},
{"inactive": "q.anim_time >= 5.0 && v.random_choices < 90"},
{"inactive": "q.anim_time >= 9.0 && v.random_choices <= 100"}
],
"on_exit": [
"@s wiki:stop_random_choices",
"/say 随机选择结束"
]
}
}
}实现原理:首先生成0-100的随机数,然后按时间从小到大排列检查条件(确保权重计算准确)。
注意事项:
- 时间点应按从小到大顺序排列
- 每个时间的权重=当前上限-前一个上限(例如5秒的权重=90-30=60)
- 结束命令放在on_exit中
希望本文能帮助您更好地理解Minecraft基岩版中的时间处理机制!如上所示,每种方法各有优劣。如果您有其他实用的时间事件实现方案,欢迎参与wiki贡献!






