在本指南中,你将制作一只小兽(Critter):一种小巧友善的四足生物,它会四处闲逛、看着你,受伤时还会逃跑。它有 3D 模型、皮肤、刷怪蛋,还能自己在草地上生成。
生物是附加包中最庞大的一类对象,因为它同时存在于两个包中:行为包决定生物做什么,资源包决定它长什么样。
快捷方式:GodCraft
手工制作模型意味着要一个个输入立方体坐标。在 GodCraft 里,你可以直接用手指捏出它的形状。
- 打开工坊,向你的附加包添加一个生物。
- 在 3D 模型编辑器中搭建身体,然后用模型绘制器给它画上皮肤。
- 设置它的生命值、速度和行为,再添加一个刷怪蛋。
- 点击导出。你会得到一个
.mcaddon,下面所有文件都已经写好,包括清单、UUID 和名称。
手动制作
先按照项目设置准备好行为包(BP)和资源包(RP)。我们使用命名空间 myname,所以我们的生物是 myname:critter。
| 文件 | 所在包 | 作用 |
|---|---|---|
entities/critter.json | BP | 生命值、移动和行为 |
spawn_rules/critter.json | BP | 它在哪里自然生成 |
entity/critter.entity.json | RP | 使用哪个模型、皮肤和动画 |
models/entity/critter.geo.json | RP | 3D 模型 |
textures/entity/critter.png | RP | 皮肤 |
texts/en_US.lang | RP | 生物和刷怪蛋的名称 |
第 1 步:行为文件
{
"format_version": "1.26.50",
"minecraft:entity": {
"description": {
"identifier": "myname:critter",
"is_spawnable": true,
"is_summonable": true
},
"components": {
"minecraft:type_family": {
"family": ["critter", "mob"]
},
"minecraft:health": {
"value": 8,
"max": 8
},
"minecraft:physics": {},
"minecraft:collision_box": {
"width": 0.6,
"height": 0.7
},
"minecraft:movement": {
"value": 0.25
},
"minecraft:movement.basic": {},
"minecraft:navigation.walk": {
"avoid_water": true,
"avoid_damage_blocks": true
},
"minecraft:jump.static": {},
"minecraft:pushable_by_entity": {},
"minecraft:pushable_by_block": {},
"minecraft:breathable": {
"total_supply": 15,
"suffocate_time": 0
},
"minecraft:behavior.float": {
"priority": 0
},
"minecraft:behavior.panic": {
"priority": 1,
"speed_multiplier": 1.4
},
"minecraft:behavior.random_stroll": {
"priority": 4,
"speed_multiplier": 0.8
},
"minecraft:behavior.look_at_player": {
"priority": 5,
"look_distance": 6.0,
"probability": 0.02
},
"minecraft:behavior.random_look_around": {
"priority": 6
}
}
}
}description 部分:
identifier是生物的 ID,/summon myname:critter用的就是它。is_spawnable让它可以拥有刷怪蛋并自然生成。is_summonable让你可以对它使用 /summon。
基础组件:
minecraft:type_family给生物加上标签,其他生物和命令可以检查这些标签,比如@e[family=critter]。minecraft:health:value是初始生命值,max是最大生命值。每颗心等于 2 点。minecraft:physics赋予它重力和碰撞。没有它,生物会悬浮在原地。minecraft:collision_box是会与其他东西相撞的隐形盒子,单位是方块。
移动三件套(走路三个都需要):
minecraft:movement设置速度。0.25 大约是牛的速度。minecraft:movement.basic是移动类型:在地面上普通行走。minecraft:navigation.walk让它能在陆地上规划路线。这里它会避开水和火之类的东西。
minecraft:jump.static 让它可以跳上一格高的方块。pushable_by_entity 和 pushable_by_block 组件让玩家和活塞可以推动它,minecraft:breathable 控制它在水下的氧气。
行为和优先级
以 behavior. 开头的组件就是生物的“大脑”。每个都有一个 priority:数字越小越优先。当小兽受伤时,panic(优先级 1)会接管 random_stroll(优先级 4)。
behavior.float:在水中向上游,避免淹死。behavior.panic:受到伤害后加速逃跑。behavior.random_stroll:四处闲逛。behavior.look_at_player:把头转向附近的玩家。behavior.random_look_around:闲着时东张西望。
第 2 步:模型
模型由骨骼组成,每根骨骼包含若干立方体。单位是像素:16 像素等于一个方块。
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.myname.critter",
"texture_width": 64,
"texture_height": 32,
"visible_bounds_width": 2,
"visible_bounds_height": 1.5,
"visible_bounds_offset": [0, 0.5, 0]
},
"bones": [
{
"name": "body",
"pivot": [0, 4, 0],
"cubes": [{ "origin": [-3, 4, -4], "size": [6, 5, 8], "uv": [0, 0] }]
},
{
"name": "head",
"parent": "body",
"pivot": [0, 8, -4],
"cubes": [{ "origin": [-2.5, 6, -8.5], "size": [5, 5, 5], "uv": [0, 13] }]
},
{ "name": "leg0", "parent": "body", "pivot": [-2, 4, 3], "cubes": [{ "origin": [-3, 0, 2], "size": [2, 4, 2], "uv": [28, 0] }] },
{ "name": "leg1", "parent": "body", "pivot": [2, 4, 3], "cubes": [{ "origin": [1, 0, 2], "size": [2, 4, 2], "uv": [28, 0] }] },
{ "name": "leg2", "parent": "body", "pivot": [-2, 4, -3], "cubes": [{ "origin": [-3, 0, -4], "size": [2, 4, 2], "uv": [28, 0] }] },
{ "name": "leg3", "parent": "body", "pivot": [2, 4, -3], "cubes": [{ "origin": [1, 0, -4], "size": [2, 4, 2], "uv": [28, 0] }] }
]
}
]
}骨骼特意命名为 head 和 leg0 到 leg3:原版的行走和注视动画移动的正是这些名字的骨骼,所以我们可以免费复用它们。
第 3 步:皮肤
画一张 64x32 的 PNG,保存为 RP/textures/entity/critter.png。每个立方体的 uv 告诉游戏用图片的哪一部分包裹它。手工绘制 UV 布局很麻烦,这就是模型绘制器能帮上大忙的原因。技巧请看像素纹理。
第 4 步:客户端实体
这个文件把 ID 与模型、皮肤、动画和刷怪蛋连接起来:
{
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": "myname:critter",
"materials": { "default": "entity_alphatest" },
"textures": { "default": "textures/entity/critter" },
"geometry": { "default": "geometry.myname.critter" },
"animations": {
"walk": "animation.quadruped.walk",
"look_at_target": "animation.common.look_at_target"
},
"scripts": {
"animate": [
{ "walk": "query.modified_move_speed" },
"look_at_target"
]
},
"render_controllers": ["controller.render.default"],
"spawn_egg": {
"base_color": "#c98a4b",
"overlay_color": "#5a3a1e"
}
}
}
}materials:entity_alphatest让皮肤中完全透明的像素可以被看穿。render_controllers:controller.render.default是一个原版控制器,它用default纹理和材质绘制default几何体。非常适合只有一种皮肤的生物。scripts.animate:行走动画的播放速度与生物的移动速度一致,用的是 Molang 查询query.modified_move_speed(参见 Molang 查询)。spawn_egg:刷怪蛋的两种颜色。你也可以改用"texture",填写item_texture.json中的短名称。
第 5 步:名称
entity.myname:critter.name=Critter
item.spawn_egg.entity.myname:critter.name=Critter Spawn Egg第 6 步:自然生成(可选)
没有这个文件,生物只能通过刷怪蛋或 /summon 出现。有了它,小兽会在白天的草地上成小群生成:
{
"format_version": "1.8.0",
"minecraft:spawn_rules": {
"description": {
"identifier": "myname:critter",
"population_control": "animal"
},
"conditions": [
{
"minecraft:spawns_on_surface": {},
"minecraft:spawns_on_block_filter": "minecraft:grass_block",
"minecraft:brightness_filter": { "min": 7, "max": 15, "adjust_for_weather": false },
"minecraft:weight": { "default": 8 },
"minecraft:herd": { "min_size": 1, "max_size": 3 },
"minecraft:biome_filter": { "test": "has_biome_tag", "operator": "==", "value": "animal" }
}
]
}
}weight 表示与其他生物相比它被选中的频率。population_control: animal 让它与世界的动物数量上限共享名额,这样它就不会挤满你的世界。
测试你的生物
- 安装两个包(导出与安装)并在一个世界中启用它们。
- 在创造模式物品栏中找到 Critter Spawn Egg,或者运行
/summon myname:critter。 - 看它四处闲逛并看向你。打它一下:它应该会逃跑。
生物隐形或只有影子
游戏找到了行为文件,却没找到模型或皮肤。检查两个包中的 identifier 是否相同、几何体名称是否与 geometry.myname.critter 完全一致,以及纹理路径中是否没有 .png。
- 生物不移动。 移动的三个部分缺一不可:
movement、movement.basic和navigation.walk,另外还需要至少一个行走类行为。 - 生物掉穿地面或悬浮在空中。 检查是否有
minecraft:physics。
更多内容请看故障排除。
下一步
- 在原版实体中研究真实的生物,看看牛和猪是怎么做出来的。
- 从实体组件参考中添加更多行为,比如
behavior.panic。 - 用你的第一个自定义方块为你的生物在世界中安个家。