Skip to content

侦测其他实体

本页面镜像自
BedrockWiki

根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。

当需要让实体在附近存在其他实体时触发事件,本文将详细介绍多种已知实现方式。

minecraft:entity_sensor

这是最基础的侦测方式。主要限制是只能接收单一条目,且检测实体退出范围较困难。作为实体组件,可直接植入实体行为文件并配置Minecraft过滤器:

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" //条件满足时触发的事件
}

/execute 命令

使用1.19.50版本新增的/execute命令,可在附近存在实体时执行指令。以下示例使猪在检测到玩家时发出"oink oink"声(可自定义事件):

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"
                ]
            }
        }
    }
}

首个动画用于检测实体存在,第二个检测实体离开。可通过/event命令添加虚拟组件或更新实体属性

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"]
                }
            }
        }
    }
}
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"]
}

Molang、动画与动画控制器

使用for_each函数配合q.get_nearby_entitiesq.get_nearby_entities_except_self可更高效检测实体(实验性功能),能更好处理实体离开的情况。

json
{
    "format_version": "1.10.0",
    "animations": {
        "animation.pig.find_player": {
            "animation_length": 0.05,
            "loop": true,
            "timeline": {
                "0": [
                    "v.x = 0.0; for_each(t.player, q.get_nearby_entities_except_self(16, 'minecraft:player'), { v.x = v.x + 1; }); return v.x > 0.0;"
                ]
            }
        }
    }
}

若要检测具备特定Molang属性的实体:

json
{
    "format_version": "1.10.0",
    "animations": {
        "animation.pig.find_player": {
            "animation_length": 0.05,
            "loop": true,
            "timeline": {
                "0": [
                    "v.x = 0.0; for_each(t.player, q.get_nearby_entities_except_self(2, 'minecraft:player'), { v.x = v.x + (t.player -> q.is_sheared); }); return v.x > 0.0;"
                ]
            }
        }
    }
}
json
{
    "format_version": "1.10.0",
    "animation_controllers": {
        "controller.animation.pig_find_player": {
            "initial_state": "default",
            "states": {
                "default": {
                    "animations": ["find_player"],
                    "transitions": [{
                        "detected": "v.x > 0"
                    }]
                },
                "detected": {
                    "animations": ["find_player"],
                    "transitions": [{
                        "default": "v.x <= 0"
                    }],
                    "on_entry": ["/say oink oink"]
                }
            }
        }
    }
}
json
"animations": {
    "manage_find_player": "controller.animation.pig_find_player",
    "find_player": "animation.pig.find_player"
},
"scripts": {
    "animate": ["manage_find_player"]
}