创建自定义实体
与自定义物品类似,我们也可以创建具有许多与游戏中原版实体相似机制的自定义实体。这些实体功能强大,允许你创建可以繁殖和驯养的动物,或是会攻击所见一切的敌对生物。
在这里,我们将创建一个幽灵实体,它会漂浮、攻击玩家并在死亡时掉落我们的灵质物品。

与物品一样,实体由两部分组成:
- 视觉效果(纹理、名称、动画、音效)
- 行为(移动、攻击)
不同的是,我们需要为实体创建两个主要文件:分别位于BP和RP中的_服务端_文件和_客户端_文件。 我们还需要额外的文件来描述实体的几何形状和动画,这些将在后面的部分中介绍。
首先,我们将介绍如何创建实体并定义其行为。接下来,我们将学习如何添加视觉效果。
实体行为
与物品一样,我们需要一个文件来告诉实体如何行为,该文件将一个标识符指向定义行为的某些组件。这个文件与我们的物品行为文件非常相似,只是组件更多。
我们在BP的BP/entities/文件夹下定义服务端文件。我们将此文件命名为ghost.se.json。这里的.se代表_服务端实体_。这是为了清晰起见,并在样式指南中推荐。
这是文件的基本概述:
{
"format_version": "1.21.70",
"minecraft:entity": {
"description": { ... },
"components": { ... }
}
}与物品一样,我们有格式版本,这里我们有"minecraft:entity",因为这是一个实体文件。从现在开始,我们不会评论格式版本,并建议使用我们给出的示例版本。
对于实体,我们在description下有更多信息:
"description": {
"identifier": "wiki:ghost",
"is_summonable": true,
"is_spawnable": true
}identifier键的作用相同,指向我们正在讨论的实体。 其他键决定了我们可以将实体添加到世界的方式:
is_summonable:是否可以使用/summon命令召唤。is_spawnable:是否可以使用生成蛋或生成规则在世界中生成。
我们建议保持这些设置不变,因为任何更改都会使你在游戏中测试实体变得更加困难。
组件
实体比物品有更多的行为,因此我们需要为其定义更多的组件。 我们将把使用的组件类型分类,然后更详细地查看它们。 有关实体中组件的更多信息,你可以查看我们的页面这里。
状态组件
这些是你通常在每个实体上都会有的组件。它们定义了一些实体的核心属性。
"minecraft:type_family": {
"family": ["ghost", "monster"]
},
"minecraft:health": {
"value": 20,
"max": 20
},
"minecraft:attack": {
"damage": 3
},
"minecraft:movement": {
"value": 0.2
},
"minecraft:collision_box": {
"width": 0.8,
"height": 1.8
},
"minecraft:loot": {
"table": "loot_tables/entities/ghost.json"
},组件minecraft:health、minecraft:attack和minecraft:movement直接设置实体的生命值、攻击伤害和移动速度。实体的碰撞箱是实体与方块或其他实体交互或碰撞的框。这是用minecraft:collision_box定义的,它将框的中心放在实体的中间。
minecraft:type_family为实体添加家族标签。家族标签用于将类似类别的实体分组。例如,monster包括僵尸、骷髅和爬行者。这使我们能够选择所有带有monster标签的实体。
minecraft:loot定义了实体死亡时掉落的战利品表的路径。我们将在后面的部分中使用此路径创建此战利品表。
移动组件
为了使实体能够移动,我们需要定义两件事:_如何_移动和_可以_移动到何处。这分别使用movement和navigation组件定义。
如果你希望你的实体能够移动,你总是需要一个movement和navigation组件。
"minecraft:physics": {},
"minecraft:jump.static": {},
"minecraft:movement.basic": {},
"minecraft:navigation.walk": {
"can_walk": true,
"avoid_sun": true,
"can_pass_doors": true,
"can_open_doors": true
}minecraft:physics用于向你的实体应用重力和碰撞。注意:你不能通过使用组件组来更改此组件。 minecraft:jump.static允许你的实体跳跃以穿越方块。两者几乎用于每个实体。
有几种不同类型的移动组件,允许不同类型的移动,例如海豚使用的minecraft:movement.swim,鹦鹉使用的minecraft:movement.fly和蜜蜂使用的minecraft:movement.hover。 minecraft:movement.basic组件允许我们的实体通过移动方块来行走。为了使我们的实体看起来像是在漂浮,我们将使用我们的几何形状。
导航组件是一个路径查找器,定义了我们允许实体遵循的路径。例如,骷髅会尽量避免在阳光下行走,因此它们的路径阻止它们采取会使它们暴露在阳光下的路径。此外,鹦鹉可以飞行,因此它们可以像行走的生物一样在空中路径。
这些组件有许多不同的设置,允许有趣的路径。我们选择的设置让我们的幽灵在地面上行走,避免踏入阳光,穿过门口并打开门。
行为组件
虽然我们已经定义了实体_如何_做事情,但我们还没有定义_何时_或_做什么_。这就是.behavior组件的作用。这些组件定义了我们的实体将执行的具体动作。 例如,村民会尝试繁殖,因此他们有minecraft:behavior.breed组件,驯服的狼跟随它们的主人,因此他们有minecraft:behavior.follow_owner组件。
我们希望我们的幽灵能够闲逛和环顾四周,在附近时瞄准玩家,然后攻击他们。以下是我们使用的组件:
// 允许随机移动和环顾四周
"minecraft:behavior.random_stroll": {...},
"minecraft:behavior.random_look_around": {...},
"minecraft:behavior.look_at_player": {...},
// 允许瞄准
"minecraft:behavior.hurt_by_target": {...},
"minecraft:behavior.nearest_attackable_target": {...},
// 允许攻击
"minecraft:behavior.delayed_attack": {...}第一个组件minecraft:behavior.random_stroll允许我们的实体定期选择一个附近的随机点进行路径查找。这个路径是由我们的navigation组件创建的,然后移动类型由我们的movement组件定义。
接下来的两个组件允许我们的实体随机环顾四周,并在范围内时看向玩家。
对于攻击,为了使我们的实体能够攻击,它需要一个target。行为minecraft:behavior.hurt_by_target和minecraft:behavior.nearest_attackable_target将使实体瞄准任何伤害它的实体,并瞄准范围内最近的敌人。
最后,minecraft:behavior.delayed_attack是我们的实体实际攻击其目标的方式。
这些行为中的每一个都有进一步的设置来调整我们想要的确切行为。
"minecraft:behavior.random_stroll": {
"priority": 6,
"speed_multiplier": 1
},
"minecraft:behavior.random_look_around": {
"priority": 7
},
"minecraft:behavior.look_at_player": {
"priority": 7,
"look_distance": 6,
"probability": 0.02
},
"minecraft:behavior.hurt_by_target": {
"priority": 1
},
"minecraft:behavior.nearest_attackable_target": {
"priority": 2,
"within_radius": 25,
"reselect_targets": true,
"entity_types": [
{
"filters": {
"any_of": [
{
"test": "is_family",
"subject": "other",
"value": "player"
}
]
},
"max_dist": 35
}
]
},
"minecraft:behavior.delayed_attack": {
"priority": 0,
"attack_once": false,
"track_target": true,
"require_complete_path": false,
"random_stop_interval": 0,
"reach_multiplier": 1.5,
"speed_multiplier": 1,
"attack_duration": 0.75,
"hit_delay_pct": 0.5
}有关这些选项的更多详细信息,你可以在官方文档bedrock.dev上阅读。
优先级
所有行为都包含一个"priority"字段。此字段用于决定当多个行为可以运行时运行哪一个。
当实体选择要做的事情时,它会从最低优先级到最高优先级搜索所有行为,并选择它可以执行的第一个行为。因此,你需要使重要的行为(如minecraft:behavior.nearest_attackable_target)的优先级低于行为(如minecraft:behavior.look_at_player)。如果look_at_player行为的优先级较低,当玩家靠近时,它将始终首先运行此行为,实体将永远不会攻击。
一般来说,重要的行为的优先级为0或1。
完整的实体服务端文件
完整的ghost.se.json
{
"format_version": "1.21.70",
"minecraft:entity": {
"description": {
"identifier": "wiki:ghost",
"is_summonable": true,
"is_spawnable": true
},
"components": {
"minecraft:type_family": {
"family": ["ghost", "monster"]
},
"minecraft:health": {
"value": 20,
"max": 20
},
"minecraft:attack": {
"damage": 3
},
"minecraft:movement": {
"value": 0.2
},
"minecraft:collision_box": {
"width": 0.8,
"height": 1.8
},
"minecraft:loot": {
"table": "loot_tables/entities/ghost.json"
},
"minecraft:physics": {},
"minecraft:jump.static": {},
"minecraft:movement.basic": {},
"minecraft:navigation.walk": {
"can_walk": true,
"avoid_sun": true,
"can_pass_doors": true,
"can_open_doors": true
},
"minecraft:behavior.random_stroll": {
"priority": 6,
"speed_multiplier": 1
},
"minecraft:behavior.random_look_around": {
"priority": 7
},
"minecraft:behavior.look_at_player": {
"priority": 7,
"look_distance": 6,
"probability": 0.02
},
"minecraft:behavior.hurt_by_target": {
"priority": 1
},
"minecraft:behavior.nearest_attackable_target": {
"priority": 2,
"within_radius": 25,
"reselect_targets": true,
"entity_types": [
{
"filters": {
"any_of": [
{
"test": "is_family",
"subject": "other",
"value": "player"
}
]
},
"max_dist": 35
}
]
},
"minecraft:behavior.delayed_attack": {
"priority": 0,
"attack_once": false,
"track_target": true,
"require_complete_path": false,
"random_stop_interval": 0,
"reach_multiplier": 1.5,
"speed_multiplier": 1,
"attack_duration": 0.75,
"hit_delay_pct": 0.5
}
}
}
}这样我们就完成了实体行为文件。
更复杂的实体还可以有不同的_状态_,它们会根据所处的状态而表现不同。例如,一只野生的狼会自由走动,但一旦被驯服,它就会跟随玩家。一个_事件_(被驯服)导致狼改变_状态_。这个功能允许我们创建动态实体,可以在不同事件发生时执行不同的动作。你可以在我们的指南这里了解更多。
如果你打开你的世界并尝试使用/summon wiki:ghost召唤你的实体,它应该会像我们预期的那样行为,但地面上只会有一个影子。你可能还会看到它的名称是一个翻译键,类似于我们的物品发生的情况。
接下来,我们将学习如何创建我们的资源或客户端文件,以及如何分配我们的纹理、几何形状和动画。
实体资源
为实体应用视觉效果与物品非常不同。由于有更多的部分,我们有一个单独的文件专门用于定义资源。 这被称为实体_客户端文件_,我们将其命名为ghost.ce.json。这些文件放在RP/entity/文件夹中。
在本节中,我们将使用为我们的幽灵实体创建的示例资源来演示如何将它们添加到实体中。在指南的下一部分中,我们将解释如何使用Blockbench(一个专门的3D编辑器)来创建你自己的实体几何形状和动画。
模型
实体的“模型”是实体的形状,也称为“几何形状”。这描述了实体的形状,比如猪是一个有四条腿和一个头的盒子,而鸡有两条腿、一个头和翅膀。几何形状以JSON文件的形式存储在RP/models/entity/中,我们的文件将命名为ghost.geo.json。
这个文件是由Blockbench自动为我们生成的,因此不需要手动学习其语法。因此,我们在查看文件时不会详细介绍。它存储了模型中每个方块的数据,如大小、位置和旋转。
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.ghost",
"texture_width": 64,
"texture_height": 64,
"visible_bounds_width": 3,
"visible_bounds_height": 3.5,
"visible_bounds_offset": [0, 1.25, 0]
},
"bones": [
{ "name": "root", "pivot": [0, 3, 0] },
{
"name": "body",
"parent": "root",
"pivot": [0, 4.625, 0],
"cubes": [
{
"origin": [-4, 3, -4],
"size": [8, 13, 8],
"uv": [0, 20]
}
]
},
{
"name": "leftArm",
"parent": "body",
"pivot": [4.6, 15.5, 0.5],
"cubes": [
{
"origin": [4.1, 7, -1],
"size": [3, 9, 3],
"uv": [32, 32]
}
]
},
{
"name": "rightArm",
"parent": "body",
"pivot": [-4.5, 15.5, 0.5],
"cubes": [
{
"origin": [-7.1, 7, -1],
"size": [3, 9, 3],
"uv": [32, 20]
}
]
},
{
"name": "head",
"parent": "body",
"pivot": [0, 16, 0],
"cubes": [
{
"origin": [-5, 16, -5],
"size": [10, 10, 10],
"uv": [0, 0]
}
]
}
]
}
]
}我们需要的重要信息是identifier,我们将使用它来引用我们的几何文件,这里是geometry.ghost。
纹理
我们的实体现在有了形状,但它还需要一个纹理。这个纹理也可以在Blockbench中创建,只是一个.png文件。
RP/textures/entity/ghost.png

你可能还记得,当我们制作物品时,我们为纹理分配了一个短名称以便以后引用。我们将在实体文件中为实体做类似的事情,因此请确保你保留纹理的文件路径。
动画
动画允许我们的实体更有生命力并以不同的方式移动。我们可以为实体设置任意数量的动画,还可以使用_动画控制器_在不同的时间触发它们,我们将在下一节中介绍。
根据你的实体,你可能需要不同的动画














