检测其他实体
intermediate
您可能想过让您的实体在检测到附近有其他实体时触发事件。本文将详细介绍几种已知的实现方法。
实体传感器组件
这是检测其他实体最基础的方式。主要缺点是只能接受单一配置项,且判断实体是否超出检测范围较为复杂。作为实体组件,您可以直接将其放入实体行为文件中并编辑Minecraft过滤器。示例如下:
BP/entities/my_entity.json#components
json
"minecraft:entity_sensor": {
"sensor_range": 2.5, //检测半径(以方块为单位)
"relative_range": false, //若为true,检测范围会叠加在实体碰撞箱尺寸上
"require_all": true, //若为true,需要所有附近实体都满足过滤条件才会触发事件
"minimum_count": 1, //触发事件所需的最小实体数量(默认为1)
"maximum_count": 4, //触发事件所需的最大实体数量(默认为-1即无限)
"event_filters": { //可放置任意过滤器,本例使用检测玩家的过滤器
"test": "is_family",
"subject": "other",
"value": "player"
},
"event": "event:on_player_detected" //当event_filters中所有条件满足时触发的事件
}使用execute命令
通过/execute命令,可以在其他实体靠近时执行命令。
以下示例将使猪在检测到玩家时发出"oink oink"叫声(您可替换为其他效果)。首先复制这些行为包动画配置:
BP/animations/detection_animation.json
json
{
"format_version": "1.10.0",
"animations": {
"animation.pig.find_player": {
"animation_length": 0.05,
"loop": true,
"timeline": {
"0": [
"/execute as @s if entity @e[type=player, r=4] run event entity @s wiki:player_detected"
]
}
},
"animation.pig.find_no_player": {
"animation_length": 0.05,
"loop": true,
"timeline": {
"0": [
"/execute as @s unless entity @e[type=player, r=4] run event entity @s wiki:no_player_detected"
]
}
}
}
}第一个动画用于检测实体存在,第二个用于检测实体不存在。/execute命令中/event部分的事件可用于添加虚拟组件或更新实体属性。
接着复制此行为包动画控制器。假设您已配置/execute命令中的/event来添加或移除minecraft:is_sheared状态。
BP/animation_controllers/pig_animation_controllers.json
json
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.pig_find_player": {
"initial_state": "default",
"states": {
"default": {
"animations": ["find_player"],
"transitions": [
{
"detected": "q.is_sheared"
}
]
},
"detected": {
"animations": ["find_no_player"],
"transitions": [
{
"default": "!q.is_sheared"
}
],
"on_entry": ["/say oink oink"]
}
}
}
}
}最后将以下代码片段插入猪类实体的行为文件中(确保放在description部分):
BP/entities/my_entity.json#description
json
"animations": {
"manage_find_player": "controller.animation.pig_find_player",
"find_player": "animation.pig.find_player",
"find_no_player": "animation.pig.find_no_player"
},
"scripts": {
"animate": [
"manage_find_player"
]
}





