Files
netease-modsdk-wiki/docs/wiki/entities/detecting-other-entities.md
2025-03-20 11:52:46 +08:00

200 lines
5.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 侦测其他实体
category: 巧思案例
tags:
- 中级
mentions:
- ANightDazingZoroark
- SmokeyStack
- MedicalJewel105
- SirLich
- Luthorius
- TheItsNameless
---
# 侦测其他实体
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
当需要让实体在附近存在其他实体时触发事件,本文将详细介绍多种已知实现方式。
## minecraft:entity_sensor
这是最基础的侦测方式。主要限制是只能接收单一条目且检测实体退出范围较困难。作为实体组件可直接植入实体行为文件并配置Minecraft过滤器
::: code-group
```json [BP/entities/my_entity.json#components]
"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"声(可自定义事件):
::: code-group
```json [BP/animations/detection_animation.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`命令添加[虚拟组件](/wiki/entities/dummy-components)或更新[实体属性](https://learn.microsoft.com/zh-cn/minecraft/creator/documents/introductiontoentityproperties)。
::: code-group
```json [BP/animation_controllers/pig_animation_controllers.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"]
}
}
}
}
}
```
:::
::: code-group
```json [BP/entities/my_entity.json#description]
"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_entities`或`q.get_nearby_entities_except_self`可更高效检测实体(实验性功能),能更好处理实体离开的情况。
::: code-group
```json [BP/animations/detection_animation.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属性的实体
::: code-group
```json [BP/animations/detection_animation.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;"
]
}
}
}
}
```
:::
::: code-group
```json [BP/animation_controllers/pig_animation_controllers.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"]
}
}
}
}
}
```
:::
::: code-group
```json [BP/entities/my_entity.json#description]
"animations": {
"manage_find_player": "controller.animation.pig_find_player",
"find_player": "animation.pig.find_player"
},
"scripts": {
"animate": ["manage_find_player"]
}
```
:::