实体行为简介

在本教程中,您将学习以下内容:

  • 如何创建和使用行为文件来改变实体的行为。
  • 如何使用组件来扩展实体的行为。
  • 如何使用事件根据某些条件修改活动组件。

要求

在开始本教程之前,建议完成以下内容。

简介

《我的世界》基岩版中的行为文件用于自定义实体的行为方式以及与世界的交互方式。 它们是行为包的一部分,但行为包也可以包含其他类型的文件,如函数和战利品表。

行为文件首先与加载项一起被引入,作为自定义原版实体行为方式的一种方式。 创建组件是为了将单个生物的先前硬编码机制分成小的片段,创建者可以使用这些小的片段来自定义实体。 例如,猫和狗使用的驯服机制被转移到 tameable 组件中,这样创建者也可以让其他实体也可以被驯服。

目标是使实体的每一个机制始终都可自定义。

当引入添加实体时,行为文件成为一种使用原版实体的所有组件从头开始创建新实体的方法。

行为文件可通过两种方式使用:

  • 修改原版实体。 由于引入了添加实体,此方法应只用于对原版游戏的小调整,而不是用于附加内容。
  • 创建自定义实体。 行为文件用作自定义实体的基础。

格式概述

实体行为文件保存在行为包的 entities 文件夹中。 游戏加载该文件夹中的所有文件,以便您可以使用子文件夹来管理您的实体。 这些文件使用扩展名 .json。 加载项中的许多文件都使用此扩展名,因此如果您想避免混淆,可以为行为文件使用再次扩展的扩展名 .behavior.json。 对于其他再次扩展的扩展名,请参阅此表

这些文件是用 JSON 编写的,基本结构如下所示:

{
    "format_version": "1.13.0",
    "minecraft:entity": {
        "description": {
            "identifier":"compass:example",
            "is_spawnable":true,
            "is_summonable":true
        },
        "components": {},
        "component_groups": {},
        "events": {}
    }
}

description 标签中,一些基本属性定义了游戏如何注册实体:

参数名称 类型 描述
identifier 字符串 实体的标识符。 如果这是加载项中的自定义实体,则应使用示例中所示的自定义唯一命名空间。
runtime_identifier 字符串 游戏内部使用的标识符。 这可用于从尚未作为组件提供的原版实体继承自定义机制。 每个实体只能指定一个运行时标识符。仅在确实需要时才使用。 如果一个原版实体的机制变成了组件,通过运行时标识符依赖这些机制可能会失去功能。
is_spawnable 布尔值 如果为 true,则该实体的刷怪蛋将添加到创意物品栏中。
is_summonable 布尔值 如果为 true,则可以使用 /summon 命令来召唤实体。
is_experimental 布尔值 如果为 true,则实体可以使用实验功能。 该实体只会在实验世界中工作。 启用此选项时无法提交市场内容。
animations 对象 行为动画或动画控制器的列表。 这些可用于在实体上运行命令或事件。
scripts 对象 脚本的工作方式类似于它们在客户端实体文件中的工作方式,并且可用于播放行为动画。

组件和组件组

组件是可以添加到实体的属性或机制。 添加组件有两种方式:直接添加到 component 标签或使用组件组

  • 添加到基本 component 标签的组件始终处于活动状态,除非通过事件中的组件组移除。
  • 组件组包含一个或多个组件,每个组件默认情况下处于非活动状态,但可以通过事件启用或禁用。 例如,这可用于创建实体的变体,例如 baby(婴儿)。

在此示例中,组件组用于创建实体的 baby 变体。 主要组件部分中定义的组件始终处于活动状态,而 baby 组件组中的组件仅在添加该组时才处于活动状态。

{
    "format_version": "1.13.0",
    "minecraft:entity": {
        "description": {
            "identifier":"compass:example",
            "is_spawnable":true,
            "is_summonable":true
        },
        "components": {
            "minecraft:physics":{}
        },
        "component_groups": {
            "baby": {
               "minecraft:behavior.follow_parent": {},
               "minecraft:is_baby": {}
            }
        },
        "events": {}
    }
}

所有《我的世界》组件都使用 minecraft: 命名空间。

几乎所有的组件都被定义为一个 JSON 对象。 此对象提供了可为大多数组件指定的选项,但有些组件没有选项,如前面的示例所示。

如何学习组件

可用组件的完整列表可在此处找到。

通过查看《我的世界》默认实体的行为文件,您可以了解组件以及在实践中如何使用组件。 最新的默认行为包可在此 URL 中找到:https://aka.ms/behaviorpacktemplate。

备注

组件的工作方式有时会在版本之间发生变化。 因此,如果来自原版实体的组件不适用于您的实体,请检查两个文件是否使用相同的格式版本。 我们鼓励您始终使用最新版本的组件,因为它已经过改进并且会包含修复。

核心组件

组件名称 选项 描述
minecraft:physics has_collision
has_gravity
99% 的自定义实体都需要此组件。 它允许实体留在地面上并以您期望的方式对交互和冲击做出反应。
minecraft:scale value 设置实体的比例。
minecraft:collision_box width height 设置实体的碰撞盒。 只能更改 widthheight。 碰撞盒始终具有一个与世界轴对齐的方形基础。
minecraft:type_family family 设置实体所在的类型系列的列表。 类型系列可以由其他实体进行测试。 例如,测试他们对哪些生物怀有敌意。
minecraft:movement value 设置实体的移动速度。 《我的世界》中大多数动物的常规速度为 0.25。
minecraft:movement.basic 查看文档 允许实体在地面上移动。
minecraft:navigation.walk 查看文档 允许实体在世界中游走。 还有其他类型的导航,比如悬停。
minecraft:is_baby
minecraft:is_ignited
minecraft:is_saddled
minecraft:is_sheared
minecraft:is_tamed
minecraft:is_illager_captain
:--- 这些组件本身不做任何事情,但可以在动画、动画控制器或渲染控制器中查询它们,允许您通过实体行为控制动画和其他视觉效果。
minecraft:variant
minecraft:mark_variant
minecraft:skin_id
value 这些组件的工作方式与上面的类似,但它们不仅可以存储开/关状态,还可以存储整数值。

Priorities(优先级)

选项 priority 可用于所有行为组件(AI 目标)。 0 所有行为组件的最高优先级和默认优先级为 0。 数字越大,优先级越低。 如果实体正忙于进行一个低优先级的行为,当出现了一个高优先级的行为时,该实体将立即切换到更高优先级的行为。

在以下示例中,hurt_by_target 组件具有更高的优先级。 如果实体在漫步时受到攻击,它会立即瞄准攻击者。

"minecraft:behavior.random_stroll": {
    "priority": 4
},
"minecraft:behavior.hurt_by_target": {
    "priority": 1
}

移除组件

当从实体中移除组件组时,组件的效果也将被移除。 在大多数情况下,这不会导致任何问题。 但在某些情况下,重要太多一点是要考虑组件的相互覆盖。 因此,移除组件不会使其返回到该组件的先前状态,也不会使用来自另一个组件组或基础组件的相同组件。 相反,该组件将被完全移除并重置为其默认值。

这是一个示例:假设您有一个实体,在 components 基标签中定义了缩放比例 scale 为 2。 您添加一个带有 scale 组件的 baby 组件组,该组件将缩放比例 scale 设置为 1.5。 这将正确地将缩放比例更新为 1.5。 现在,您再次移除该组件组。 缩放比例现在将重置为 1,而不是恢复为 2。 发生这种情况是因为移除组件组也将完全移除 scale 组件。 比例将重置为默认值 1

有几个组件需要重点考虑:

  • 改变实体的值的组件,如 minecraft:scaleminecraft:collision_boxminecraft:variant
  • 列表组件如 minecraft:interactminecraft:environment_sensor 或 minecraft:damage_sensor minecraft:damage_sensor
  • 您可能希望具有不同状态的任何其他组件,例如 minecraft:rideable(不同的座位数或位置)。

为了避免这种行为,您需要添加一个具有组件更新状态的新组件组。 在缩放比例 scale 示例中,只需为不同的状态使用两个不同的组件组即可,您可以在它们之间切换:

        "components": {
            "minecraft:scale":{
               "value": 2
            }
        },
        "component_groups": {
            "baby": {
               "minecraft:scale": {
                   "value": 1.5
               }
            },
            "adult": {
               "minecraft:scale": {
                   "value": 2
               }
            }
        },
        "events": {
            "set_baby":{
               "remove": {"component_groups": ["adult"]},
               "add": {"component_groups": ["baby"]}
            },
            "set_adult":{
               "remove": {"component_groups": ["baby"]},
               "add": {"component_groups": ["adult"]}
            }
        }

事件

事件用于在实体中添加和移除组件组。 在此示例中,移除了一个旧的组件组,添加了两个新的组件组:

"events": {
    "compass:example_event": {
        "remove": {
            "component_groups": ["compass:group_a"]
        },
        "add": {
            "component_groups": ["compass:group_b","compass:group_c"]
        }
    }
}

事件可以由许多组件触发,例如 minecraft:interactminecraft:environment_sensor、通过行为动画或 summon 命令。 以下命令将在运行上述事件时生成实体。

/summon compass:example_entity ~ ~ ~ compass:example_event

内置事件

《我的世界》中内置了一些事件,当实体在特定条件下生成时运行。

事件名称 描述
minecraft:entity_born 该事件在实体通过繁殖产生时运行。
minecraft:entity_spawned 该事件在实体生成时运行。 请注意,它在手动执行 /summon 时不会运行。
minecraft:entity_transformed 当另一个实体转换为该实体时,该事件将运行。
minecraft:on_prime 该事件在实体被激活并即将爆炸时运行。

随机化器

如果要随机指定将哪个组件组添加到实体,可以使用 randomize 函数。 您指定一个对象数组,每个对象都可以添加和移除组件组。 游戏将随机选择并运行这些对象之一。

或者,您可以向选项添加权重选项以更改每个选项的概率。 所有权重加起来为 100%。 在以下示例中,实体将以 20% (1:4) 的概率生成为 baby,而在其他情况下,不会添加任何组件组:

"events": {
    "minecraft:entity_spawned": {
        "randomize": [
            {
               "weight": 40
            },
            {
               "weight": 10,
               "add": {
                   "component_groups": ["baby"]
               }
            }
        ]
    }
}

序列

有时,您需要在同一事件中接连运行多个事件实例。 例如,您可能希望随机化实体的两个方面,如颜色和标记图案。 在这种情况下,您可以使用序列。 序列的结构类似于随机化器,但列表中的每个项都是按顺序执行的。 序列与过滤器结合使用也非常有用,将在下一节中解释。

序列和随机化器可以无限嵌套。

在此示例中,将在生成实体时添加组 initial。 之后,baby 组件将像上一节一样随机化。

        "events": {
            "minecraft:entity_spawned":{
               "sequence": [
                   {
                       "add": {
                           "component_groups": ["initial"]
                       }
                    },
                   {
                       "randomize": [
                           {
                               "weight": 40
                           },
                           {
                               "weight": 10,
                               "add": {
                                   "component_groups": ["baby"]
                               }
                           }
                       ]
                    }
               ]
            }
        }

过滤器

过滤器通过测试当前实体(交互实体或世界)的特定属性来调节事件或事件的一部分。 过滤器可以在任何事件中使用,但也可以直接在某些组件中使用。

一个事件最多包含五个参数。 参数 testvalue 是必需的,其他是可选的:

测试类型 要测试的属性
value 要测试的值。 测试字符串时可以是字符串,测试数值时可以是数值,也可以是布尔值。
subject 运行测试的实体。 默认情况下为 self,但它也可以针对交互中涉及的其他实体。
operator 比较值的方式。 默认为 equals,但也可以比较大小(数值)或是否不相等。
domain 仅由少数测试使用,提供额外的上下文,例如,has_equipment 测试可测试物品栏的栏位。

备注

实体技术文档提供了过滤器的完整列表以及这些参数如何与它们交互。

事件中过滤器的最简示例可能如下所示:只有当实体具有 event_allowed 标签时才能添加组件组。

"events": {
    "compass:example_event": {
        "filters": {
            "test": "has_tag",
            "value":"event_allowed"
        },
        "add": {
            "component_groups": ["baby"]
        }
    }
}

如果您想使用多个过滤器,您可以使用列表 all_ofany_ofnone_of 对它们进行分组,分别对应所有过滤器、一个过滤器或无过滤器,仅在满足相应条件时成功。 这些列表可以无限嵌套。

在以下示例中,我们将向过滤器添加第二个条件。 仅当实体具有上一个示例中的标签并且距离最近的玩家少于 10 个方块时,该事件才会运行。

"events": {
    "compass:example_event": {
        "filters": {
            "all_of":[
               {"test": "has_tag", "value": "event_allowed"},
               {"test": "distance_to_nearest_player", "operator": "<", "value": 10}
            ]
        },
        "add": {
            "component_groups": ["baby"]
        }
    }
}

下一步内容?

如果您遇到困难或想更好地了解组件的工作原理,可通过原版行为文件查看工作示例。 剖析一个原版实体,并将其应用于不同的实体是一个很好的入门方式。 从末影人获取 minecraft:teleport 组件并将其应用到爬行者上。 让僵尸可供玩家骑乘。 制作爬行者宝宝。

组件系统允许您自定义您的实体做什么以及它如何与世界交互。 如果您想了解有关设计实体外观和移动方式的更多信息,请查看实体建模和动画教程。