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,85 @@
# 制作流浪商人小屋预设
在开始本节的课程之前,我们有一个概念需要明确。
在我们前几节课创建项目的时候,我们一定都注意到了,大家选择的都是空白附加包,而不是空白地图。
空白附加包和空白地图,打开编辑器基本都是一样的,它们之间有什么区别呢?
空白附加包,打开关卡编辑器,虽然能看到舞台中的游戏地形、建筑等,但是这些地图在游戏启动后都会消失,即使在地图中做了修改,都不会保存。
而空白地图,不仅可以像空白附加包一样增添各种配方、方块、物品,还可以将编辑器中的地图,场景,一起保存,在下次启动的时候依旧保持原样。
总而言之,空白地图=空白附加包+固定的地图。
那么本节的内容,就是带领大家制作一个流浪商人小屋的预设,来学习预设的使用方法。
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=660a29bd42810643550cee8c" width="800" height="600" allow="fullscreen"/>
## 导出资源
在创建地图之前,我们首先将上一章中制作的自定义流浪商人导出,再次利用,避免重复劳动。
打开编辑器,在关卡编辑器的资源管理中,选择**导出**。
勾选行为包下的`实体``掉落``交易`,资源包下的,`实体资源``文本`,点击导出。并保存到一个目录中,可以看到是个.mep结尾的文件。
![](./images/02.png)
## 开始制作小屋预设
然后我们创建一个空白地图,名字可以自由发挥,点击启动编辑,进入编辑器后,我们打开关卡编辑器,将刚刚导出的资源进行导入。
![](./images/01.png)
选择导入自定义资源包,然后选择刚刚保存下来的文件,全选导入。
![](./images/03.png)
然后就可以看到我们在上一章中创建的实体,掉落表,交易表,都成功导入到了地图这个项目中。
![](./images/04.png)
接下来我们创建一个空预设,还是在资源管理中点击新建,常用,空预设。
![](./images/05.png)
名字我们可以任意起,我们这里叫他`House`,点击创建。
![](./images/06.png)
创建完成后,可以看到已经自动打开了预设编辑器,我们在资源管理中找到`素材`文件夹,点击右侧的导入按钮。在文件选择窗口中,选择`hall.mdl`这个素材作为我们的小屋。
![](./images/07.png)
然后在上方工具栏中的添加素材处,选择刚刚导入的`hall.mdl`。就可以看到这个小屋素材出现在了预设编辑器中。
![](./images/08.png)
然后我们继续添加将自定义流浪商人作为一个实体零件加入到这个House预设中。
点击添加零件,选择`EntityBasePart`,在对应的右侧属性窗口,将实体类型改为我们之前编辑的`会自我保护的流浪商人`
![](./images/09.png)
![](./images/10.png)
如果实体类型中找不到我们自定义编辑的实体可能是编辑器的BUG大家可以尝试**保存项目并重启编辑器**,一般都会可以找到。
![](./images/11.png)
可以看到选中这个左侧`实体`游戏中所对应的流浪商人实体也被高亮显示了同时有3个箭头我们可以将其拖动到房子内来定义的它的生成位置。
调整完成后其实我们的流浪商人小屋预设已经做好了,但是我们为了它变得更有趣味一些,可以给流浪商人再添加一个床的组件,让它会在晚上在床上休息。
回到关卡编辑器,找到这个会自我保护的商人,编辑它的行为包组件。搜索床,并给它添加。
![](./images/12.png)
配置完成后,就可以在资源管理器中,找到`预设`文件夹,点击,将其中的`House.preset`,也就是我们刚刚编辑完的小屋预设,拖入到游戏中。
![](./images/13.png)
做到这样,我们的流浪商人小屋的预设就已经配置完毕,并且成功地放置在了游戏中。

View File

@@ -0,0 +1,292 @@
# 小屋预设课后作业
在学习了预设的基础用法后,可以尝试完成以下要求,来熟悉预设的用法。
- 在小屋素材内放置箱子方块
- 为自定义流浪商人添加猪灵似的攻击盗宝贼的行为
- 使用掉落表为自定义流浪商人添加初始装备
## 在素材内放置箱子方块
要在素材内放置箱子方块,首先我们需要将原来的`hall.mdl`这个素材,放置到地图中,然后对其进行编辑,再保存成新的一个素材。
打开地图编辑器在素材库中找到hall这个素材点击选中然后在地图中放置。
![](./images/14.png)
然后点击右上角的游戏模式,将编辑器切换到游戏的玩家视角,进入游戏,在房子中放置一个箱子。
![](./images/15.png)
放置完成后按ESC退出。然后使用选取工具重新选择这个小屋并将其保存成素材命名为`new_hall`,然后将选中的部分删除,将地形恢复原样。
![](./images/16.png)
然后再素材库中找到自定义素材,对刚刚保存的`new_hall`这个素材右键,选择`导入为预设素材`
回到预设编辑器,将素材的`hall`删除,更换为`new_hall`
![](./images/17.png)
至此,素材内的箱子就放置完成。
## 攻击盗宝贼的行为
进入关卡编辑器,找到我们的自定义流浪商人的实体。
在开始之前,我们需要了解一些新的知识。
### 行为包组件(components)
在行为包组件中,定义了影响实体行为的组件。
例如攻击盗宝贼行为将要用到的`minecraft:block_sensor`组件,用于检测周围方块被破坏。
但是在实际游戏中,实体的行为并非一尘不变的,例如未驯服的狼,默认情况下不会跟随玩家,但是在驯服后,会主动跟随玩家。
> 所以一般在编辑实体时,需要将实体**永不改变**的行为组件编写在此处。
### 行为包组件组(component_groups)
行为包组件组是行为包组件的集合。
一个组件组可以包含多个组件,通常可以把实体的一个状态下所用到的所有组件都编写在一个行为包组件组中。
例如狼实体,包含了以下状态的组件组:
- 幼仔
- 成年
- 野生
- 愤怒
- 驯服
狼实体会在不同情况下,动态增加或删除组件组,来实现特定的玩法。
### 事件(events)
定义一个事件,可以在事件被触发时,删除/添加指定的组件组。
例如狼实体,在驯服事件触发时,有以下的组件组修改
删除
- 野生
添加
- 驯服
### 步骤分析
在了解了上面的知识点后,我们可以得出,要实现检测破坏箱子方块之后,攻击盗宝贼的行为,需要额外用到行为包组件组和事件。
#### 行为包组件组
定义一个`take_target_as_response_to_block_break`分组,用来更新这个流浪商人的行为包组件,让它攻击玩家。
![](./images/46.png)
其中包含组件`行为.追赶附近目标`实体类型为所有玩家仍然需要手动打开json编辑。
```
"entity_types": [
{
"filters": {
"test": "is_family",
"subject": "other",
"value": "player"
},
"max_dist": 16
}
]
```
#### 事件
定义一个`important_block_destroyed_event`,在玩家破坏箱子后触发,然后给实体添加`take_target_as_response_to_block_break`这个组件分组,让它攻击玩家。
![](./images/47.png)
#### 行为包组件
`minecraft:block_sensor`可以用来检测周围的方块是否有破坏之类的事件在检测到后触发某个json事件。因为编辑器暂时不支持编辑这个组件所以手动编辑json将它放到`components`这个节点下(对应编辑器中的行为包组件)。
```json
"minecraft:block_sensor": {
"sensor_radius": 16,
"on_break": [
{
"block_list": [
"minecraft:chest"
],
"on_block_broken": "important_block_destroyed_event"
}
]
}
```
其中`on_block_broken`的意义就是触发事件,添加行为包组件组。
最终配置完成的json文件如下其中修改的部分进行了注释可以参考。
```json
{
"format_version": "1.12.0",
"minecraft:entity": {
"components": {
"minecraft:attack": {
"damage": 10
},
"minecraft:behavior.float": {
"priority": 0
},
"minecraft:behavior.look_at_player": {
"look_distance": 8,
"priority": 8,
"probability": 0.02
},
"minecraft:behavior.melee_attack": {
},
"minecraft:behavior.nearest_attackable_target": {
"entity_types": [
{
"filters": {
"all_of": [
{
"subject": "other",
"test": "is_family",
"value": "monster"
}
]
},
"within_default": 10
}
],
"must_see": true,
"reselect_targets": true
},
"minecraft:behavior.open_door": {
"close_door_after": true,
"priority": 6
},
"minecraft:behavior.random_look_around": {
"priority": 9
},
"minecraft:behavior.restrict_open_door": {
"priority": 5
},
"minecraft:behavior.sleep": {
},
"minecraft:can_climb": {
},
"minecraft:economy_trade_table": {
"convert_trades_economy": true,
"display_name": "商人",
"new_screen": true,
"table": "trading/trade.json"
},
"minecraft:jump.static": {
},
"minecraft:loot": {
"table": "loot_tables/loot.json"
},
"minecraft:movement": {
"value": 0.5
},
"minecraft:movement.basic": {
},
"minecraft:navigation.walk": {
"avoid_water": true,
"can_open_doors": true,
"can_pass_doors": true,
"can_path_over_water": true
},
"minecraft:persistent": {
},
"minecraft:physics": {
},
"minecraft:pushable": {
"is_pushable": true,
"is_pushable_by_piston": true
},
// 用来检测周围的方块
"minecraft:block_sensor": {
"sensor_radius": 16,
"on_break": [
{
"block_list": [
"minecraft:chest"
],
"on_block_broken": "important_block_destroyed_event"
}
]
}
},
// 新增的组件分组
"component_groups":{
"take_target_as_response_to_block_break": {
"minecraft:behavior.nearest_attackable_target": {
"priority": 7,
"entity_types": [
{
"filters": {
"test": "is_family",
"subject": "other",
"value": "player"
},
"max_dist": 16
}
]
}
}
},
// 新增的事件定义
"events": {
"important_block_destroyed_event": {
"add": {
"component_groups": [
"take_target_as_response_to_block_break"
]
}
}
},
"description": {
"identifier": "afhui:merchant",
"is_experimental": false,
"is_spawnable": true,
"is_summonable": true
}
}
}
```
## 使用掉落表配置初始装备
首先使用资源管理,新建一个掉落表,命名为`merchant_weapon`
在掉落池中添加一个钻石剑。
![](./images/18.png)
这样即配置完成,如果想要随机性,也可以再添加多种不同类型的剑。
然后回到自定义流浪商人的实体配置,在行为包组件中搜索装备并新增。
![](./images/19.png)
添加后,在行为包组件中找到装备一栏,点击添加属性,新增`表`这个属性,填入`loot_tables/merchant_weapon.json`,也就是我们刚刚创建的掉落表。
到此为止,要求已经全部完成,保存后就可以点击运行进入游戏测试啦!
> 为什么进入游戏后看不到这个流浪商人手持剑呢?
>
> 因为我们没有给它配置相关的持剑动画,渲染设置,所以这把剑只能够提升它的攻击力,不可显示。

View File

@@ -0,0 +1,174 @@
# 制作物品方块预设
本节将会使用blockbench制作新的武器方块模型来增强表现力并将模型添加到一个新方块中放置到我们之前的小屋里。
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=660a2ab942810643550cefc5" width="800" height="600" allow="fullscreen"/>
## BlockBench
在基础版教程就已经提到过这个软件BlockBench可以用来制作我的世界中的模型。
下载地址:[点我](https://www.blockbench.net/downloads)
![](./images/20.png)
根据自己的系统来选择安装包Windows系统可以按照图片指示选择下载完成后点击安装。
![](./images/21.png)
安装完成后打开点击文件新建基岩版模型。文件名模型id都填写`weapon_block`这就是将来我们需要用到的模型id。其他的按照图片填写。
![](./images/22.png)
创建完成之后,点击导入纹理,倒入一张铁斧头的纹理(可以根据自己喜好选择,也可以自己绘制)。
![](./images/23.png)
可以自行查找我的世界原版资源包,也可以直接将下图保存使用。
![](./images/iron_axe.png)
导入完成后在右侧大纲下方的空白区域右键先选择添加组再选择添加纹理网格。将texture_mesh拖入bone中。
![](./images/24.png)
![](./images/25.png)
添加完成后就可以看到中间的编辑区域已经出现了我们的斧头纹理网格。然后同时选中bone和texture_mesh进行移动。
可以看到左上角有很多个按钮,分别是**移动,尺寸,旋转,枢纽工具,顶点捕捉**。
我们这里调整模型的位置,使用旋转工具,移动工具等,根据自己的喜好调整。
![](./images/26.png)
![](./images/27.png)
根据自己的喜好调整完成后我们还需要将整个模型向BlockBench中红线和蓝线的方向进行平移。如下图所示模型的中心位置为BlockBench中底部灰色网格的的有红线和蓝线的那个角落。
![](./images/28.png)
为了更清楚地表示,平移前为下图红色框内的位置,平移后为下图中黄色框的位置。
![](./images/29.png)
编辑完模型,我们将它保存,应该保存为一个后缀为`.json`的文件
## 配置方块
和之前一样,在关卡编辑器中新建一个方块配置,叫他`weapon_block`,进行创建。
然后在资源管理中,点击导入按钮,选择`BlockBench模型-json模型(生物)`选择我们刚刚保存的json文件进行导入。
![](./images/30.png)
> 为什么要选择json模型生物
>
> 因为我们制作的纹理网格的模型,是基岩版模型独有的功能。
>
> 而BlockBench模型方块要求模型是自由模型无法使用纹理网格。
>
> 所以我们这里使用方块实体的形式来添加这个模型,让这个方块的基岩版模型来使用纹理网格。
根据提示检查图片是否正确,不正确的可以进行更改。
![](./images/31.png)
导入完成后,我们还需要在找到`models/entity/weapon_block.geo.json`,双击打开
![](./images/35.png)
在如图所示的地方找到`texture_meshes`节点下,找到`texture`,将其改为`"texture": "default"`
![](./images/36.png)
进行这样的配置是因为,我们使用了`texture_mesh`这个比较特殊的功能来制作模型而BlockBench编辑的模型并不会正确的设置texture_mesh所用的纹理文件所以我们需要手动打开文件将它的纹理设置为`default`,也就是默认情况下实体的纹理。
接下来切回到方块的配置,在行为包组件中添加方块实体组件。可以不用勾选任何内容。
![](./images/32.png)
因为是方块实体的形式,所以接下来再新建一个实体,名字和我们的方块保持一致,这里都叫`weapon_block`
然后添加资源包组件 材质、生物渲染控制器
![](./images/48.png)
按照下图配置资源包组件中的模型和纹理、材质、生物渲染控制器。
材质和生物渲染控制器需要手动输入 `default`,`entity_alphatest`,`controller.render.default`。使用默认的材质和渲染控制器进行渲染。
![](./images/49.png)
因为编辑器暂时不支持配置使用方块实体的模型,所以我们需要手动修改`blocks.json`文件,将实体套用到方块上。
在资源管理中,找到资源包文件夹,在右侧找到`blocks.json`,双击打开。
![](./images/34.png)
打开的文件中,应该有一个`命名空间:weapon_block`的字段,例如我这里的是`gever:weapon_block`,就是这个方块的标识符。
我们将其中的内容删除,替换为
```json
"client_entity": {
"identifier": "gever:weapon_block",
"hand_model_use_client_entity": true
}
```
这里的identifer就是你刚刚创建的实体的标识符注意需要替换一下自己的命名空间。
配置完成后的`blocks.json`示例
```json
{
"format_version": [
1,
1,
0
],
"gever:weapon_block": {
"client_entity": {
"identifier": "gever:weapon_block",
"hand_model_use_client_entity": true
}
}
}
```
目前这样进入游戏会发现模型虽然可见但是会有报错。这主要是因为我们的模型使用了texture_mesh形式目前这种形式的模型对于方块实体的方块还没有完全支持所以报错我们暂时不管它。为了避免后续玩家的报错我们后面可以使用逻辑编辑器制作一个替代的物品监听点击事件来放置这个方块。
回到方块配置,在行为包组件中搜索`渲染材质`,添加。值选择全透明。
![](./images/37.png)
![](./images/38.png)
再添加吸光度属性设置为0。否则方块在游戏中看起来是黑色的。
![](./images/40.png)
基础属性可以给它设置一下游戏内名字、声音。同时删除贴图属性。基础属性的所有内容如下图所示。
![](./images/39.png)
这样配置后,这个武器方块就配置完成。
## 商铺驿站和武器方块的摆放
接下来我们就可以使用地图编辑器,设计一个商铺驿站的素材,其中置入武器方块,将它和流浪商人小屋预设进行结合。
要获得武器方块,可以使用命令`/give @s gever:weapon_block`,注意将命名空间替换为自己的。如果没有该物品,可以尝试重启编辑器。
制作完成后,将其保存为素材,然后在地图中删除。并导入为预设素材。
随后到预设编辑器打开House预设将刚刚导入的预设素材放到小屋前。
![](./images/41.png)
这样我们启动游戏之后,就可以看到小屋面前多了一个驿站的建筑。
![](./images/42.png)
至此我们的预设编辑完成。

View File

@@ -0,0 +1,52 @@
# 物品方块预设课后作业
要求:
- 设计更多武器方块,来点缀驿站
- 为自定义流浪商人,加入被破坏后攻击破坏目标的组件
## 更多武器方块
由于添加更多武器方块的步骤和[上一节](./2-制作物品方块预设.html)完全一致,只需要在创建模型时区分不同的模型名,所以我们这里略过,直接展示成果。
![](./images/43.png)
例如这里的`arrow_block`和之前的`weapon_block`不一样。
添加完成方块后,同样的再将驿站的素材放置后重新保存,导入预设素材。
![](./images/44.png)
这样我们的更多武器方块就添加完成。
## 攻击盗宝贼的行为
要实现攻击破坏武器方块的玩家,其实实现原理和之前的攻击破坏箱子的原理一样。
所以我们回到自定义实体的配置打开json文件找到`minecraft:block_sensor`
```
"minecraft:block_sensor": {
"on_break": [
{
"block_list": [
"minecraft:chest"
],
"on_block_broken": "important_block_destroyed_event"
}
],
"sensor_radius": 16
},
```
其中的`block_list`,就是需要探测破坏的方块,在这里我们添加我们新增的武器方块,例如例子中是`gever:arrow_block``gever:weapon_block`
配置完成后,如图:
![](./images/45.png)
## 完整资源下载
至此为止,预设编辑器的全部内容就已经介绍完毕。下面放出整个地图的的文件。可以自行解压后导入到编辑器中,供参考和学习。
下载地址:[点我](https://g79.gdl.netease.com/preset_tutorial_res.zip)