实体计时器
本页面镜像自 BedrockWiki
根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。
基于时间的交互是地图制作的超实用工具。本文旨在提供一份详尽的指南,详解多种创建计时器的方法。为方便阅读,本页将分为两大部分:组件计时器和动画计时器。每种方式都有其独特优劣,我们将在对应章节详细探讨。
你可能也会对计分板计时器感兴趣。
基于组件的计时器
组件计时器通过行为包的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, //1/56概率触发稀有事件
"add": {"component_groups":["wiki:my_event"]}
},
{
"weight": 5, //5/56概率触发常见事件
"add": {"component_groups":["wiki:my_more_frequent_event"]}
},
{
"weight": 50 //50/56概率无事件触发
}
]
}
minecraft:environment_sensor组件
当结合hourly_clock_time
或clock_time
筛选器时,minecraft:environment_sensor可用于游戏内时间触发事件。
示例(每日开始800tick后触发事件):
"minecraft:environment_sensor": {
"triggers": [{
"filters": {
"test": "hourly_clock_time",
"operator": "=",
"value": 800
},
"event": "wiki:my_daily_event"
}]
}
minecraft:ageable组件
当行为包未占用miinecraft: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.hide
minecraft:behavior.celebrate
基于动画的计时器
行为包动画是实现定时事件的强力工具。其优势在于理论上可创造无限计时器,但存在重载实体时重置的局限(玩家退出世界或区块卸载后重新加载会重置计时器)。
动画在行为包中的运作方式与资源包不同,建议通过官方文档或wiki其他页面了解基本机制。
基础动画计时
通过动画控制器或直接执行时间线指令,可以实现精确时序触发:
{
"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
}
}
}
随机间隔实现
通过动画控制器模拟minecraft:timer
的随机区间功能。示例:实体被剪毛后2-7秒随机触发事件。
"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 随机计时结束"
]
}
}
}
"animation.shanewolf.random_interval": {
"animation_length": 100
}
实现逻辑:进入激活状态时生成2-7秒随机数变量,动画播放时间超过变量值时退出状态。
注意事项:
- 动画总时长需大于最大可能值
- 使用
math.floor(math.random(a, b.99))
可生成整数结果 - 收尾指令写入on_exit事件
权重选择实现
通过动画控制器模拟权重时间选择功能。示例:带电实体30%概率2秒、60%概率5秒、10%概率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随机数变量,通过多个状态切换条件实现权重分段检查。
注意事项:
- 时间段需从小到大排列
- 通过权重累加值划分概率区间
- 按规范处理收尾事件
希望本指南能帮助你更好地掌握基岩版的时间管理技巧!如果你有其他巧妙的时间事件实现方法,欢迎参与wiki编辑!