Bedrock Wiki
  • QQ
  • 原站
新手入门指南
  • Guide
    • 1. 简介
      指南
    • 2. 附加组件详解
    • 3. 软件与准备工作
    • 4. 项目设置
    • 5. 创建自定义物品
    • 6. 创建自定义实体
    • 7. Blockbench:建模、贴图与动画制作
    • 8. 添加战利品表、生成规则与合成配方
  • Extra
    • a. 理解JSON
    • b. 下载示例包
    • c. 故障排除
      帮助
    • d. 高级清单文件指南
    • e. 格式版本
    • f. Android 项目设置
JSON UI
  • General
    • JSON UI 入门指南
      指南
    • 最佳实践
      指南
  • Tutorials
    • Aseprite 动画
    • 保留标题文本
      中级
    • 修改服务器表单
      中级
    • 字符串与数字转换
      中级
    • 按钮与开关
      新手
    • 添加HUD界面元素
      新手
  • Documentation
    • JSON UI 文档
Meta
  • Style Guide
  • 使用JSON模式(Schemas)
  • 实用链接
  • 版本控制
  • 附加包性能优化
  • Q&A
    • GameTest 问答集 2021/08/06
    • 世界生成问答 2024/11/15
    • 延迟渲染技术预览问答 2024/02/23
    • 方块与物品问答 2024/08/30
    • 脚本与编辑器问答 2023/09/22
NBT
  • General
    • .mcstructure
  • Tutorials
    • 扩展结构限制
      简单
    • 教育版中的实验功能
      简单
  • NBT in Depth
    • NBT 库列表
      专家
    • NBT读取示例
      专家
    • 关于NBT(命名二进制标签)
      专家
世界生成
  • General
    • 世界生成入门
      指南
      实验性
    • 特性类型
      实验性
    • 生物群系
      指南
      实验性
  • Tutorials
    • 特征(Feature)的方块条件
      实验性
    • 生成地表区块
      实验性
    • 生成自定义矿石
      实验性
    • 生成自定义结构
      实验性
    • 高度图噪声地形
      实验性
  • Documentation
    • 生物群系标签
动画控制器
  • 动画控制器入门指南
    指南
  • 实体命令
    中级
  • AFK检测器
  • 将Molang变量转换为计分板数值
  • 死亡指令
  • 重生指令
命令
  • General
    • 命令方块入门指南
    • 函数
    • NBT 命令
    • 坐标系
    • 方块状态
    • 理解目标选择器
    • 记分板操作
  • Commands
    • Execute
      简单
    • Playanimation
    • 伤害
    • 播放音效
  • On Event Systems
    • 玩家首次加入时
    • On Player Join
    • 玩家离开时触发
    • 玩家死亡事件
    • 玩家重生事件系统
    • 首次加载世界时
  • Scoreboard Systems
    • 实体计数器
    • 计分板计时器
    • 比较与获取分数
  • Techniques
    • 执行逻辑门
    • MBE - Max的方块实体
    • FMBE - 创建显示实体的新方法
    • 视线检测
    • 移动状态检测
    • 轨道摄像机
  • Useful Creations
    • 多人位置重排系统
      函数
    • 自定义合成台
      简单
实体
  • General
    • Intro to Entities BP
      指南
      新手
    • 实体资源包入门
      指南
      新手
    • 实体问题排查指南
      帮助
    • NPC对话系统
      中级
    • 实体事件
      新手
    • 实体属性
    • 渲染控制器
      新手
    • 生成规则
  • Tutorials
    • 任意坐标系间的坐标转换(世界、实体、骨骼)
      中级
    • 创建船只
      中级
    • 实体手持物品
      中级
    • 实体攻击机制
      中级
    • 实体睡眠机制
      中级
    • 实体碰撞体
      中级
    • 实体移动
    • 实体计时器
      中级
    • 无敌实体
      新手
    • 村庄机制实现指南
    • 检测其他实体
      中级
    • 生成已驯服的实体
      脚本
      中级
    • 视线检测实体
      中级
    • 禁用队友伤害
      中级
    • 范围效果云入门指南
      中级
    • 虚拟实体
      新手
    • 飞行实体控制
      中级
  • Documentation
    • Vanilla Usage Spawn Rules
    • 原版使用组件
    • 抛射物
    • 虚拟组件
    • 运行时标识符
    • 非生物实体运行时标识符
战利品、配方与交易
  • General
    • 交易行为
  • Documentation
    • 战利品表
    • 交易表
    • 合成配方
    • 物品函数
  • Tutorials
    • 随机化结构战利品
      简单
文档
  • Shared Constructs
  • Molang 查询详解
  • Vanilla Materials
    专家
  • 声音定义
  • 文件类型
  • 材质配置文件说明
    专家
  • 菜单分类
  • 资源包文件夹结构
  • 雾效ID
  • 高级Molang指南
方块
  • General
    • 方块入门指南
      指南
      新手
    • 方块组件
    • Block Tags
    • 方块状态
    • Block Traits
    • 方块排列组合
    • 方块事件
      脚本
    • 方块事件迁移指南
      帮助
    • 方块物品化
      中级
    • 方块问题排查指南
      帮助
  • Visuals
    • 方块剔除
      中级
    • 方块模型
      指南
      新手
      简单
    • 方块着色
      简单
    • 方块纹理动画
      中级
    • 方块纹理变体
      中级
  • Tutorials
    • Precise Interaction
      专家
      脚本
    • Precise Rotation
      专家
      脚本
    • 伪方块
      中级
    • 可旋转方块
    • 应用持续效果
      简单
      脚本
    • 矿石战利品表
      简单
      脚本
    • 规避状态值限制
      专家
  • Vanilla Re-Creations
    • 自定义作物
      中级
      脚本
    • 自定义活板门
      中级
      脚本
    • 自定义玻璃
      新手
      简单
      已弃用
    • 自定义釉面陶瓦
      简单
  • Documentation
    • 原版方块模型
      新手
    • 方块形状
    • 方块格式历史
    • 方块音效
服务器
  • Software
    • Bedrock Server Software
  • Protocols
    • Bedrock Protocol
    • NetherNet 协议
    • RakNet 协议
概念
  • contents.json
  • Molang
    中级
  • Rawtext
  • textures_list.json
  • 命名空间
  • 子包
  • 文本与本地化
  • 着色器
  • 纹理图集
    中级
  • 表情符号与特殊字符
  • 覆盖资源
    中级
  • 音效
    中级
物品
  • General
    • 物品入门指南
      指南
      新手
    • 物品组件
    • 物品标签
    • 物品事件
      脚本
    • Item Event Migration
      帮助
    • 物品问题排查指南
      帮助
  • Tutorials
    • Custom Pottery Sherds
    • 可投掷物品
      中级
    • 生成物品
      中级
    • 自定义武器
      简单
    • 自定义盔甲
    • 自定义食物
      简单
      脚本
    • 通过装备物品执行命令
      实验性
      中级
    • 高分辨率物品
  • Documentation
    • 附魔
    • Numerical Item IDs
    • Vanilla Usage Components
    • 原版物品标识符
      已弃用
    • 可附着物
      新手
    • 物品格式历史记录
视觉效果
  • General
    • 实体视觉效果简介
      指南
    • 基岩版建模指南
    • 动画中的特效
    • 基于数学的动画
      中级
    • 材质
      专家
    • 材质创作
      专家
    • 皮肤包制作指南
    • 自定义死亡动画
      中级
  • Tutorials
    • Glowing Entity Texture
    • 受伤动画
      中级
    • 实体纹理动画
      中级
    • 栓绳位置调整
      简单
    • 玩家几何模型
      新手
    • 移除实体阴影
      中级
    • 重绘生成蛋纹理
      新手
  • Ideas
    • 结构展示技巧
粒子效果
  • General
    • 粒子效果入门
      指南
  • Tutorials
    • 禁用粒子效果
      新手
  • Documentation
    • 原版粒子效果
脚本编写
  • General
    • 脚本编程入门
    • 什么是Script API?
    • API 模块
  • Tutorials
    • GameTests
      实验性
    • 简易聊天命令
      实验性
    • 脚本核心功能
    • 脚本表单
      实验性
    • 脚本请求API
      实验性
    • 阻止方块放置
  • Documentation
    • JavaScript 问题排查指南
    • Script Resources
    • Script Watchdog
      实验性
    • TypeScript
    • 引擎环境
虚拟现实
  • General
    • 启用VR模式
      指南
    • 配置资源包
      专家
  • Tutorials
    • 编辑你的第一个模型
      专家

实体事件

beginner
实体事件
  • 事件响应机制
    • 添加/移除组件组
    • 命令队列
    • 随机化处理
    • 条件序列/过滤器
    • 属性设置
    • 事件触发
  • 事件触发方式
    • 跨实体事件调用
    • 目标选择机制
    • 内置事件类型

实体事件是与组件和组件组并列的行为模块基础要素。它们作为组件组的控制中枢,可以从组件、动画、动画控制器及其他事件中调用。本文将详解如何在当前实体和其他实体中触发事件,以及事件的基本格式。

事件响应机制 ​

通过事件我们可以执行添加/移除组件组等操作,从而在满足特定条件时改变实体行为。之所以称为"事件",是因为它们能在计时器结束、玩家与实体交互或环境变化等情境下被激活。事件触发时会执行所有列出的响应动作。

添加/移除组件组 ​

事件最核心的功能是直接管理组件组。以下名为wiki:ranged_attacker的事件示例,演示了如何添加"attacker"和"ranged"组件组,同时移除"standby"和"melee"组件组:

minecraft:entity > events
json
"wiki:ranged_attacker": {
    "add": {
        "component_groups": [
            "attacker",
            "ranged"
        ]
    },
    "remove":{
        "component_groups": [
            "standby",
            "melee"
        ]
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

TIP

当添加的组件组中包含已有组件时,新添加的组件会覆盖原有组件。

命令队列 ​

将命令加入队列,在当前游戏刻结束时由目标执行:

minecraft:entity > events
json
"wiki:execute_event": {
    "queue_command": {
        "target": "self", // 可选参数,默认为'self'(作用于当前实体)
        "command": "summon pig"
    }
}
1
2
3
4
5
6

可通过数组形式批量添加命令:

minecraft:entity > events
json
"wiki:execute_event": {
    "queue_command": {
        "target": "self",
        "command": [
            "summon pig",
            "say 大家欢迎这只猪!"
        ]
    }
}
1
2
3
4
5
6
7
8
9

随机化处理 ​

通过权重随机系统添加/移除组件组。牛的生成事件就利用此机制,使95%概率生成成年牛(minecraft:cow_adult),5%概率生成幼崽(minecraft:cow_baby):

minecraft:entity > events
json
"minecraft:entity_spawned": {
    "randomize": [
        {
            "weight": 95,
            "add": {
                "component_groups": [
                    "minecraft:cow_adult"
                ]
            }
        },
        {
            "weight": 5,
            "add": {
                "component_groups": [
                    "minecraft:cow_baby"
                ]
            }
        }
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

注意:随机化系统每次只会从选项池中选择一个方案执行。

条件序列/过滤器 ​

通过过滤器实现条件判断。僵尸转化为溺尸的事件中,就根据是否为幼年体来添加不同组件组:

minecraft:entity > events
json
"minecraft:convert_to_drowned": {
    "sequence": [
        {
            "filters": {
                "test": "has_component",
                "operator": "!=",
                "value": "minecraft:is_baby"
            },
            "add": {
                "component_groups": [
                    "minecraft:convert_to_drowned"
                ]
            },
            "remove": {
                "component_groups": [
                    "minecraft:start_drowned_transformation"
                ]
            }
        },
        {
            "filters": {
                "test":"has_component",
                "value":"minecraft:is_baby"
            },
            "add": {
                "component_groups": [
                    "minecraft:convert_to_baby_drowned"
                ]
            },
            "remove": {
                "component_groups": [
                    "minecraft:start_drowned_transformation"
                ]
            }
        }
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

序列中的条目会按顺序逐一评估,符合条件的就会执行。

TIP

序列中的条件判断并非互斥。如上例第一个条目没有过滤器会直接执行,但这不影响后续条目继续检查。

下方是通过序列组合过滤器、随机化和组件组管理的复杂案例:

序列应用实例

当实体被玩家或抛射物击中时,有60%概率无反应,40%概率触发攻击序列。该序列会根据实体生命值(低于半血时增强攻击概率)和玩家距离(远距离时优先远程攻击)动态调整攻击方式。

minecraft:entity > events
json
"wiki:on_hit": {
    "randomize":[
        // 60%概率无反应
        {
            "weight": 60
        },
        // 40%概率触发
        {
            "weight": 40,
            "sequence": [
                // 攻击事件前置条件
                {
                    "trigger": "attack_event"
                },
                // 未受伤状态判断
                {
                    "filters": {
                        "test": "has_component",
                        "operator": "!=",
                        "value": "minecraft:is_sheared"
                    },
                    "sequence": [
                        // 5格内近战判断
                        {
                            "filters": {
                                "test": "distance_to_nearest_player",
                                "operator": "<=",
                                "value": 5.0
                            },
                            "randomize": [
                                {
                                    "weight": 10,
                                    "add": {
                                        "component_groups": [
                                            "explode"
                                        ]
                                    }
                                },
                                {
                                    "weight": 60,
                                    "add": {
                                        "component_groups": [
                                            "attack"
                                        ]
                                    }
                                },
                                {
                                    "weight": 20,
                                    "add": {
                                        "component_groups": [
                                            "range_attack"
                                        ]
                                    }
                                },
                                {
                                    "weight": 10
                                }
                            ]
                        },
                        // 5格外远程判断
                        {
                            "filters": {
                                "all_of": [
                                    {
                                        "test": "distance_to_nearest_player",
                                        "operator": ">",
                                        "value": 5.0
                                    },
                                    {
                                        "test": "has_target",
                                        "operator": "equals",
                                        "value": true
                                    }
                                ]
                            },
                            "randomize": [
                                {
                                    "weight": 30,
                                    "add": {
                                        "component_groups": [
                                            "attack"
                                        ]
                                    }
                                },
                                {
                                    "weight": 60,
                                    "add":{
                                        "component_groups": [
                                            "range_attack"
                                        ]
                                    }
                                },
                                {
                                    "weight": 10
                                }
                            ]
                        }
                    ]
                },
                // 受伤状态处理
                {
                    "filters": {
                        "test": "has_component",
                        "value": "minecraft:is_sheared"
                    },
                    "sequence": [
                        // 强化近战攻击
                        {
                            "filters": {
                                "test": "distance_to_nearest_player",
                                "operator": "<=",
                                "value": 5.0
                            },
                            "randomize": [
                                {
                                    "weight": 20,
                                    "add":{
                                        "component_groups": [
                                            "explode"
                                        ]
                                    }
                                },
                                {
                                    "weight": 60,
                                    "add": {
                                        "component_groups": [
                                            "strong_attack"
                                        ]
                                    }
                                },
                                {
                                    "weight": 20,
                                    "add": {
                                        "component_groups": [
                                            "strong_range_attack"
                                        ]
                                    }
                                }
                            ]
                        },
                        // 强化远程攻击
                        {
                            "filters": {
                                "all_of": [
                                    {
                                        "test": "distance_to_nearest_player",
                                        "operator": ">",
                                        "value": 5.0
                                    },
                                    {
                                        "test": "has_target",
                                        "operator": "equals",
                                        "value": true
                                    }
                                ]
                            },
                            "randomize": [
                                {
                                    "weight": 60,
                                    "add": {
                                        "component_groups": [
                                            "strong_range_attack"
                                        ]
                                    }
                                },
                                {
                                    "weight": 40,
                                    "randomize": [
                                        {
                                            "weight": 30,
                                            "trigger": "rapid_fire"
                                        },
                                        {
                                            "weight": 70,
                                            "add": {
                                                "component_groups": [
                                                    "strong_blast"
                                                ]
                                            }
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190

属性设置 ​

通过Molang表达式设置实体属性值:

WARNING

字符串值需用单引号包裹才会被识别为字符串而非Molang变量。

minecraft:block > events
json
"wiki:change_properties": {
    "set_property": {
        "wiki:boolean_property_example": false,
        "wiki:integer_property_example": "q.property('wiki:integer_property_example') + 1",
        "wiki:string_property_example": "'red'"
    }
}
1
2
3
4
5
6
7

事件触发 ​

通过过滤器条件向指定目标触发其他事件。例如当玩家与猪交互时,触发玩家实体内的wiki:interacted事件:

minecraft:entity > events
json
"wiki:on_interact": {
    "trigger": {
        "filters": {
            "test": "is_family",
            "subject": "self",
            "value": "pig"
        },
        "event": "wiki:interacted",
        "target": "other"
    }
}
1
2
3
4
5
6
7
8
9
10
11

TIP

事件会保留原始组件的实体上下文。例如通过minecraft:interact触发的事件可以获取交互玩家信息,但若无上下文支持的目标参数将失效。

结合序列参数可实现多实体事件触发:

minecraft:entity > events
json
"wiki:on_interact": {
    "sequence": [
        {
            "trigger": {
                "event": "wiki:interacted",
                "target": "other"
            }
        },
        {
            "trigger": {
                "event": "wiki:interacted_with",
                "target": "self"
            }
        }
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

事件触发方式 ​

事件可通过五种主要方式激活:

  1. 组件调用:如僵尸通过环境传感器在水下时触发转化事件
  2. 动画时间轴:行为动画在10秒标记处触发扑击事件
  3. 动画控制器:状态切换时通过on_entry触发奔跑事件
  4. 事件嵌套:如猪灵出生事件中触发幼崽生成事件
  5. 控制台命令:/event entity @e[type=pig] wiki:example

跨实体事件调用 ​

唤魔者通过minecraft:behavior.send_event组件,向16格内蓝色绵羊发送"wololo"事件:

json
"minecraft:behavior.send_event": {
    "priority": 3,
    "event_choices": [
        {
            "min_activation_range": 0.0,
            "max_activation_range": 16.0,
            "cooldown_time": 5.0,
            "cast_duration": 3.0,
            "particle_color": "#FFB38033",
            "weight": 3,
            "filters": {
                "all_of": [
                    {
                        "test": "is_family",
                        "subject": "other",
                        "value": "sheep"
                    },
                    {
                        "test": "is_color",
                        "subject": "other",
                        "value": "blue"
                    }
                ]
            },
            "start_sound_event": "cast.spell",
            "sequence": [
                {
                    "base_delay": 2.0,
                    "event": "wololo",
                    "sound_event": "prepare.wololo"
                }
            ]
        }
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

生成实体时也可附加事件,在转化组件末尾添加<事件名>即可:

BP/entities/zombie.json#component_groups/minecraft:convert_to_drowned
json
"minecraft:transformation": {
    "into": "minecraft:drowned<minecraft:as_adult>",
    "transformation_sound": "convert_to_drowned",
    "drop_equipment": true,
    "delay": {
        "value":15
    }
}
1
2
3
4
5
6
7
8

目标选择机制 ​

卫道士的伤害传感器在死亡时,向击杀者玩家传递"minecraft:gain_bad_omen"事件:

json
"minecraft:damage_sensor": {
    "triggers": {
        "on_damage": {
            "filters": {
                "all_of": [
                    {
                        "test": "has_damage",
                        "value": "fatal"
                    },
                    {
                        "test": "is_family",
                        "subject": "other",
                        "value": "player"
                    }
                ]
            },
            "event": "minecraft:gain_bad_omen",
            "target": "other"
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

内置事件类型 ​

以下事件会在满足条件时自动触发(常规组件组需手动调用):

  • minecraft:entity_spawned:实体生成时(用于初始化组件组)
  • minecraft:entity_born:繁殖产生时
  • minecraft:entity_transformed:实体转化时
  • minecraft:on_prime:引信点燃即将爆炸时

牛的实现案例展示了如何确保生成时必定带有成年或幼年状态:

BP/entities/cow.json#events
json
"events": {
    "minecraft:entity_spawned": {
        "randomize": [
            {
                "weight": 95,
                "add": {
                    "component_groups": ["minecraft:cow_adult"]
                }
            },
            {
                "weight": 5,
                "add": {
                    "component_groups": ["minecraft:cow_baby"]
                }
            }
    ]
    },
    "minecraft:entity_born": {
        "add": {
            "component_groups": ["minecraft:cow_baby"]
        }
    },
    "minecraft:entity_transformed": {
        "add": {
            "component_groups": ["minecraft:cow_adult"]
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

贡献者

编辑 实体事件

Bedrock Wiki by Bedrock OSS ,Translate by 8aka-Team

"Minecraft"是Mojang AB的注册商标。

Bedrock OSS、Bedrock Wiki以及 bedrock.dev 与Microsoft及Mojang AB不存在任何隶属关系。

  • 隐私政策
  • 加入QQ社区
  • 参与贡献指南
  • 访问代码仓库