--- title: 实体计时器 category: 巧思案例 tags: - 中级 mentions: - SirLich - Joelant05 - MedicalJewel105 - aexer0e - Justash01 - TheItsNameless - zheaEvyline --- # 实体计时器 基于时间的交互是地图制作的超实用工具。本文旨在提供一份详尽的指南,详解多种创建计时器的方法。为方便阅读,本页将分为两大部分:组件计时器和动画计时器。每种方式都有其独特优劣,我们将在对应章节详细探讨。 你可能也会对[计分板计时器](/wiki/commands/scoreboard-timers)感兴趣。 ## 基于组件的计时器 组件计时器通过行为包的`entity.json`文件实现。其最大优点是实体重载时仍能保持计时状态,但受限于可用的计时组件数量(重复组件会互相覆盖,意味着无法通过`minecraft:timer`组件创建多个独立计时器)。 ### minecraft:timer组件 这是最简单却最高效的延时触发事件组件。[minecraft:timer](https://bedrock.dev/docs/1.14.0.0/1.14.30.2/Entities#minecraft:timer)提供三种主要时间设定方式: - **精确计时**:固定时间后触发事件(例如3.4秒) - **随机区间**:在指定时间区间内随机触发(例如3到5秒之间) - **权重随机选择**:定义多组时间选项配比权重,随机选择其中一个时间触发(例如20%概率5秒触发,80%概率20秒触发) 在官方行为包中,该组件被广泛应用。例如: - 海豚在陆地超过20秒后会脱水 - 蜜蜂在蜇人后10-60秒随机死亡 - 流浪商人停留时间为2400秒或3600秒 基础示例(5.6秒后触发事件): ::: code-group ```json [实体组件] "minecraft:timer": { "time": 5.6, "time_down_event": { "event": "wiki:my_event" } } ``` ::: 进阶示例(使用权重系统随机延时触发): ::: code-group ```json [实体组件] "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`参数实现多样效果。这里通过权重控制事件触发频率: ::: code-group ```json [事件配置] "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](https://bedrock.dev/docs/stable/Entities#minecraft:environment_sensor)可用于游戏内时间触发事件。 示例(每日开始800tick后触发事件): ::: code-group ```json [实体组件] "minecraft:environment_sensor": { "triggers": [{ "filters": { "test": "hourly_clock_time", "operator": "=", "value": 800 }, "event": "wiki:my_daily_event" }] } ``` ::: ### minecraft:ageable组件 当行为包未占用[miinecraft:ageable](https://bedrock.dev/docs/stable/Entities#minecraft:ageable)时,可配合`minecraft:is_baby`组件实现计时功能。 示例(4秒后触发事件): ::: code-group ```json [实体组件] "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其他页面了解基本机制。 ### 基础动画计时 通过动画控制器或直接执行时间线指令,可以实现精确时序触发: ::: code-group ```json [动画定义] { "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秒随机触发事件。 ::: code-group ```json [动画控制器] "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 随机计时结束" ] } } } ``` ::: ::: code-group ```json [动画定义] "animation.shanewolf.random_interval": { "animation_length": 100 } ``` ::: 实现逻辑:进入激活状态时生成2-7秒随机数变量,动画播放时间超过变量值时退出状态。 注意事项: - 动画总时长需大于最大可能值 - 使用`math.floor(math.random(a, b.99))`可生成整数结果 - 收尾指令写入on_exit事件 ### 权重选择实现 通过动画控制器模拟权重时间选择功能。示例:带电实体30%概率2秒、60%概率5秒、10%概率9秒触发事件。 ::: code-group ```json [动画控制器] "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编辑](/contribute)!