This commit is contained in:
boybook
2025-12-01 20:59:16 +08:00
parent 12738a142c
commit 760c2dd9ad
5535 changed files with 21070 additions and 2021 deletions

View File

@@ -0,0 +1,22 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 入门
time: 5分钟
---
# 摘要
在本章中我们将一起开始使用编辑器的**配置****Configuration**)功能来创建基础各种基础玩法。
- 在第一节(*初步了解实体功能配置*)中,我们将了解如何配置一个**实体****Entity**。学习如何设置实体的AI与组件自定义其生成规则。
- 在第二节(*初步了解物品功能配置*)中,我们将一起了解**物品****Item**)的配置,制作武器、盔甲和食物消耗品。
- 在第三节(*初步了解方块功能配置*)中,我们将初步了解如何配置**方块****Block**),自定义刷怪笼和光源。
- 在第四节(*初步了解配方配置*)中,我们将一起再次学习**配方****Recipe**)的配置。
- 在第五节(*初步了解交易表配置*)中,我们将学习如何配置**交易****Trade**)表。
- 在第六节(*初步了解掉落物配置*)中,我们将一起学习如何配置**战利品表****Loot Table*****掉落表***)。此时我们将结合方块配置来制作一个幸运方块。
- 在第七节(*初步了解生成规则配置*)中,我们将了解**生成规则****Spawn Rule**)的配置。
- 在第八节(*初步了解特征配置*)中,我们将初步了解**特征****Feature**,又译**地物**)的配置。
- 在第九节(*初步了解特征生成配置*)中, 我们将一起了解**特征规则****Feature Rule**,又译**地物规则**)的配置。
- 在最后一节(*挑战DIY史莱姆实体*)中,我们将一起自定义一个史莱姆实体,完成本章的回顾。
本章关键词:配置 组件 实体 物品 武器 盔甲 食物 方块 光源 刷怪笼 配方 交易 战利品表 幸运方块 生成规则 地物 地物规则 史莱姆 游泳

View File

@@ -0,0 +1,63 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 高级
time: 15分钟
---
# 初步了解实体功能配置
在本节中,我们将一起初步了解实体功能配置。一起通过实体配置来制作一个**实体****Entity**)。
## 创造一个新的实体
我们已经在前面的章节了解到,要通过我的世界开发工作台中的编辑器创建一个实体,我们需要使用实体配置。而实体配置可以通过**关卡编辑器**的“**资源管理**”窗格的“**新建**”按钮快速进行创建。我们通过该功能来打开实体配置的向导窗口。
![实体向导窗口](./images/6.1_entity_wizard.png)
我们可以看到我们有许多数据模板可以用来选择。如果我们选择了一个数据模板,我们将可以继承该数据模板的所有预先设置的配置,可以在这个配置的基础上进行进一步的修改。如果我们选择了“空“模板,我们便可以从头开始一个实体的配置。这里为了演示方便,我们选择”羊“的模板。创建完毕后,我们在左侧“**配置**”窗格中选中该实体,窗口右侧的”**属性**“窗格中将出现这个实体的属性。
![属性](./images/6.1_entity_property.png)
## 设置实体AI与组件
在属性窗格中,我们可以看到有三个大分类,分别是**配套文件**、**基础属性**和**行为包组件**。
- **配套文件**每种配置其实都是由多个文件构成的比如实体的一个配置就是一个行为包JSON文件、一个资源包JSON文件和语言文件中的涉及到该实体的部分所构成的。这里列出了该配置的配套文件。
- **基础属性**:基础属性是该实体的**描述**部分,通常由标识符、名称等基础属性构成,描述了一个实体的基本性质。你可以通过该分类标题右侧的“+”来添加一个属性。
- **行为包组件**:行为包组件是一个实体的主体组成部分。实体的大部分内容、特性、行为都是在这里定义的。编辑器支持各种**组件**的树状修改,你可以通过该分类标题右侧的“+”来添加一个组件。
为了设置实体的AI和组件我们需要再深入了解一下“**组件****Component**”到底是什么。事实上组件是微软对于实体定义JSON文件中一个对象字段的称呼不同的组件可以用来定义实体不同的性质、功能。在编辑器中我们无需接触到复杂的JSON修改编辑器将JSON解析为了树状的可视化编辑供我们修改同时将组件名进行了翻译。所以我们便可以通过编辑器便捷地增删和修改组件。其中能够控制生物AI的组件被冠以“**行为.**”的前缀。
为了不和“作品组件”中的组件概念冲突,在编辑器的一些地方组件字段及其子字段也被称为**特性**。我们点击“**+**”来添加组件,就可以看到“添加特性”窗口。
![](./images/6.1_add_feature.png)
> **选读:实体的组件**
>
> 往深处看组件也有不同的类型。大部分普通的组件都是用来定义实体所具备的一个“功能”的比如实体的骑乘功能、攻击功能、呼吸功能等。有些组件可以定义一个实体的“AI行为”比如何时闲游、何时看向玩家、何时游泳等这种组件称为**AI意向****AI Goal**),一般有一个`behavior.`(“行为.”)前缀。有些组件定义了一些实体的固有性质,如生命值的高低,被称为**特性****Attribute**);而另一些定义了实体的“能够干什么”的性质,被称为**属性****Property**)。还有一些组件是用于定义实体处于特定的状态时将会触发何种**事件****Event**)的,这些组件被称为**触发器****Trigger**)。
>
> 往高处看,我的世界的组件其实是属于一种被称作**ECS****实体-组件-系统****Entity-Component-System**)的架构,这种架构意味着游戏中每一个基本单元都是一个**实体**(此处为广义的*实体*,比如方块、物品、实体都是一种*实体*),每个实体又由一个或多个**组件**构成。组件中没有任何方法,只有代表实体特性的**数据**。**系统**则仅仅负责处理这些数据仅仅关心拥有某个组件的实体的特性通过组件提供的数据代入系统内置的相关方法更新实体的信息。这种通过ECS系统的组件数据修改游戏的方法被称为**数据驱动****Data-Driven**)式的
我们向我们的“羊实体”中添加一个新的组件,比如`addrider`组件,这个组件可以为羊添加一个骑手。我们在“添加特性”窗口中选中这个组件,点击“**调整**”按钮。可以看到“属性”窗格中已经出现了“添加骑手”的组件。
![](./images/6.1_add_rider.png)
我们点击“添加骑手”右侧的“**+**”按钮,可以看到又弹出了一个 **“添加特性"** 窗口。我们在此添加该组件的`entity_type`字段。该字段用于指定羊的骑手为何种生物。选定并点击“**调整**”按钮,我们可以看到“添加骑手”下面多出了一个“实体类型”。
![](./images/6.1_entity_type.png)
我们可以随意输入一个实体的种类,比如僵尸(`zombie`)。
![](./images/6.1_zombie_rider.png)
此时,我们的实体生成时头顶将骑着一个僵尸,让我们用这个实体配置创建一个实体预设,并放置在关卡编辑器中来查看效果。
![](./images/6.1_zombie_rides_sheep.png)
成功了!我们成功为该实体添加了一个组件,这个组件可以让实体每次生成都附带一个僵尸骑手。
如果我们想为实体添加一个AI我们也是有一样的操作过程。只不过我们要选择那些带有`behavior.`(“行为.”前缀的组件来添加。这些组件可以让生物的行为即AI更加丰富
## 自定义实体的生成规则
我们的自定义实体目前还只是一个独立的实体,如果没有配置对应的生成规则将无法**自然生成****Naturally Spawn**)。所以,我们需要使用生成规则配置来进行生成规则的创建和修改。我们将在第七节中为我们的这只“羊”添加一个生成规则。

View File

@@ -0,0 +1,135 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 进阶
time: 20分钟
---
# 挑战DIY史莱姆实体
在本节中,我们一起自定义一个史莱姆实体。我们都知道,史莱姆是不会在潜入水中自由地游泳的。所以一旦掉进水中,史莱姆只能漂浮在水面上。我们希望只做一种可以潜入水中游泳的史莱姆。
## 制作一个会潜水游泳的史莱姆
### 学会从原版模板包中导入原版资源
为了自定义一个新的史莱姆,我们需要使用原版史莱姆资源。遗憾的是,我们并没有在新建配置中找到史莱姆的数据模板。
![](./images/6.10_no_slime.png)
所以我们需要在原版的资源包和行为包中手动找到史莱姆的资源和行为,并将其手动导入进编辑器中。我们使用下方的链接下载最新的原版资源包和行为包。
| 包类型 | 模板包链接 |
| ------ | ------------------------------------------------------------ |
| 资源包 | [https://aka.ms/resourcepacktemplate](https://aka.ms/resourcepacktemplate) |
| 行为包 | [https://aka.ms/behaviorpacktemplate](https://aka.ms/behaviorpacktemplate) |
正如一个编辑器中的配置会创建一些配套文件一样,我们为了使实体生效,需要手动建立这一系列“配置”文件。一般来说,一个实体需要三个文件来支撑其渲染和行为,分别是**资源包定义文件**、**行为包定义文件**和**模型文件**。但是,由于我们想自定义一个和原版的史莱姆“长相一样”的实体,所以我们可以直接使用原版的史莱姆模型而无需修改。若无需修改,我们无需再在我们的资源包中导入原版的史莱姆几何模型。我们只需要找到并导入:
| 文件 | 位置 |
| ---------- | ------------------------------------------------ |
| 资源包定义 | `Vanilla_Resource_Pack/entity/slime.entity.json` |
| 行为包定义 | `Vanilla_Behavior_Pack/entities/slime.json` |
![](./images/6.10_slime_files.png)
在导入前我们用编辑器将其打开。我们需要修改他们的实体ID否则我们导入的实体将和原版实体“撞车”。
我们将资源包定义文件中的`minecraft:client_entity/description`段落下的`identifier`中的命名空间(即冒号前面的部分)`minecraft`修改为我们自己的命名空间即可,比如此处我修改为了之前我们第一章中便提到过的`tutorial_demo`
![](./images/6.10_client_file.png)
同理我们将行为包定义文件中的`minecraft:entity/description`段落下的`identifier`中的命名空间`minecraft`也修改为同样的名称。
![](./images/6.10_server_file.png)
将两个文件保存后便可以关闭了。不过,为了不和其他开发者制作的模组冲突,我们还建议更改这两个文件的文件名,比如在`slime`前面也加上命名空间。
![](./images/6.10_slime_files_edited.png)
接下来我们将它们导入进编辑器。我们在“资源管理”窗格中找到对应的文件夹。
![](./images/6.10_resource_manager.png)
我们对两个文件夹分别右击并点击“**导入文件**”。
![](./images/6.10_import.png)
定位到我们刚才找到的原版文件,即可进行导入。导入成功后,我们便可以在“配置”窗格看到我们的自定义实体了。
![](./images/6.10_config.png)
我们点击该实体,右侧的“属性”窗格便出现了史莱姆的相关属性和组件。
![](./images/6.10_slime_property.png)
### 添加相关组件
#### 修改运行时ID
为了使我们的史莱姆完全能够继承原版的硬编码行为,我们可以进一步将史莱姆的**运行时ID****Runtime Identifier**)修改为原版的史莱姆。
我们点击“**基础属性**”右侧的“**+**”按钮。选中“**继承生物**”特性。
![](./images/6.10_base_property.png)
![](./images/6.10_runtime_id.png)
选择“史莱姆”作为运行时ID继承的生物。
![](./images/6.10_slime_runtime.png)
这样我们便将该生物没有进行数据驱动的行为也成功设置成了和原版是史莱姆完全一致了。
#### 添加游泳AI意向和游泳导航组件
点击“**行为包组件”**右侧的“**+**”按钮。搜索“swim”即可看到我们想要的行为包组件。
![](./images/6.10_swim_components.png)
我们选中 **`minecraft:behavior.random_swim`**的AI意向该AI意向能够使史莱姆产生随机的“泳意”再选中**`minecraft:navigation.swim`** 组件,该组件可以使史莱姆将水的内部纳入寻路算法。点击“调整”将组件添加到行为包中。
### 配置“行为.随机游泳”
我们先配置游泳的AI意向。
![](./images/6.10_random_swim.png)
![](./images/6.10_random_swim_fields.png)
我们只需要设置其优先级即可其余的保持默认状态。由于对于“随机游泳”我们可以认为是一种“休闲”状态所以我们将其优先级设为最低“1”。这样史莱姆触发其他状态比如攻击玩家时便可以优先进行攻击等行为。
![](./images/6.10_random_swim_priority.png)
同时我们可以删除漂浮的行为,防止其继续漂浮而不潜入水中。
![](./images/6.10_delete_float.png)
### 配置“导航.游泳”
同理,我们配置导航组件。
![](./images/6.10_nav_swim.png)
![](./images/6.10_nav_swim_fields.png)
我们选中“可以涉水”和“可以下沉”。同时,由于 **“导航”相关组件只能存在一个** ,所以我们需要删去原有的“导航.行走”组件。
![](./images/6.10_delete_nav_walk.png)
这样,我们的史莱姆就“只会游泳”了。
### 配置可呼吸性
我们需要使史莱姆可以在水中呼吸。所以我们为可呼吸组件添加在水中呼吸的特性。
![](./images/6.10_breathable.png)
![](./images/6.10_breathable_water.png)
![](./images/6.10_breathable_in_water.png)
### 进入游戏自测
我们现在可以保存并进入游戏自测了,我们在水中放置一些我们自定义的史莱姆,看看史莱姆会不会游泳。不出我们所料,史莱姆顺利地在水中游了起来!
![](./images/6.10_swim_in-game.gif)

View File

@@ -0,0 +1,54 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 高级
time: 10分钟
---
# 初步了解物品功能配置
在本节中,我们将初步了解自定义物品。一起通过物品配置来制作多种**物品****Item**)。
## 创建一个空物品
和实体一样,我们可以通过在编辑器中新建配置的方式新建一个自定义物品。在创建新物品之后我们依旧可以通过添加特性的方式添加物品的组件。我们接下来先创建一个空物品以观察其属性结构。
![](./images/6.2_empty_item.png)
![](./images/6.2_item_property.png)
添加好新物品之后,我们可以看到物品的各种类别的属性。除了**配套文件**、**基础属性**和**行为包组件**外,我们可以看到还有**盔甲穿戴属性**和**资源包组件**。
- **盔甲穿戴属性**:盔甲穿戴属性能够定义盔甲相关的渲染属性。由于盔甲的自定义本质上是将一个**附着物****Attachable*****挂件***)挂接到物品上,所以这里实际定义的便是附着物的客户端属性。
- **资源包组件**:物品的资源包定义文件中也有一些资源包独占的组件,这里定义资源包的组件。
## 制作武器
我们在创建物品时选择“自定义武器”的数据模板,我们便可以快速创建一个武器。
![](./images/6.2_weapon_item.png)
![](./images/6.2_weapon_property.png)
我们可以看到“属性”窗格丰富了起来,其中比较重要的是“**武器属性**”组件。这个组件是武器物品的核心,它定义了武器的伤害、附魔能力、类型等基础属性。我们可以在这里对这些属性进行修改,直到将其修改为我们满意的样子。
## 制作盔甲
我们在创建物品时选择“自定义盔甲”的数据模板,我们便可以快速创建一个盔甲。
![](./images/6.2_armor_item.png)
![](./images/6.2_armor_property.png)
由于自定义盔甲是通过附着物实现的,所以此处出现了盔甲穿戴属性。盔甲穿戴属性决定了我们穿上该盔甲后的外观。**模型**是该盔甲使用的**模型****Model**)。**材质**是决定该盔甲的渲染质感和模式的**材质****Material**)。**脚本**是盔甲初始化时执行的**Molang**脚本。**纹理贴图**是该盔甲的**纹理****Texture**)。**渲染器**是该盔甲的**渲染控制器****Render Controller**)。
行为包组件中的“**盔甲属性**”组件决定了该盔甲的护甲值和附魔能力。
## 制作消耗品
最后,我们再尝试制作一个食物消耗品。
![](./images/6.2_food_item.png)
![](./images/6.2_food_property.png)
我们可以看到“**食物属性**”组件决定了该食物能够补充的饥饿值。我们还可以利用该组件自定义食用后产生的状态效果和食用的使用时间。

View File

@@ -0,0 +1,39 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 高级
time: 15分钟
---
# 初步了解方块功能配置
在本节中,我们将初步了解自定义方块。一起通过方块配置来制作多种**方块****Block**)。
## 自定义刷怪笼
在本段中,我们想要自定义一个刷怪笼。我们可以从“**刷牛方块**”数据模板开始。
![](./images/6.3_spawner.png)
![](./images/6.3_spawner_property.png)
我们可以看到,方块也分为**配套文件**、**基础属性**和**行为包组件**。决定了这个方块是刷牛方块的核心属性和组件便是“基础属性”中的“**继承方块**”和“行为包组件”中的“**刷怪箱属性**”。刷怪箱属性的“怪物类型”中便是该刷怪箱要刷的怪物类型。我们不妨将其改为我们第一节中自定义的头顶一个僵尸的“羊”。
![](./images/6.3_spawner_change_to_sheep.png)
这样,我们便得到了一个可以刷僵尸羊骑手的方块,我们可以将其更改纹理后放在地形中实现其他功能。当然,这里除了国际版自定义生物之外也支持原版的生物,因此你可以灵活运用该功能。
![](./images/6.3_spawner_in-game.png)
## 自定义光源方块
我们还可以通过“**普通的发光方块**”数据模板来创建一个光源。
![](./images/6.3_emission_block.png)
![](./images/6.3_emission_property.png)
我么可以看到决定是否发光的属性是“亮度”组件。1.0的发光强度有点太亮了我们希望将其调低比如我们可以调到0.6。
![](./images/6.3_emission_change.png)
稍加更换纹理,我们便完成了一个光源方块的制作!

View File

@@ -0,0 +1,33 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 入门
time: 10分钟
---
# 初步了解配方配置
在本节中,我们将初步了解自定义配方。我们还记得,在第一章中,我们便亲手制作过一个有序**配方****Recipe**),接下来,我们详细介绍一下不同的配方配置数据模板。
## 自定义无序配方
我们使用`NeExample:recipe_1`数据模板,可以快速创建一个无序配方。
![](./images/6.4_shapeless_recipe.png)
![](./images/6.4_shapeless_property.png)
我们可以看到,这和有序配方的属性界面还是有很多不同的,最明显的便是**适用方块**和**配方成分**。有序配方只能适用于工作台,但是无序配方却可以适用于很多其他方块,比如**制图台**和**切石机**。
配方成分也不再是网格的形状,而是一个线性的列表,分别列出了各个物品和所需的数量。
## 自定义熔炉配方
我们还可以使用`NeExample:recipe_2`数据模板快速创建一个熔炉配方。
![](./images/6.4_smelt_recipe.png)
![](./images/6.4_smelt_property.png)
我们可以看到,输入输出都变得单一了起来,因为这是一种用于烧炼的配方,所以输入输出都变成了一对一的关系。
通过更改输入输出,增删适用方块,我们便可以轻松制作一个新的配方。

View File

@@ -0,0 +1,61 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 高级
time: 10分钟
---
# 初步了解交易表配置
在本节中,我们将初步了解自定义交易。一起通过交易表配置来制作一个类似于村民交易的自定义**交易****Trade**)。
## 创建交易表
我们希望能通过数据模板更好地观察交易表的结构,所以我们创建一个“多路交易表”。
![](./images/6.5_trade.png)
![](./images/6.5_trade_property.png)
事实上,此时我们依旧不能看清楚交易表的结构,所以我们先将交易表的顶级对象折叠。
![](./images/6.5_trade_property_shrink.png)
现在我们便能够观察到交易表的顶级结构了。事实上,一张交易表是由一个或多个**品质****Tier**)的交易组成的,而不同的品质是由交易不同的经验花费区分开的。当生物生成时,可以选择从不同品质的交易池中抽取一个或多个来作为自己的交易。
![](./images/6.5_trade_property_expand_1.png)
每个品质的交易中又存在一个“**交易列表**”,列表里存在多个交易,分别是该品质具有的交易项。每个交易都是“交易列表”的一个元素。在实体生成时,会从列表里随机选取一个作为该品质的交易。
![](./images/6.5_trade_detail.png)
有的交易是一换一的,有的交易是一换多的。不管怎么样,交易所交付的物品必须只有一个,而交易返回的物品则可以有许多。这便是一整张交易表的结构。
## 挂接交易表
交易表可以挂接在实体上,我们不妨继续使用我们在第一节中定义的实体“羊”,将我们刚刚定义的交易表挂接在羊实体上。
我们在左侧的“配置”窗格中选择我们的自定义“羊”。
![](./images/6.5_select_entity.png)
此时右侧的“属性”窗格将更换为羊的属性。我们添加一个行为包组件。找到`minecraft:economy_trade_table`组件。这个组件用于给一个实体添加一个交易表。
![](./images/6.5_trade_add_to_entity.png)
在属性中找到“**经济交易表**”,点击“**+**”按钮。
![](./images/6.5_add_trade.png)
简单地选中`display_name``new_screen``table`。并点击“**调整**”。
![](./images/6.5_select_trade_feature.png)
选择我们的交易表并将其配置如下,其中“显示名称”完全可以根据个人喜好来进行配置。
![](./images/6.5_select_table.png)
![](./images/6.5_config_component.png)
点击右上角的“运行”进入游戏自测,使用我们的刷怪笼刷出我们的羊,右键我们的羊进行互动,我们将看到我们的交易自定义成功了!
![](./images/6.5_trade_demo.png)

View File

@@ -0,0 +1,47 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 入门
time: 10分钟
---
# 初步了解掉落表配置
在本节中,我们将初步了解自定义战利品表。**战利品表****Loot Table*****掉落表***)常用于生物或方块破坏、箱子和宝藏的战利品抓取。
## 创建战利品表
和交易表一样,我们选择一个“多路战利品表”。
![](./images/6.6_loot.png)
![](./images/6.6_loot_property.png)
和交易表类似,战利品表也是从池子中**掷取****Roll**)一个或多个物品。战利品表的根节点的每一个元素都称为一个**池****Pool**。如下所示我们创建的战利品表有2个池。
![](./images/6.6_pools_expand_2.png)
每次掷取战利品表,每个池都会进行一次或多次掷取,掷取由”**随机次数**“决定。而掷取过程则是根据”**随机权重**“随机地从”**随机池**“中抽出一个物品出来。多次掷取时就抽出多次,最后每个池中抽出的所有物品加起来便是此次该战利品表掷取的所有物品。
## 挂接战利品表
战利品表可以挂接在多个地方。此次我们以制作一个幸运方块为例,演示如何将战利品表挂接在方块上。
### 制作幸运方块
我们先配置一个“与蜘蛛掉落相同的方块”,该方块自带一个“掉落属性”组件,可以用来挂接战利品表。
![](./images/6.6_lucky_block.png)
![](./images/6.6_drop_property.png)
我们选择我们的战利品表,此时便算作挂接成功了。
![](./images/6.6_loot_table_select.png)
此时我们可以进入游戏来观察一下效果。
![](./images/6.6_lucky_destroying.png)
![](./images/6.6_lucky_destroyed.png)
可以看到,我们的战利品表挂接成功了!我们可以向战利品表中添加更多有趣的物品,来完善我们的“‘内容庞大”的幸运方块了!

View File

@@ -0,0 +1,108 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 高级
time: 15分钟
---
# 初步了解生成规则配置
在本节中,我们将初步了解自定义生成规则。**生成规则****Spawn Rule**)是用于使生物在世界中**自然生成****Naturally Spawn**)的规则。
## 创建生成规则
我们通过生成规则配置来创建一个空的生成规则。
![](./images/6.7_spawn_rule.png)
![](./images/6.7_spawn_rule_property.png)
我们可以看到,生成规则的配置还是十分简单易懂的,大多都是字面意思。我们直接开始尝试为我们的自定义实体“羊”配置生成规则。
### 将实体挂接在生成规则上
我们找到“**生物**”,选择我们的羊。
![](./images/6.7_spawn_rule_sheep.png)
我们希望羊只生成在草方块上,所以在“**可生成于方块**”处添加一个草方块。
![](./images/6.7_spawn_rule_on_grass.png)
我们希望每次羊都有概率成群结队地生成,所以我们选中“**以群落方式生成**”并适当修改其值。
![](./images/6.7_spawn_rule_in_group.png)
我们希望这种羊生成的多一些,所以增大“**生成权重**”为20原版羊是12
![](./images/6.7_spawn_rule_weight.png)
我们希望其只在主世界生成,所以我们指定代表主世界的两个“**生物群系标签**”。
![](./images/6.7_spawn_rule_biome_tag.png)
事实上,我的世界开发工作台的编辑器中默认只能形成`all_of`的过滤器逻辑,即只有同时具有标签`overworld``overworld_generation`的生物群系才能生成,但是事实上任何生物群系只可能具有上述的其中一种,所以我们需要手动将其更改为`any_of`。我们在“资源管理”窗格的行为包下的`spawn_rules`文件夹中找到我们的生成规则,双击将其打开。打开后文件内容如下文所示:
```json
{
"format_version": "1.8.0",
"minecraft:spawn_rules": {
"conditions": [
{
"minecraft:biome_filter": {
"all_of": [ // 更改此处!
{
"operator": "==",
"test": "has_biome_tag",
"value": "overworld"
},
{
"operator": "==",
"test": "has_biome_tag",
"value": "overworld_generation"
}
]
},
"minecraft:herd": {
"max_size": 4,
"min_size": 1
},
"minecraft:spawns_on_block_filter": [
"minecraft:grass"
],
"minecraft:spawns_on_surface": {
},
"minecraft:weight": {
"default": 20
}
}
],
"description": {
"identifier": "tutorial_demo:demo_sheep",
"population_control": "animal"
}
}
}
```
我们将`minecraft:biome_filter`组件下的`all_of`修改为`any_of`后保存。更改完成后的`minecraft:biome_filter`组件节选如下:
```json
"minecraft:biome_filter": {
"any_of": [ // 更改完成
{
"operator": "==",
"test": "has_biome_tag",
"value": "overworld"
},
{
"operator": "==",
"test": "has_biome_tag",
}
]
}
```
![](./images/6.7_spawn_rule_in-game.png)
现在打开游戏进行自测,很轻松便能够找到我们想要的生成结果了!

View File

@@ -0,0 +1,25 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 高级
time: 10分钟
---
# 初步了解特征配置
在本节中,我们将初步了解自定义特征。一起通过特征配置来制作用于“点缀“世界的**特征****Feature**,又译**地物**)。
## 创建特征
我们通过特征配置来创建一个特征。
![](./images/6.8_feature.png)
![](./images/6.8_feature_property.png)
我们可以看到,特征属性十分简单。这是因为目前如果我们选择在编辑器内创建特征,我们目前只能创建一种特征,被称为**结构特征****Structure Feature**,又译**结构地物**)。结构特征支持一个结构挂接其上,然后该特征生成时就会自动放置这个结构,从而形成类似于“自然遗迹”之类的地形或建筑。
我们可以将我们上一章中一起制作的湖泊湿地结构挂接于此。
![](./images/6.8_feature_structure.png)
然后,一个结构模板特征就制作完成了。如果需要其自然生成,我们需要下一节讲到的特征规则。

View File

@@ -0,0 +1,43 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 高级
time: 10分钟
---
# 初步了解特征生成配置
在本节中,我们将初步了解自定义特征规则。一起通过特征生成配置来制作能够使特征**自然生成****Naturally Generate**)的**特征规则****Feature Rule**,又译**地物规则**)。
## 创建特征规则
我们通过特征生成配置来创建一个特征规则。
![](./images/6.9_feature_rules.png)
![](./images/6.9_feature_rules_property.png)
我们可以将特征挂接在“**特征**”属性一栏。
![](./images/6.9_feature_rules_attach.png)
然后根据自己的意愿对其他属性稍加改动,比如,我们可以通过“**生成时机**”属性修改特征的**放置阶段****Placement Pass**),但是此处我们无需修改,因为我们的池塘放置在“表层”阶段即可。
![](./images/6.9_feature_rules_pass.png)
由于我们的池塘结构是高出地表3格的所以我们将Y坐标偏移改成-3。
![](./images/6.9_feature_rules_y-offset.png)
为了避免生成过多,将每个区块特征数目减少。
![](./images/6.9_feature_rules_distribution.png)
这样,我们就完成了一个特征规则的创建。
![](./images/6.9_feature_in-game_1.png)
![](./images/6.9_feature_in-game_2.png)
我们进入游戏自测,很容易就能找到我们的特征。但是,我们也发现了我们的特征放置出来之后和原本的结构稍有不同,那是因为在我们的特征放置之后,又有其他特征被放置,他们的放置阶段在“表层”阶段之后,比如图中的冰、顶层雪和水边自然生成的砂砾和沙子。
这样我们就成功制作了一个特征规则!有关特征的更多详细内容我们将在第十六章中共同学习。

Some files were not shown because too many files have changed in this diff Show More