feat:上传历史教程

This commit is contained in:
Othniel su
2024-11-07 18:36:06 +08:00
parent 2a701d54e7
commit da2cc1d4fb
4615 changed files with 66207 additions and 0 deletions

View File

@@ -0,0 +1,146 @@
---
front:
hard: 入门
time: 15分钟
---
# 我的世界基础概念
在本章中,我们将从宏观到微观开始了解我的世界中的各种内容。
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=62ce4236a240f794f8c2c745" width="800" height="600" allow="fullscreen"/>
## 存档、世界、区块
在我的世界中,玩家需要首先创建一个世界才能开始游戏。如下图为中国版的创建世界界面。
![](./images/1.jpg)
但是对于我们开发者来说,其更准确的名称应该为“存档”。
而我们进入游戏后看到的主世界、下届、末地,等不同的维度,才叫做一个“世界”
即存档,是所有世界和世界内的所有数据信息的总称。
每个世界都是由一个个区块构成的。区块是世界里一个大小为16x256x16个方块的部分是游戏地图加载卸载的基本单位。
游戏一般只会加载玩家附近的区块和出生点区块,伴随着玩家的深入探索,会动态对区块进行加载和卸载,来保证游戏运行的效率。
区块的X坐标Floor(X坐标 / 16)区块的Z坐标Floor(Z坐标 / 16)Floor意为向下取整。
一个区块(X, Z)中坐标最小点的坐标为(X * 16, 0, Z * 16),坐标最大点的坐标为(X * 16 + 15, 255, Z * 16 + 15)。
## 实体
实体指每一个在游戏中出现的动态的对象。
实体有很多种种类,下面列出了几种实体类型和对应的部分物品,供读者理解。
### 生物实体
-
-
- 蜜蜂
### 物品实体
- 呈掉落物形式的物品
### 抛射物实体
-
- 雪球
### 方块实体
- 箱子
- 唱片机
> 方块实体中的箱子,唱片机,明明都是方块,为什么叫他方块实体。他们和普通方块有什么区别?
方块实体指可以存储数据的方块,例如箱子可以存储玩家存放在箱子内的物品信息,而一般的方块不具备该属性。具体该部分描述也可以查看下方[方块](#方块)的介绍。
同时玩家也是一种生物实体,包括本地玩家和其他玩家,在游戏中,由玩家自己控制的称为本地玩家,否则为其他玩家。
## 物品
物品栏中具有使用属性的物品、地面上的掉落物等都称为物品。其中掉落物也是实体的一种,是物品实体。
掉落物实际上是一个识别名为Item的实体在玩家走到该实体附近的时候会获取其实体对应的物品数据并将其添加到物品栏中删除掉落物实体。
## 方块
方块是组成世界的最小单位。并且我的世界的玩法就是由挖掘和放置方块展开的。
方块的长宽高均为1不同的方块具有不同的材质。
部分方块拥有方块实体,可以用来存储方块的内部信息。
例如箱子是一个用来存储玩家物品的方块。玩家可以打开箱子存放物品栏中放不下的物品。在玩家存放物品后,程序会将其箱子内的物品信息存储到箱子对应的方块实体上。并且在箱子放置/销毁时,程序也会自动创建/删除其对应的方块实体。
## 模型和纹理
模型即游戏内方块、实体对应的外观形状。在中国版我的世界的开发中,可以使用两种模型。
一种是原版中使用的,基于多个立方体,通过拉伸,组合,旋转而组成的模型。
另一种是骨骼模型即使用3dmax等建模软件搭建的模型。游戏中的大部分生物都可以被替换为骨骼模型进而实现不同的表现效果。
模型不具有任何材质纹理,需要另外绘制材质纹理与其组合,下面是一个原版的僵尸的模型和其贴图。
![](./images/3.png)
<img src="./images/2.png" style="zoom:200%;" />
经过组合后,才成为我们游戏中的僵尸的样子。
![](./images/4.png)
同时,我们可以在游戏中动态对实体的贴图进行切换。例如在游戏中,马有不同的颜色,不同的品种,但是他们共用一个模型。我们可以使用同样的模型,并根据其内部的数据来切换它需要使用的贴图。
下图是游戏资源文件中马的贴图。可以看到骷髅马,僵尸马,骡,和不同颜色的马只是贴图的不同。使用得当可以大量减少重复劳动。
![](./images/5.png)
同时模型一般都配合有动画,例如海豚游泳的动画,来实现更好的视觉效果,带来更好的游戏体验。
动画可以由代码来控制播放时机,播放速度等等的属性。
![](./images/6.gif)
## 游戏界面
界面即我们在游戏中看到的所有用户交互区域。
例如点击熔炉后的烧制界面。
![](./images/7.png)
界面都由一个个小的控件组成、比如图片、进度条、按钮、文本。
这些单个的控件组成在一起,再配合上操作的逻辑,就形成了游戏中的界面。
再中国版中我们制作的界面一般为手机端界面,所以需要考虑如何更方便手机端触摸的操作。
如果需要适配电脑端操作,则需要分别制作双端的界面,并判断用户的运行平台,再决定渲染出哪个界面。
## 粒子和特效
在游戏中我们常常需要借助粒子特效来加强视觉的表达效果。
例如营火的冒烟粒子。
![](./images/8.png)
在模组的制作中,我们一般用粒子和序列帧,来完成此类的效果。
### 序列帧
通过一帧帧的图片不断进行切换形成的动画效果,在游戏中为一个平面面片。
### 粒子
通过不断发射多个不同大小规模的平面面片形成的特效效果,通过替换贴图材质等可以模拟丰富的表现。

View File

@@ -0,0 +1,64 @@
---
front:
hard: 入门
time: 5分钟
---
# 基础概念测验
1.一个区块的大小是
A. 16x64x16
B. 8x128x8
C. 16x256x16
D. 64x64x64
2.在原版我的世界中,一个存档拥有几个世界
A. 1
B. 2
C. 3
D. 4
3.选出下列是方块实体的选项
A. 石头
B. 橡木
C. 盔甲架
D. 箱子
4.坐标为(20,0,20)的区块坐标是
A. (0,0)
B. (0,1)
C. (2,2)
D. (1,1)
5.一个游戏存档内只能出现一个玩家实体
A. 对
B. 错
6.原版游戏中出现的模型属于骨骼模型
A. 对
B. 错
7.同一个模型可以使用不同的纹理贴图
A. 对
B. 错

View File

@@ -0,0 +1,117 @@
---
front: https://mc.163.com/dev/mcmanual/mc-dev/assets/img/02.a85e952d.png
hard: 入门
time: 10分钟
selection: true
---
# 使用开发者工作台制作的第一个玩法
在本章中,我们将使用我的世界开发者工作台,来制作一个简单的组件。
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=62ce4273c6dfd1bb76ee9650" width="800" height="600" allow="fullscreen"/>
## 安装
开发者工作台是我的世界中国版为大家制作的一个用来制作模组的工具,集成了大量的功能,供开发者们更方便地制作各种模组。
下载地址:[https://mc.163.com/dev/](https://mc.163.com/dev/)
![](./images/01.png)
下载完成后进行安装,注册开发者账号并登录。
## 新建项目
安装完成后,我们点击左侧的“创作”按钮,并点击新建基岩版组件。
![](./images/02.png)
在弹出的窗口中,选择空白附加包并新建
![](./images/03.png)
随后弹出的窗口中,我们只需要填写作品名称,用来区分不同的项目,然后点击“启动编辑”即可。
![](./images/04.png)
待加载完成后我们可以看到开发者工作台内置了6个编辑器
- 关卡编辑器
- 预设编辑器
- 地图编辑器
- 界面编辑器
- 特效编辑器
- 逻辑编辑器
他们在模组的制作中发挥着不同的作用。在本章中,我们将会介绍如何使用关卡编辑器配置一些简单的自定义游戏内容。
## 制作一个配方
接下来我们使用开发者工作台新建一个配方。
这里我们制作一个腐肉烧制成皮革的熔炉配方。
> 在我的世界的玩法开发中配方是一个json文件。对于新手来说手写json文件是一个很繁琐的事情所以编辑器的存在就让新建一个配方变得十分容易。我们只需要按照编辑器的文件创建向导一步一步进行配置即可创建出对应的json文件。
首先找到“资源管理”窗口,点击其中的“新建按钮”,如下图所示。
![](./images/05.png)
接下来选择到“配置”,然后选择“配方”,点击“下一步”。
![](./images/06.png)
然后修改文件命名,每个配方的名字不能重复。这里我们将其命名为```rotten_flesh_to_leather```,以便在以后配方很多的时候,能迅速地找到我们想要的配方。
![](./images/07.png)
细心的同学可能观察到了,在文件名上方有一个数据模板。这里我们选择的是空,即不用任何模板配方。同学们可以自行摸索每个配方模板的用途。
并且需要注意的是我们创建的配方路径是在behavior_pack的netease_recipes文件夹下的以后需要修改配方文件时要能找到这个路径。
创建完成后,就可以在右侧“属性”窗口,看到我们刚刚创建的配方。
现在我们将其修改为熔炉中,腐肉烧制成皮革的配方。
需要修改的地方有:
- 配方类型
- 适用方块
- 输入
- 输出
接下来可以跟着图片一起操作。
首先,因为是熔炉烧制的配方,而不是工作台的合成配方,所以我们需要将配方类型改为“熔炉配方”
![](./images/08.png)
修改完成后可以看到,原来的“配方构造”变为了“输入”和“输出”。正如游戏内的熔炉一样,需要提供一个烧制前的物品,和烧制后的物品。
接下来我们在适用方块的[0]处,将“空”改为熔炉。顾名思义,适用方块就是该配方能在哪些方块中使用。
![](./images/09.png)
随后我们修改输入和输出将输入改为腐肉输出改为皮革数量均为1。
![](./images/10.png)
点击物品右边的选择按钮,在出现的”资源选择“窗口中,搜索腐肉,并选中即可。
![](./images/11.png)
输出的皮革选择同理。
修改完成后的配方属性如图:
![](./images/12.png)
点击窗口右上角的保存即配置完成。
接下来我们可以点击“运行”按钮进入游戏,验证一下配方是否生效。
可以看到腐肉成功烧成了皮革,配方配置成功!
![](./images/13.png)

View File

@@ -0,0 +1,61 @@
---
front:
hard: 入门
time: 10分钟
---
# 课后作业
在学习了如何使用编辑器制作一个简单的配方后,就可以举一反三,完成下面的课后作业。
## 作业要求
- 通过配方配置功能配置一个合成命名牌的配方
- 制作一把新的剑攻击力设置为100
- 运行游戏尝试制作配方,和攻击效果
## 操作步骤
### 制作命名牌配方
在“资源管理”窗口中点击新建按钮,和之前一样新建一个配方。文件名可以不一样。
![](./images/14.png)
随后在配方属性窗口中按照自己的想法编写配方构造,将配方结果设置为命名牌。
配方构造可以和图片中不一样,按照自己的想法任意设计。
![](./images/15.png)
### 制作攻击100的剑
在“资源管理”窗口中点击新建按钮,在配置中选择“物品”。
数据模板选择自定义武器,文件名可以和图片中不一样。
![](./images/16.png)
随后我们在右侧的窗口中设置:
- 游戏内名字
- 贴图
- 耐久
- 攻击伤害
![](./images/17.png)
这里贴图暂时先选择自带的苹果素材,或者可以自己绘制一个图片将其放到```资源包/textures/items```目录中,并选择你自己的图片。
![](./images/18.png)
然后我们就可以进游戏测试了。
### 测试
进入游戏,在创造物品栏中,找到我们的超级剑,可以看到攻击力修改成功。
![](./images/19.png)
测试配方,可以正常合成。
![](./images/20.png)

View File

@@ -0,0 +1,229 @@
---
front: https://mc.163.com/dev/mcmanual/mc-dev/assets/img/01.0461bbf4.png
hard: 入门
time: 15分钟
selection: true
---
# 我的世界原版命令
## 认识命令
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=62ce430de6c041f257897fc2" width="800" height="600" allow="fullscreen"/>
命令是指在我的世界原版游戏中自带的控制台命令,这些命令可以在游戏的聊天窗口中、命令方块中被执行。
各种命令相互搭配,也可以实现一些类似模组的玩法。
### 命令功能展示
发送一个游戏内标题
![](./images/01.png)
修改游戏时间
![](./images/02.png)
击杀所有僵尸
![](./images/03.png)
召唤一道闪电
![](./images/04.png)
如此功能繁多的命令可以和模组SDK进行互补。也可以不借助模组SDK来完成很多游戏玩法。
所以学习我的世界原版命令,也是玩法开发中一项非常重要的内容。
## 命令执行方法
### 聊天框
我们随意进入一个游戏存档之后,可以按下回车进入聊天框。
随后在聊天框内输入/开头的任意字符,即使用控制台指令。
例如我们需要设置游戏时间为白天,可以输入```/time set 0```并回车,来修改游戏时间
![](./images/05.png)
同时可以看到命令的参数提示,要求/time set 的最后一个数字是数量类型为int。
### 命令方块
命令也可以在命令方块中执行。命令方块默认不出现在创造物品栏中,需要使用命令来获取。
使用同样的方法打开聊天框,在聊天框内输入```/give @s command_block```即可获取命令方块。
然后将它放在地上,即可进行设置。
在左侧默认设置不改变的情况下,我们输入命令```tp @p ~ ~20 ~```,然后使用红石信号激活这个命令方块。
![](./images/06.png)
命令方块就会执行这个命令并把我们的y高度提高20格。
![](./images/07.png)
## 命令参数
命令会根据命令参数来修改执行的结果。
就比如```/give @s command_block```这个命令,@s 和 command_block 都是这个命令的参数。
参数通常使用空格进行分隔。
在聊天框内输入/give 即可查看该命令的帮助
![](./images/08.png)
在这里,<>括号所表示的内容为必填参数,[]括号所表示的内容为可选参数。
括号内分别是参数的含义和类型。
比如```player: target```即玩家参数,参数类型是一个目标,即目标选择器。
所以我们的命令```/give @s command_block```的含义就是给@s这个目标一个command_block。
@s为目标选择器的命令执行者选择器会在下面介绍。
## 目标选择器
在很多命令中都有一个类型为target的参数。比如刚刚的/give命令。
大多数以实体或玩家作为参数的命令可以通过某些限定条件来选择一个或多个实体或玩家而不必指定实体名、玩家名或UUID。要用条件来选择实体或玩家应先输入一个**目标选择器变量**,如有需要,还可再使用一个或多个**目标选择器参数**以制定具体的条件(可选)。
### 目标选择器汇总表
| 变量 | 功能 |
| ---- | -------------- |
| `@p` | 距离最近的玩家 |
| `@r` | 随机玩家 |
| `@a` | 所有玩家 |
| `@e` | 所有实体 |
| `@s` | 命令的执行者 |
使用这些选择器,就可以限制这个命令将会对谁执行。
同时还可以使用目标选择器搭配目标选择器参数,来筛选实体。
例如需要筛选出所有僵尸,则目标选择器为`@e[type=zombie]`如果需要筛选出2个僵尸则为`@e[type=zombie,c=2]`
这里的`type=`筛选实体类型,`c=`限制了选择的数量。
## 坐标
坐标在数字上反映了实体在世界中的位置。
坐标基于一个由互相垂直且交于一点(即原点)的三条坐标轴形成的网格,即一个空间直角坐标系。
- X轴的正方向为东其坐标反映了玩家距离原点在东+)西(-)方向上的距离。
- Z轴的正方向为南其坐标反映了玩家距离原点在南+)北(-)方向上的距离。
- Y轴的正方向为上其坐标反映了玩家位置的高低程度。
- 坐标系的单位长度为一个方块长每一方块为1立方米。
因此三条坐标轴形成了右手坐标系拇指为X轴食指为Y轴中指为Z轴通过这样可以更为简单地记住各坐标轴。
![](./images/17.png)
### 绝对坐标
在游戏中,可以通过游戏设置打开显示坐标,来查看自己的位置。这里显示的坐标就是绝对坐标。
![](./images/09.png)
### 相对坐标和局部坐标
在命令中,你不仅可以使用绝对坐标(即具体的坐标值),还可以使用相对坐标和局部坐标来表示位置。
#### 相对坐标
相对坐标使用`~`来表示,例如刚刚输入命令方块的`/tp @p ~ ~10 ~`就是一个使用相对坐标来表示的位置。
首先我们来看一下tp的命令参数定义。
![](./images/10.png)
这里我们的命令对应的是红框所划出的参数。
相对坐标的波浪号后面可以跟一个数字,代表坐标的偏移量。例如`~ ~10 ~`就代表目标当前位置的y坐标+10。同样`~`就是`~0`的简写。
#### 局部坐标
局部坐标使用`^`来表示,如果输入命令`/tp @p ^ ^ ^3`就会使玩家向前移动3格。
这里的局部坐标表示和相对坐标类似和相对坐标不同的是局部坐标的坐标原点是以玩家的坐标为中心以玩家面朝方向为z轴正方向。
即无论玩家视角面朝什么方向,使用`/tp @p ^ ^ ^3`都会使玩家朝他面朝的方向进行移动。
> **绝对坐标**可以和**相对坐标**或**局部坐标**混合使用,而**相对坐标**和**局部坐标**不能混合使用。
## 原始文本
原始文本是一串由Json构成的文本。
可以在`/tellraw`,`/titleraw`命令中使用。
原始文本的Json的基本结构如下
```json
{
"rawtext": [ # 包含所有文本对象的列表
{
"text": "", # 文本原始内容和translate不能共存
"translate": "", # 使用玩家所选择的语言显示的翻译识别符即zh_CN.lang语言文件中的key
"selector": "", # 在文本中直接将"@a""@s"等选择器会被转换
"with": [] # 包含translate中的聊天字符串参数的列表
}
]
}
```
我们分别执行下面命令
```
/tellraw @a { "rawtext": [ { "translate" : "commands.op.success", "with": [ "开发者" ] } ] }
/tellraw @a { "rawtext": [ { "translate" : "commands.op.success", "with": { "rawtext": [ { "translate" : "item.apple.name" } ] } } ] }
```
可以查看命令的效果。
![](./images/11.png)
这里就是将`command.op.success`对应的"已将 %%s 设置为管理员"语言文本设置使用with中的参数进行了替换。
同样我们可以自己编写一个消息,例如
```
/tellraw @a { "rawtext": [ { "translate" : "你好 %%s %%s", "with": { "rawtext" : [ { "translate" : "%%s", "with" : { "rawtext" : [ { "selector" : "@s" } ] } }, { "translate" : "item.apple.name" } ] } } ] }
```
可以看到执行效果。
![](./images/12.png)
但是这样的提示文本颜色非常单一,我们可以使用格式化代码来对其添加颜色和格式。
格式化代码由一个小节号(§)和一个数字构成。
例如§a代表从这里开始的文本都变成绿色。我们加上格式化代码后再次尝试命令
```
/tellraw @a { "rawtext": [ { "translate" : "§a你好 %%s %%s", "with": { "rawtext" : [ { "translate" : "%%s", "with" : { "rawtext" : [ { "selector" : "@s" } ] } }, { "translate" : "item.apple.name" } ] } } ] }
```
![](./images/14.png)
可以看到文字已经变成了绿色。
所有可用的颜色和格式对应图如下。
<img src="./images/13.gif" style="zoom: 150%;" />
> **如何快速使用键盘打出小节符**
>
> 按住键盘的`Alt`键不松,依次在小键盘按下`1`、`6`、`7`,按完后松开`Alt`,即可打出小节号

View File

@@ -0,0 +1,131 @@
---
front:
hard: 入门
time: 10分钟
---
# 常用命令
在上一节学习了命令的基本使用方法之后,我们就可以开始来学习一些常用的命令啦!
## /title
发送一个游戏内标题
![](./images/01.png)
上图效果是使用命令`/title @s title §6欢迎来到我的世界`来实现的。
使用帮助
`title <*玩家:目标*> clear`(移除屏幕标题)
`title <*玩家:目标*> reset`(将各选项复位至默认值)
`title <*玩家:目标*> title <*标题文字:字符串*>`(将文字显示为主标题)
`title <*玩家:目标*> subtitle <*标题文字:字符串*>`(将文字显示为副标题)
`title <*玩家:目标*> actionbar <*标题文字:字符串*>`(在快捷栏上方显示的标题)
`title <*玩家:目标*> times <*渐入:整数*> <*保持:整数*> <*渐出:整数*>`(设置渐入、保持和渐出的持续时间)
## /kill
杀死/清除实体
![](./images/03.png)
上图效果是使用命令`/kill @e[type=zombie]`来实现的。
使用帮助
`kill [target: target]`
## /ride
用于使实体骑乘其他实体、停止实体的骑乘/使坐骑逐出自己的骑手、召唤坐骑/骑手。
使用方法
```
ride <骑手:目标> start_riding <坐骑(单个):目标> [传送规则:传送规则] [骑乘方式:骑乘方式]
```
让指定的骑手骑乘指定的坐骑。
```
ride <骑手:目标> stop_riding
```
让指定的骑手停止骑乘。
```
ride <坐骑:目标> evict_riders
```
让指定的坐骑逐出它的骑手。
```
ride <坐骑:目标> summon_rider <实体类型:实体类型> [生成事件:字符串] [命名标签:字符串]
```
在每个没有被骑乘也没有骑乘别的实体的坐骑的位置召唤一个实体,然后让它们骑乘到坐骑上。
```
ride <骑手:目标> summon_ride <实体类型:实体类型> [骑乘规则:骑乘规则] [生成事件:字符串] [命名标签:字符串]
```
在每个骑手的位置召唤一个实体,然后让骑手骑乘它们。
## /tp
将实体传送到指定位置
具体使用方法已经在[上一节](./1-我的世界原版命令.html#相对坐标)介绍过
## /summon
召唤一个实体
![](./images/04.png)
上图效果是使用命令`/summon lightning_bolt ~ ~ ~`来实现的。
使用方法
```
summon <entityType: EntityType> [spawnPos: x y z] [spawnEvent: string] [nameTag: string]
```
```
summon <entityType: EntityType> <nameTag: string> [spawnPos: x y z]
```
## /execute
`/execute`可以在改变执行者、执行位置和角度,添加限制条件,并储存其输出值的情况下执行另一条命令。
使用方法
```
execute <origin: target> <position: x y z> <command: command>
```
可以限制在指定方块被检测到时才执行命令:
```
execute <origin: target> <position: x y z> detect <detectPos: x y z> <block: Block> <data: int> <command: command>
```
例如我们需要检测1只苦力怕并在其位置生成闪电就可以使用如下命令。
`/execute @e[type=creeper,c=1] ~ ~ ~ summon lightning_bolt ~ ~ ~`
![](./images/15.png)
可以看到苦力怕的位置召唤了一道闪电将其劈成了闪电苦力怕。
## 更多命令
如果想要了解更多命令,可以访问[维基百科](https://zh.minecraft.wiki/w/%E5%91%BD%E4%BB%A4)。

View File

@@ -0,0 +1,43 @@
---
front:
hard: 入门
time: 5分钟
---
# 课后作业
## 要求
- 使用/ride命令实现一个实体叠叠乐。
- 使用/execute命令在所有玩家位置处召唤一个苦力怕
## 操作步骤
### /ride
召唤一只僵尸,多次输入指令
```
/ride @e[type=zombie,c=1] summon_ride zombie
```
输入的越多,叠叠乐叠的越高。
![](./images/16.png)
### /execute
执行命令
```
/execute @a ~ ~ ~ summon creeper ~ ~ ~
```
命令解释:
@a 代表所有玩家
~ ~ ~ 代表玩家当前的位置
summon creeper ~ ~ ~ 代表筛选出的玩家执行这个命令

View File

@@ -0,0 +1,49 @@
---
front:
hard: 入门
time: 15分钟
---
# 玩法组件策划思路
在开始制作一个玩法组件之前,我们需要对这个玩法组件的玩法有一定的思考,这就叫做制定需求。
在制定好需求后,我们在制作玩法组件时就会有更清晰的思路,并在一定程度上提高制作的效率。
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=62ce513cc6dfd1bb76ee96ce" width="800" height="600" allow="fullscreen"/>
## 需求制定
制作一个玩法组件,我们需要制定以下方面的需求。
- 大体玩法
- 物品
- 方块
- 实体
- 交互逻辑
- UI
制定了这些需求后,我们就会对需要制作的玩法组件有一个大致的框架,我们可以从这份策划案中得到一些有用的信息。
比如有哪些贴图、模型、动画需要制作?有哪些方块、物品、实体需要配置?每个方块物品之间的逻辑关系是什么,合成配方需要如何设置?
有了这些基础的分析,在制作时就可以更加清楚每一块自己需要做的事情。如果是团队开发,则可以使团队成员之间的分工更加清晰,美工、技术、策划各司其职,同时有条不紊地进行各自的本职工作,最后将其汇聚起来,组成一个完整的玩法组件。
> 在制定需求时,一定要认清自己的开发能力,适当的对功能做加减法。
>
> 难度过高的需求不仅会让自己制作时毫无头绪,也会拖慢制作进度,导致玩法无法实现。
>
> 而清楚地根据现阶段的开发能力,可以在制作玩法组件完成后获得一定的成就感,从而激发自己的创作热情。
## 时间规划
光有了需求还不够,如何分配各个阶段的开发时间,也是非常重要的事情。
在制定完需求后,分别对其各个部分预估工作量,制定一个预期的工期。
合理的时间规划可以督促自己在规定的时间内完成工作,有效的防止拖延。
## 课后作业
根据目前已经学到的知识的掌握情况,自行设计一个玩法组件的策划案,并预估工作量,规划开发时间。

View File

@@ -0,0 +1,126 @@
---
front: https://mc.163.com/dev/mcmanual/mc-dev/assets/img/01.9c30ad9c.png
hard: 入门
time: 15分钟
---
# 我的世界开发工作台
我的世界开发工作台MC Studio是一款由我的世界中国版官方制作的开发工具。
在之前的章节中我们已经使用过开发工作台来制作新的物品,合成配方。
本节我们将会继续介绍它的一些其他编辑功能。
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=62ce5180a240f794f8c2c801" width="800" height="600" allow="fullscreen"/>
## 关卡编辑器
关卡编辑器的功能主要是
- 对地图(场景)的展示
- 在场景中放置实例,即将预设进行实例化
- 实例的显示和坐标变换的调整
- 实例的属性编辑
### 舞台
舞台中列出了存在于场景中的所有实例。
在选中舞台中的某个实例后,中间的游戏窗口会对你选中的实例所代表的游戏元素进行高亮提示,并在右侧属性窗口显示具体属性。
比如图中的泥土就是个方块预设。
![](./images/01.png)
### 预设库
预设库中显示了所有可以用到关卡编辑器中的预设。在预设拖入游戏窗口后,会被实例化。
例如将一个特效预设(截图中为Effect0)拖入游戏后,就可以看到其在游戏中被播放。
![](./images/02.png)
再次拖入一个特效到游戏中并且切回舞台面板可以看到有两个Effect0在舞台中。
![](./images/03.png)
## 预设编辑器
在刚刚关卡编辑器中已经介绍到,关卡编辑器主要是把预设组合到游戏中的一个编辑器。
而我们的预设编辑器,顾名思义,就是用来编辑预设的编辑器。
比如我们在预设编辑器将两个预设进行组合,把特效和泥土预设组合到一起。
![](./images/04.png)
再切回到关卡编辑器,可以看到所有泥土方块都变成了预设中编辑的带特效的泥土。
![](./images/05.png)
## 地图编辑器
地图编辑器可以编辑游戏中的地图。
![](./images/06.png)
地图编辑器主要由一个游戏窗口、菜单栏、工具栏组成。
我们在游戏窗口中可以使用WASD和鼠标进行视角和位置的移动。
并且使用工具对游戏地图进行编辑。
### 笔刷工具
例如使用笔刷工具,可以选择我们需要选择方块、笔刷类型,然后像画画一样直接在游戏内进行建筑的制作。
![](./images/07.png)
### 地形工具
还可以使用地形工具,对地形进行修改。
| 修改前 | 修改后 |
| -------------------- | -------------------- |
| ![](./images/08.png) | ![](./images/09.png) |
### 素材
我们还可以某个存档内的某部分建筑保存为素材,并导出到别的存档进行使用。
![](./images/10.png)
## 界面编辑器
界面编辑器可以用来制作界面。
我的世界中的界面都是由json文件构成的而直接编辑json文件语法较为复杂不能实时看到编辑的效果。
所以使用界面编辑器可以大大减少编写界面的工作量。
![](./images/11.png)
在界面编辑器中,主要由组件栏,空间结构,界面文件列表,属性,资源管理,预览界面构成。
我们可以在顶部选取我们需要的界面组件,并将其拖到我们需要的位置上,然后由各个组件组成游戏中的窗口。
## 特效编辑器
特效编辑器可以编辑网易版特效,并将其挂接到骨骼模型上。
> 小知识:
>
> 骨骼模型是指由Blender等3d软件制作而成的fbx模型
>
> BlockBench所制作的模型叫做基岩版模型
![](./images/12.png)
## 逻辑编辑器
逻辑编辑器可以使用图形化编程的形式来编写模组的逻辑代码。
![](./images/13.png)

View File

@@ -0,0 +1,33 @@
---
front: https://mc.163.com/dev/mcmanual/mc-dev/assets/img/15.3d934fc7.png
hard: 入门
time: 5分钟
---
# 社区开发工具
在介绍完中国版官方开发工具之后,我的世界还有许多社区开发工具。
这里将会介绍一些比较常见的社区开发工具。
## SnowStorm
SnowStorm是一款微软版粒子特效编辑器。
目前有[网页版](https://snowstorm.app/)和VSCode插件版可以使用。
![](./images/14.gif)
## Chunker
Chunker是一款基岩版和Java版存档相互转换的工具。
地址: [点我](https://chunker.app/)
## BlockBench
BlockBench可以轻松地制作基岩版模型。
官网:[点我](https://www.blockbench.net/)
![](./images/15.png)

View File

@@ -0,0 +1,97 @@
---
front:
hard: 入门
time: 15分钟
---
# 课后作业
## 测验
1.下方哪个编辑器不是我的世界开发工作台中有的编辑器:
A. 蓝图编辑器
B. 预设编辑器
C. 地图编辑器
D. 关卡编辑器
2.社区工具Chunker的作用是
A. 制作Java版地图
B. 制作基岩版地图
C. 在基岩版和Java版存档间相互转换
D. 绘制地形的编辑器
3.地图编辑器可以将一个存档的建筑复制到另一个存档中
A. 对
B. 错
4.特效编辑器不可以制作的特效是哪种
A.网易版粒子
B.网易版序列帧
C.微软版粒子
5.网易版特效只可以挂接到骨骼模型上
A. 对
B. 错
## 实践
在实践中,需要自己亲手导入骨骼模型,制作一个序列帧特效,并将其挂接到指定的模型上。
### 操作步骤
首先下载素材包 [链接](https://x19.gdl.netease.com/demo.zip)。并解压到一个文件夹中。
然后新建一个空白附加包,切换到特效编辑器,点击导入模型按钮。
![](./images/16.png)
选择文件夹`./demo/fbx/datiangou`
![](./images/17.png)
弹出的界面直接确定即可。
随后切换模型到datiangou就可以看到导入的模型了。
![](./images/18.png)
现在开始制作序列帧效果。
在资源管理中,找到`effects(网易版特效)`,点击加号进行新建,名称填写`snow`
![](./images/19.png)
然后将demo文件夹中的sfx中的内容复制到当前组件的`resource_pack/textures/sfxs`文件夹中
![](./images/20.png)
在右侧属性窗口,将贴图替换为刚刚复制的图片
![](./images/21.png)
那么特效就配置完成了,现在只需要将特效绑定到模型上,就大功告成!
先在资源管理中找到`effects(网易版特效)`,其中应该有一个`snow.json`
拖动这个`snow.json`到左侧骨骼挂点的`head`
![](./images/22.gif)
拖动完成后就完成了网易版特效对骨骼模型的挂接。

View File

@@ -0,0 +1,50 @@
---
front: https://mc.163.com/dev/mcmanual/mc-dev/assets/img/06.90697108.png
hard: 高级
time: 10分钟
---
# 创建并编辑预设
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=62ce56336b13db499d06212f" width="800" height="600" allow="fullscreen"/>
本章我们将使用关卡编辑器、预设编辑器、逻辑编辑器来带领大家独立制作一个小mod——爆炸箭头。
首先我们新建一个空白附加包,切换到关卡编辑器。
![](./images/01.png)
然后在资源管理界面中,找到目录`Presets(预设)`,点击右边的加号,新建一个玩家预设。
玩家预设是一种自动加载的预设,每个世界中只能存在一个玩家预设。
点击后,会弹出一个设置预设名的窗口,这里直接点击确定即可。
创建完成后,会自动跳转到预设编辑器。
在预设编辑器中,点击创建零件,然后依次选择 常用,蓝图零件。
![](./images/02.png)
点击下一步,在命名窗口中可以给这个蓝图起个名字。比如我们这个蓝图实现了爆炸箭头的功能,所以给它命名为`ArrowExplosion`,然后点击创建。
![](./images/03.png)
创建完成后,可以到资源管理的常用目录中,点击`Parts(零件)`,即可看到我们刚刚创建的零件目录,点击即可看到对应文件。
![](./images/04.png)
图中第一个为零件文件,可以将其拖拽到预设上进行绑定。第二个为蓝图文件,可以在逻辑编辑器中进行编辑。
![](./images/05.gif)
将其拖拽到`Player0`的预设上,即可完成零件和预设的绑定。
然后我们切换回关卡编辑器可以看到舞台中已经有了一个Player0的玩家预设并且零件中已经显示出了我们刚刚绑定的蓝图零件。
点击蓝图零件,可以在右侧属性窗口类型为`ArrowExplosionPart`,即可确认这是我们刚刚创建的蓝图零件。
![](./images/06.png)
至此关卡编辑器和预设编辑器的设置全部完成,下面将开始逻辑编辑器的学习。

View File

@@ -0,0 +1,172 @@
---
front: https://mc.163.com/dev/mcmanual/mc-dev/assets/img/07.f83b4752.png
hard: 高级
time: 25分钟
selection: true
---
# 逻辑编辑器基础
本节我们将介绍逻辑编辑器的基本操作逻辑。
## 基础操作
继续上一节的内容,在资源管理的窗口中,找到`ArrowExplosion`这个零件的蓝图文件,双击打开。
即可打开逻辑编辑器并打开该蓝图文件。
![](./images/07.png)
鼠标左键在Graph窗口中拖动即可选中逻辑对象。
对逻辑对象右键可以打开操作菜单,在空白处右键可以打开创建节点的菜单。按住右键拖动,可以移动逻辑编辑器的视图。
鼠标滚轮滚动则可以对Graph窗口进行缩放。
## 概念讲解
在新建的蓝图文件中,可以发现,现有的逻辑主要为两大块,分别是服务端事件,和客户端事件。
![](./images/08.png)
![](./images/09.png)
同时服务端和客户端事件中都对应了3个节点
- 初始化
- 每刻
- 销毁
初始化和销毁很好理解,它们分别会在服务端或客户端启动/关闭的时候被执行。
每刻是指服务端或客户端在每刻执行的逻辑在我的世界中1秒有30刻。可以简单地理解为在每刻这个节点后的逻辑会在游戏中被每秒执行30次。
> 为什么代码分为服务端和客户端?
>
> 因为我的世界在单人游戏时,是同时启动了服务端和客户端。
>
> 服务端负责游戏的逻辑运算,比如红石、伤害等等。
>
> 而客户端只负责游戏视觉部分的运算,比如渲染、特效、界面等等。
>
> 所以在编写逻辑时必须要注意观察节点的使用范围,不能在服务端调用客户端的代码,也不能在客户端调用服务端的代码。
刚刚提到的一共6个节点通常作为所有节点的头部即程序的入口。
并且在上图中每个节点后都有一个Out端口这里叫做输出端口。将输出端口和输入端口相连接就代表了节点之间的连接顺序从而构成逻辑关系。
## 逻辑编写
### 思路分析
除此之外,监听事件也可以作为程序的入口,比如我们即将制作的爆炸箭头。
爆炸箭头的实现方式如下:
1. 监听抛射物碰撞的事件
2. 判断投掷物是不是箭头
3. 获取坐标,维度相关参数
4. 删除箭头的实体
5. 在对应坐标和维度生成一个爆炸
我们这个模组的入口就是**监听抛射物碰撞的事件**,即只有监听到这个事件,我们的逻辑会继续往下运行。
分析完操作逻辑,我们就要一步一步地进行逻辑编辑器的创作。
### 上手操作
首先在空白处右键,在搜索框输入,抛射物,找到`监听服务端事件:ProjectileDoHitEffectEvent(抛射物碰撞时)`,点击进行节点的创建。
> 为什么一上来就知道搜索抛射物呢?
>
> 我们可以在进行开发前先确定自己需要监听的事件或者接口是否能在API文档中找到
>
> 然后确定事件或接口的描述,并在逻辑编辑器中输入关键字进行搜索,方便创建。
>
> API文档链接[点我](https://mc.163.com/dev/apidocs.html)
![](./images/10.png)
创建完成后,可以看到这个节点的后边后方有许多的参数输出端口,每个端口都对应了这个事件触发时的具体值。
我们可以将这些值带入下一个节点中,并完成一定的计算,最后实现模组的逻辑功能。
![](./images/11.png)
监听完成后我们就需要判断这个子弹ID对应的实体是否是弓箭。同样右键新建节点搜索并选中`GetEngineTypeStr(获取实体的类型名称)`
![](./images/12.png)
创建完成后,可以看到,这个节点左侧有一个`实体Id`的输入端口,右侧有个实体名称的输出端口。
![](./images/13.png)
通过该节点的运算可以将子弹Id得出对应的实体类型名称来判断是不是箭头。
我们需要将存档Id和子弹Id相连接并把上一个节点的Out和这个节点的In相连。
> Out和In之间的连线为橙色叫做执行连线。
>
> 两个节点之间只有使用执行连线进行连接,才会在上一个节点执行完成后触发下一个与其连接的节点。
>
> 而子弹Id和存档Id之间的连线为蓝色叫做数据连线。
>
> 代表数据的传递,不代表执行顺序。
![](./images/14.gif)
得到了实体类型名,我们就需要判断这个名称是不是箭头,也就是`minecraft:arrow`
继续添加节点,进行字符串比较。
![](./images/15.png)
创建完成后,填入对应参数,将节点进行连接,效果如图。
![](./images/16.png)
然后我们创建一个生成爆炸的节点并给他填入参数爆炸威力设置为3勾选带火破坏方块。
![](./images/18.png)
除了存档Id这个参数大部分参数都非常好理解。那么存档Id是什么呢
存档Id是用来区分存档的一般需要在服务端或客户端初始化的时候进行获取。
我们可以在初始化之后使用接口`获取存档ID`进行存档Id的获取。
![](./images/19.png)
同时我们需要创建一个levelId变量并在需要的时候调用它。在左侧变量窗口点击+号输入变量名levelId。
![](./images/23.png)
在获取存档ID后赋值`levelId`
![](./images/24.png)
然后按照图示连接方式,创建剩下的节点,并进行连接。
![](./images/20.png)
最后还需要销毁掉箭头这个实体,注意一定要选择**服务端接口**,而不是客户端接口。
> 如果不销毁箭头这个实体,会在产生爆炸后,箭的实体落下,继续触发事件,从而一直爆炸。
>
> 感兴趣的可以尝试不添加销毁实体的节点并查看效果。
连接效果如图
![](./images/21.png)
### 测试
完成蓝图文件的编辑后,我们点击运行按钮进入游戏测试。
![](./images/22.png)
可以看到射出弓箭,弓箭落地后产生爆炸。
那么我们的爆炸箭就制作完毕了。

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