2.6
This commit is contained in:
92
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/0-制作第一个蓝图零件.md
Normal file
92
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/0-制作第一个蓝图零件.md
Normal file
@@ -0,0 +1,92 @@
|
||||
# 制作第一个蓝图零件
|
||||
|
||||
学习了预设编辑器后,相信大家都对预设和零件有了一定的了解。在本章中,将会主要介绍零件中自定义功能最强大的一个——蓝图零件。
|
||||
|
||||
蓝图零件相信大家在玩法组件基础教程中已经接触过了,并且按照教程完成了一个爆炸弓的制作。那么现在,我们将开始深入了解蓝图零件和逻辑编辑器。
|
||||
|
||||
在这一节的教学中,我们还是会使用上一章使用预设编辑器制作的玩法地图,没有完成制作的可以在 [这里](https://g79.gdl.netease.com/preset_tutorial_res.zip) 进行下载并导入。
|
||||
|
||||
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=6328655ee6c041f2578ca7fa" width="800" height="600" allow="fullscreen"/>
|
||||
|
||||
## 零件的挂载
|
||||
|
||||
我们在关卡编辑器中,先新建一个蓝图零件。
|
||||
|
||||

|
||||
|
||||
名字我们填写`FirstBlueprint`,方便后面做区分。
|
||||
|
||||
创建完成后,在配置栏中找到我们的自定义流浪商人,右键,为其创建预设。
|
||||
|
||||

|
||||
|
||||
文件命名这里填写`EntityMerchant`,当然也可以根据自己的喜好进行命名。
|
||||
|
||||
创建完成后会自动切换到预设编辑器,在资源管理中,找到`Parts(零件)`,并点击`FirstBlueprint`这个我们刚刚创建的蓝图零件。
|
||||
|
||||

|
||||
|
||||
在这里可以看到我们蓝图零件的相关文件。其中,第一个文件可以拖动到预设身上,完成零件和预设的挂接、第二个文件是逻辑文件,双击即可在逻辑编辑器中打开。后面的三个.py结尾的,我们会在后续课程中讲到,这里暂时略过。
|
||||
|
||||
现在需要做的,就是将第一个文件,拖动到左侧层级窗口中,实体预设下。
|
||||
|
||||

|
||||
|
||||
这样就完成了零件与预设的挂接。这样,每当这个实体预设被加载的时候,都会初始化其拥有的所有零件,并按照逻辑编辑器中的逻辑关系进行运行。
|
||||
|
||||
反之,如果只是创建了零件,并编写了逻辑代码,但是它并没有挂接到任何预设上,或者被挂接的预设始终没有被加载,那么零件中的逻辑代码是不会被运行的。
|
||||
|
||||
## 逻辑的编写
|
||||
|
||||
双击逻辑文件,打开逻辑编辑器。可以看到逻辑编辑器中已经预置了一些节点,他们分别是:
|
||||
|
||||
- 监听:客户端初始化
|
||||
- 监听:客户端每刻
|
||||
- 监听:客户端销毁
|
||||
- 监听:服务端初始化
|
||||
- 监听:服务端每刻
|
||||
- 监听:服务端销毁
|
||||
|
||||
不难看出,监听分为2部分,分别是客户端和服务端。每个端又有3个监听,分别是初始化、销毁、每刻。
|
||||
|
||||
初始化和销毁是对立的,一个是开始,一个是结束。每刻则是开始到结束过程中的阶段,我的世界服务端和客户端,将1秒定义为30刻,每刻所对应的节点,都会每秒被执行30次。
|
||||
|
||||
客户端和服务端的区别,会在后面详细介绍,这里只做简单了解。
|
||||
|
||||

|
||||
|
||||
可以看到这些节点的右侧,都有一个Out,并且有一个圆圈,我们叫它端口。
|
||||
|
||||
### 节点间的连接方式
|
||||
|
||||
在端口处,按下鼠标,往外拖动,可以看到一条线,松开鼠标,会弹出节点选择面板,在这里选择后即可创建节点。例如我们这里需要在服务器被初始化的时候,打印消息“服务器初始化”,就可以按照下方动图进行创建节点并自动进行连接。
|
||||
|
||||

|
||||
|
||||
这样就创建了一个打印信息的节点,并将它和服务端初始化进行连接。除了这种创建方式之外,我们还可以直接在空白处右键,创建一个节点,然后再手动将上一个节点的Out端口和下一个节点的In端口相连。
|
||||
|
||||

|
||||
|
||||
### 执行连线和数据连线
|
||||
|
||||
可以发现,无论是使用哪种方式进行节点之间的连线,我们从Out端口链接到下一个In端口处的连线,都是橙色的连线。
|
||||
|
||||
这样的橙色连线,是**执行连线**,代表了逻辑节点之间的执行顺序。程序会始终从一个节点的Out端口,向下一个In端口所连接的节点执行。
|
||||
|
||||
除此之外,还有一种连线,是蓝色的,如下图所示。这样的连线是**数据连线**,只代表了数据的传递关系,不代表执行顺序。
|
||||
|
||||

|
||||
|
||||
> 上图的逻辑的意思是,在初始化之后,获取当前零件的name,并将这个name进行打印。
|
||||
>
|
||||
> 即将零件的名称,传递给了打印信息这个节点,用来输出。
|
||||
|
||||
在了解了基本的节点连接之后,我们分别给服务器和客户端初始化的时候,打印信息。
|
||||
|
||||

|
||||
|
||||
这样,就完成了逻辑的第一个蓝图零件的制作,我们可以进入游戏查看日志,检查是否配置正确。
|
||||
|
||||

|
||||
|
||||
如果配置正确,进入游戏后,就可以看到红色框选出来的输出信息。
|
||||
19
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/1-蓝图零件课后作业.md
Normal file
19
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/1-蓝图零件课后作业.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# 蓝图零件课后作业
|
||||
|
||||
课后作业要求如下:
|
||||
|
||||
- 将第一个蓝图零件,挂接到玩家预设上,并观察日志输出
|
||||
|
||||
## 操作步骤
|
||||
|
||||
新建一个玩家预设
|
||||
|
||||

|
||||
|
||||
打开预设编辑器,编辑玩家预设,将`FirstBlueprint`零件拖动到玩家预设上。
|
||||
|
||||

|
||||
|
||||
这样就配置完成,我们可以进入游戏并观察日志。可以看到应该服务器和客户端的输出各有2次。因为有1个玩家实体和一个流浪商人实体,所以每个实体都会触发1次客户端和服务器。
|
||||
|
||||

|
||||
156
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/2-逻辑编辑器的基础概念(1).md
Normal file
156
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/2-逻辑编辑器的基础概念(1).md
Normal file
@@ -0,0 +1,156 @@
|
||||
---
|
||||
front:
|
||||
hard: 高级
|
||||
time: 20分钟
|
||||
---
|
||||
# 逻辑编辑器的基础概念(1)
|
||||
|
||||
从本节开始,将会系统地介绍逻辑编辑器的使用方法。
|
||||
|
||||
这一节主要会介绍的内容如下:
|
||||
|
||||
- 服务端和客户端的接口调用
|
||||
- 认识数据类型
|
||||
- 学会节点与节点之间的连接
|
||||
|
||||
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=6328659bc6dfd1bb76f1d124" width="800" height="600" allow="fullscreen"/>
|
||||
|
||||
## 服务器和客户端的接口调用
|
||||
|
||||
在开始了解服务器和客户端的接口之前,我们首先需要明确客户端和服务器的概念。
|
||||
|
||||
在我的世界游戏中,游戏的运算部分主要分为服务器和客户端两个部分,它们各自拥有各自的职责,负责游戏的不同部分的运算,并且两者之间可以互相通信,来同步一些信息。下面列出了一部分服务器、客户端负责的部分
|
||||
|
||||
### 服务端
|
||||
|
||||
- 伤害
|
||||
|
||||
- 血量
|
||||
|
||||
- 位置
|
||||
|
||||
- 方块
|
||||
|
||||
|
||||
### 客户端
|
||||
|
||||
- UI
|
||||
- 特效
|
||||
- 3D渲染
|
||||
|
||||
不难看出,服务端主要负责处理所有实体,玩家的数据。而客户端主要负责处理本地玩家,实体以及视觉上的数据。
|
||||
|
||||
因而,我们在逻辑编辑器的逻辑编辑时,所调用的接口,是因服务器和客户端的职责不同,而分开的。例如我们要做一个时装模组,我们服务端所需要处理的数据是每个玩家装备了什么时装,并将所有数据发送到客户端进行时装的渲染。
|
||||
|
||||
接下来我们进入逻辑编辑器来实际操作。
|
||||
|
||||
首先新建一个空白附加包,创建一个玩家预设,并创建蓝图零件,将其挂载在玩家预设中,操作步骤可以回顾[上一节](./0-制作第一个蓝图零件.html)。然后打开到逻辑编辑器。
|
||||
|
||||
我们创建一个`设置是否下雨`的节点
|
||||
|
||||

|
||||
|
||||
可以看到,在创建节点的搜索框中,开头的部分是`服务端接口`,代表这个接口只有在服务端的相关逻辑中能被调用。相对应的,如果前面显示是`客户端接口`,则只能在客户端的逻辑中被调用。
|
||||
|
||||
## 数据类型
|
||||
|
||||

|
||||
|
||||
逻辑编辑器中涉及到一些数据的传递,就像上方图片中的节点所示。这些数据都有规定的类型,见下表。
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :-----------: | :----------------------------------------------------------- |
|
||||
| 布尔值(bool) | 布尔值只有“真”“假”两种取值情况,关系判断、逻辑运算后产生的值都是布尔值。 |
|
||||
| 整数(int) | 如-2、0、100等都是整数。 |
|
||||
| 浮点数(float) | 非整数均用浮点数来表示(这是通俗的理解方式),大部分时候开发者无需关心游戏中的数字是整数还是浮点数。 |
|
||||
| 字符串(str) | 游戏中玩家在聊天频道的发言、文字提示等都是字符串。 |
|
||||
| 字典(dict) | 一一对应的数据的映射,例如玩家和它们的所在坐标,就是可以用字典来表示,一个玩家对应一个坐标。 |
|
||||
| 列表(list) | 一个或多个数据的集合,可重复,例如玩家的xyz坐标就可以使用列表来表示。 |
|
||||
| 对象(object) | 所有类型的数据都是一个对象。 |
|
||||
|
||||
## 节点之间的连接
|
||||
|
||||
节点之间有两种连线方式,分别是**执行连线**(橙色)和**数据连线**(蓝色)。
|
||||
|
||||
**执行连线**必须从一个节点的Out端口连到下一个节点的In端口。代表了节点之间的执行顺序,从第一个节点开始,向连线的方向依次执行。
|
||||
|
||||
**数据连线**只代表数据的传递路径,不代表节点的执行顺序。连线的两端需要保证数据类型匹配,如果不匹配,需要在中间加上必要的类型转换。
|
||||
|
||||

|
||||
|
||||
> **注:**
|
||||
> 1. 不是所有的节点都需要执行连线。例如加法(+)节点,就只需要用数据连线传入两个值,然后右数据连线传出。它的加法逻辑在哪里被调用,就会在哪里被执行。
|
||||
> 
|
||||
>
|
||||
>2. 不是每一个Out端口都需要有执行连线相连。例如条件节点会判断输入的布尔值为真还是假,如果是真,则执行“真”这个Out端口的逻辑;如果是假,则执行“假”这个Out端口的逻辑。若你只希望当布尔值为真的时候执行逻辑,但为假的时候不进行任何操作,你就可以将“假”这个Out端口留空,不需要连任何连线。
|
||||
> 
|
||||
|
||||
# 课后作业
|
||||
|
||||
尝试在服务端初始化事件中,设置世界规则的玩家立即重生规则为真。
|
||||
|
||||
## 操作步骤
|
||||
|
||||
首先,我们希望实现的效果是:在服务端初始化之后设置世界规则(GameRules)。
|
||||
|
||||
那么我们的节点连线,就应该从服务端初始化这里开始连接,并且只能调用服务器相关的接口。
|
||||
|
||||

|
||||
|
||||
我们在服务端初始化节点后连出一个执行连线,在搜索框中搜索`规则`,选择`SetGameRulesInfoServer(设置游戏规则)`,可以注意到,这个接口注明了是服务端接口。
|
||||
|
||||
接下来我们去文档中查找这个节点中的详细参数解释。
|
||||
|
||||
文档的地址: [点我](https://mc.163.com/dev/apidocs.html)
|
||||
|
||||

|
||||
|
||||
在文档中搜索这个接口相关的英文或者中文,找到对应的说明。
|
||||
|
||||
> 1. 如果你还不清楚自己想要的效果应该用哪个节点来实现,你可以先在文档搜索框中输入关键词,浏览相关节点。找到之后,可以复制该接口名,比如这里的`SetGameRulesInfoServer`,然后粘贴到逻辑编辑器的节点输入框中。
|
||||
>
|
||||
>2. 在逻辑编辑器的节点列表中,【内置游戏节点】这一分类下有非常庞杂的节点供你选择。如果你创建了一个内置游戏节点,但不清楚它的具体用法,可以将鼠标悬浮在这个节点名称上,稍等片刻就会弹出一个tip,里面有节点对应的文档链接,直接点击链接就可以跳转到该节点的在线文档。
|
||||
>
|
||||
|
||||
|
||||

|
||||
|
||||
在文档中可以看到示例,也可以看到备注。
|
||||
|
||||
> 其中游戏规则字典中每一项都为可选参数,但是设置option_info或者cheat_info其中一项子项后,必须加上option_info或者cheat_info。
|
||||
|
||||
从示例中我们了解到如下信息:如果我们需要设置立即重生为真,首先需要构造一个**字典**,然后设置字典中的**值**,并将这个字典**传递给接口**。
|
||||
|
||||
查询到如何编写之后,我们就可以在逻辑编辑器中右键新建节点,构造一个字典。不难看出,游戏规则字典是一个两个字典嵌套而成的字典。所以我们先在搜索框中搜索`构造字典`,然后填写对应参数。
|
||||
|
||||

|
||||
|
||||
根据我们所学的数据类型的指示,字典的key应该为str类型,值应该为bool类型。我们在字典中key1处选择str,填写`immediate_respawn`,value1选择为bool,并勾选为true。
|
||||
|
||||
如果我们需要设置多个规则,就可以在右侧属性窗口中,修改这个字典的长度,让他产生多个一一对应的key和value。
|
||||
|
||||
接下来再构造一个字典,key1选择为str,填写`option_info`,并将上一个字典的Dict输出,拖动到新字典的value1处进行连接。
|
||||
|
||||

|
||||
|
||||
这样我们就得到了一个字典,它的内容是
|
||||
|
||||
```json
|
||||
{
|
||||
"option_info": {
|
||||
"immediate_respawn": True
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
这样我们就完成了游戏规则字典的构造,找到`设置游戏规则`这个节点,还有需要一个参数,是存档ID。存档ID可以通过下面的接口获取。
|
||||
|
||||

|
||||
|
||||
可以看到,这是双端接口,代表是服务端和客户端双端都可以使用的。
|
||||
|
||||
这样我们就得到了所有需要的参数,就可以按照下图方式进行连接。
|
||||
|
||||

|
||||
|
||||
随后我们就可以点击“保存”后再点击“运行”,进入游戏测试,看看是否会立即重生。
|
||||
163
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/3-逻辑编辑器的基础概念(2).md
Normal file
163
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/3-逻辑编辑器的基础概念(2).md
Normal file
@@ -0,0 +1,163 @@
|
||||
---
|
||||
front:
|
||||
hard: 高级
|
||||
time: 15分钟
|
||||
---
|
||||
# 逻辑编辑器的基础概念(2)
|
||||
|
||||
在上一节的课后作业中,我们已经成功监听了服务器初始化这个事件,并且调用了设置游戏规则这个接口,构造了一个字典来为这个游戏规则提供具体的参数设置。
|
||||
|
||||
在本节课,将会继续深入介绍事件、接口、数据结构设置和获取的概念。
|
||||
|
||||
同时,我们也应该学会查阅开发文档,来了解具体的参数的含义。
|
||||
|
||||
文档的地址 [点我](https://mc.163.com/dev/apidocs.html) 在后续的教程和实际开发途中会经常用到,建议收藏。
|
||||
|
||||
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=632865d66b13db499d094787" width="800" height="600" allow="fullscreen"/>
|
||||
|
||||
## 事件
|
||||
|
||||
事件在计算机程序中,主要起到一个入口的作用。比如我们使用的软件,就拥有初始化事件、关闭事件、最小化事件等等。
|
||||
|
||||
利用事件的设计,可以轻松地对程序进行拓展,让第三方的程序来监听这些事件,从而做出对应的响应,并且有些事件是允许中途对事件参数进行修改的,并影响最终结果。
|
||||
|
||||
在我的世界中,也利用了这样的事件的设计,来对游戏内容进行二次开发。我们知道,程序是按照顺序执行下去的,那么事件就是一个程序段的运行起点,在某个事件被触发后,监听这个事件的程序就会相应的被执行。
|
||||
|
||||
在游戏中,玩家加入游戏就是一个事件,我们可以利用这个事件,开始执行对玩家数据载入相关的代码。同样,玩家放置/挖掘方块,也是一个事件,我们可以监听这种事件来实现类似幸运方块的玩法。在玩家挖掘某个方块后,判断方块是否是幸运方块,并进行后续的随机,并执行相关的效果的代码。
|
||||
|
||||
我的世界中有数量巨大的事件,这些事件都在文档中被详细的列出和介绍了,我们可以通过文档,查找对我们玩法开发有帮助的事件,并且学习如何使用它们。
|
||||
|
||||

|
||||
|
||||
我们打开文档,在左侧导航栏中可以看到有事件的很多种分类,例如我们要制作幸运方块的玩法,需要用到方块被破坏的事件。根据这个逻辑我们可以推测,这个事件可能出现在`玩家`或者`方块`这一类中。我们可以依次进行查找。最终在`方块`分类中,找到`ServerPlayerTryDestroyBlockEvent`,这个事件符合我们的需求,可以让它作为幸运方块的程序的入口。
|
||||
|
||||

|
||||
|
||||
事件同样分为“服务端事件”和“客户端事件”。这里我们需要用到的`ServerPlayerTryDestroyBlockEvent`是服务端的事件,监听后,只能执行服务端逻辑。
|
||||
|
||||
查看它的参数列表,我们可以看到对应的参数名和数据类型,这些参数在我们后面的程序做判断时都有可能会用到,可以先进行了解。
|
||||
|
||||
找到需要使用的接口后,就可以到逻辑编辑器中创建节点,搜索`ServerPlayerTryDestroyBlockEvent`,创建监听。
|
||||
|
||||

|
||||
|
||||
搜索时我们会发现有两个即将破坏方块事件,一个是`服务端事件`,一个是`零件事件`。
|
||||
|
||||
这里我们简单理解成:零件事件会和这个蓝图零件所挂接的预设匹配,而服务端事件是可以在任意预设下使用的。
|
||||
|
||||
- **服务端事件**:如果你希望当前场景中的任何一个方块被任意玩家破坏的时候,都会从监听节点开始执行一些逻辑,那么你应该使用“监听服务端事件”。
|
||||
|
||||
- **零件事件**:零件事件只用于预设架构,如果你使用了实体预设/玩家预设,并且将你的蓝图零件挂接在了这个预设下,那么如果使用零件事件的话,只有这个破坏方块时,才会监听到这个事件并且执行后续的逻辑。
|
||||
|
||||
一般情况下,推荐使用零件事件。
|
||||
|
||||
## 接口
|
||||
|
||||
接口指程序预留出来的,给其他第三方调用的函数。通常我们只需要了解接口调用后会产生的效果和传入的参数,而不需要了解这个函数内部会做什么处理来达到这个效果。
|
||||
|
||||
就比如上一节中使用过的设置游戏规则的接口,我们只需要知道执行接口后,游戏规则会被改变,而不需要知道游戏内部是怎么让这个游戏规则生效的。
|
||||
|
||||
所有可以用的接口也都可以在文档中查到,我们可以通过大致分类,来定位接口的文档可能出现的位置,并深入进行查找。
|
||||
|
||||

|
||||
|
||||
例如需要对玩家进行伤害,那么我们就是很容易看出来,这个接口是跟`玩家`、`实体`有关,我们就可以在这些分类中进行搜索。
|
||||
|
||||
或者我们也可以使用搜索框,来更加快速的查找我们需要使用的接口。
|
||||
|
||||

|
||||
|
||||
可以在所有结果中找到我们需要的接口。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
就可以很轻松的找到我们想要使用的接口,并且看到它的相关参数解释,以及返回值。
|
||||
|
||||
查找完成后,我们就可以回到编辑器,搜索`Hurt`,并找到这个接口,创建节点进行使用。
|
||||
|
||||
|
||||
|
||||
不过需要注意的是,像`玩家破坏方块`这样的操作,同时拥有事件和接口。
|
||||
|
||||
如果我们在`玩家破坏方块事件`中,调用了`玩家破坏方块接口`,就会再次触发`玩家破坏方块事件`,从而一直循环下去。
|
||||
|
||||
在开发中,我们应该对可能出现这样的死循环的情况进行考虑,并添加限制条件,例如设置一个列表,将玩家的实体ID加入列表,并在调用`玩家破坏方块接口`之前,判断玩家的实体ID在不在这个列表中,并且在完成破坏后,将玩家的实体ID从列表中移除,从而避免死循环。
|
||||
|
||||
那么这样,就涉及到数据结构的获取与设置。
|
||||
|
||||
## 数据结构的获取与设置
|
||||
|
||||
数据结构可以用来更加高效、有序地管理数据。在逻辑编辑器的开发中,可以使用的数据结构主要有两个,分别是列表和字典。
|
||||
|
||||
### 列表
|
||||
|
||||
列表即Python中的list,在逻辑编辑器中,可以找到`构造列表`,来生成一个空列表。
|
||||
|
||||

|
||||
|
||||
列表中的item代表它的元素,选中构造列表节点后,可以在右侧属性面板,修改它的长度。
|
||||
|
||||
每一个元素都有其对应的索引位置,索引位置从0开始,例如上图的列表,第0位的元素是"a",第1位的元素是"b"。
|
||||
|
||||
那么如何获取列表中的某一个索引位置的元素呢?我们可以使用“获取属性”节点。
|
||||
|
||||

|
||||
|
||||
在对象端口,连接List端口,key处填写需要获取的索引值。例如下图,获取到的值就是"a"。
|
||||
|
||||

|
||||
|
||||
如果我们需要获取列表的所有元素,可以使用`循环遍历节点`。遍历节点有两种,分别是`条件循环遍历节点`和`顺序循环遍历节点`。在这里只简单举个例子,在下一节会详细介绍。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
可以自行根据需求,来选择使用。
|
||||
|
||||
### 字典
|
||||
|
||||
字典是一个可以用来存储一一对应的数据的数据结构,字典中的每一对元素都有一个key和value,二者是一一对应的,可以通过key来查找对应的value,但是不能通过value来查找key。
|
||||
|
||||
例如需要存储所有玩家的经验值,那么字典的key就可以是玩家id,value就可以是玩家的经验值。
|
||||
|
||||
需要注意的是,一个字典中一个key只能对应一个值。
|
||||
|
||||
在编辑器中,使用`构造字典`来创建,同样可以在右侧属性窗口修改长度。当然也可以设置长度为0,来构造一个空字典。
|
||||
|
||||

|
||||
|
||||
字典中的值仍然可以像列表一样,通过设置/获取属性来获取和修改。
|
||||
|
||||

|
||||
|
||||
例如下方的操作,可以将"b"的值设置到2,并获取a的值。
|
||||
|
||||

|
||||
|
||||
## 课后作业
|
||||
|
||||
在实体受到伤害事件中,将伤害返还给攻击者。
|
||||
|
||||
### 操作步骤
|
||||
|
||||
如果是跟着课程的步骤操作的,我们现在已经创建了一个蓝图零件,并将其挂接到玩家预设上。
|
||||
|
||||
那么我们就可以在这里,监听`实体受到伤害事件`这个零件事件。
|
||||
|
||||
然后再创建一个`设置实体伤害`的接口。我们可以通过观察文档,知道需要被伤害的实体、伤害值、伤害来源实体,是我们需要填写的参数。
|
||||
|
||||
先将节点进行下图的连接,来确定在受伤后,谁攻击谁。
|
||||
|
||||

|
||||
|
||||
接下来我们需要填写的就是伤害值,直接将伤害值传递到设置实体伤害接口。随后连接执行连线。
|
||||
|
||||

|
||||
|
||||
这样我们就制作完成了一个简单的返还攻击伤害的功能。但是这样的节点会在一些情况下产生报错,比如玩家受到摔落伤害时。
|
||||
|
||||
摔落伤害并没有伤害源ID,需要在返还伤害前进行判断,判断节点会在后面进行介绍。
|
||||
|
||||
150
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/4-逻辑编辑器的基础概念(3).md
Normal file
150
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/4-逻辑编辑器的基础概念(3).md
Normal file
@@ -0,0 +1,150 @@
|
||||
---
|
||||
front:
|
||||
hard: 进阶
|
||||
time: 15分钟
|
||||
---
|
||||
# 逻辑编辑器的基础概念(3)
|
||||
|
||||
本节将会着重介绍两个在逻辑编辑器中非常重要的逻辑功能:判断逻辑和循环逻辑。
|
||||
|
||||
相信在之前的逻辑制作中,大家已经遇到了很多需要进行逻辑判断和需要使用循环的地方,那么本节,就会介绍这些节点的使用方法。
|
||||
|
||||
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=63286619a240f794f8c5fbaf" width="800" height="600" allow="fullscreen"/>
|
||||
|
||||
## 判断逻辑
|
||||
|
||||
逻辑编辑器有很多种可以进行判断的节点,下图列出了所有在 `旧版节点` 中的可用于逻辑判断的节点。
|
||||
|
||||

|
||||
|
||||
同样,在基础节点中,也有许多可以用来进行判断的节点。
|
||||
|
||||

|
||||
|
||||
这里我们简单的创建一个`比较运算`中的布尔值判断来说明。
|
||||
|
||||

|
||||
|
||||
这样一个布尔值判断节点,会将输入的变量,判断它的值,如果是`真`,则从=端口继续执行,如果是`假`,则会从!=端口继续执行。
|
||||
|
||||

|
||||
|
||||
与之类似的,还有字符串比较节点,我们可以在这个节点中输入两个字符串变量,来判断他们的大小。字符串不仅可以判断是否等于,还可以判断大于小于。大于小于的判断依据是字符串对应的编码的中的索引位置,比如"a"在unicode中表示为`\u0061`,"b"在unicode中表示为`\u0062`,对应的十进制分别是91、92,那么就是91<92,即a<b。如果不了解计算机编码的同学可能会比较难以理解大于小于的判断,建议可以直接把<和>的端口都看做不等于。
|
||||
|
||||
## 循环逻辑
|
||||
|
||||
利用循环,我们就可以在程序中轻松地从某一个存储多个元素的对象中取出所有元素。
|
||||
|
||||
在上一节中,我们已经介绍了列表(List)和字典(Dict)的创建和使用,也介绍了可以使用循环来取出它们的所有内容。
|
||||
|
||||
在逻辑编辑器的开发中,主要有两个循环节点可以使用,分别是`条件循环遍历节点`和`顺序循环遍历节点`。
|
||||
|
||||
### 条件循环遍历节点
|
||||
|
||||
我们首先可以观察这个节点的输入和输出端口。
|
||||
|
||||

|
||||
|
||||
它拥有`In`,`跳出`,`列表`3个输入端口,`循环体`,`循环完成`,`索引`,`值`这4个输出端口。
|
||||
|
||||
#### 循环体
|
||||
|
||||
每一次循环中的内容,如果像上图一样,输入的列表是["a","b"],进入循环后,就会执行2次循环体,分别将值"a","b"进行打印。
|
||||
|
||||
#### 遍历完成
|
||||
|
||||
在整个循环结束后,程序将从遍历完成端口继续往下执行。
|
||||
|
||||
#### 索引
|
||||
|
||||
遍历中每次循环的索引值,如果是列表,从0开始;字典则为字典的key。
|
||||
|
||||
#### 值
|
||||
|
||||
遍历中每次循环的值,如果是列表,则为列表的item;字典则为字典的value。
|
||||
|
||||
#### In
|
||||
|
||||
和所有节点的In端口一样,当这个端口的In被连接时,在它的上一个节点运行结束后,就会运行到条件循环遍历节点。
|
||||
|
||||
#### 跳出
|
||||
|
||||
当循环中满足某个条件,想立刻终止循环时,就可以将执行连线连接到跳出端口。那么循环就会立刻终止运行,直接继续执行遍历完成后的节点。
|
||||
|
||||

|
||||
|
||||
例如上方的循环结构,有一个列表["a","b","c"],每次循环体中都会判断元素的值和"b"是否相等,如果相等的话,就会跳出循环,否则打印信息。
|
||||
|
||||
那么上面一串节点最终的运行结果就应该是:
|
||||
|
||||
```
|
||||
a
|
||||
循环结束
|
||||
```
|
||||
|
||||
#### 列表
|
||||
|
||||
需要进行循环的对象,可以是列表,也可以是字典,或者其他的一些可迭代对象。
|
||||
|
||||
### 顺序循环遍历节点
|
||||
|
||||
顺序循环和条件循环虽然同为循环,但是有些许不一样。
|
||||
|
||||

|
||||
|
||||
如上图所示,循环节点将会从起始索引开始循环,每次循环执行循环体中的内容,循环体执行结束后,会将索引值+1,继续执行循环体。直到索引值>终止索引,才会执行遍历完成后的内容。
|
||||
|
||||
它和条件循环节点的主要区别在于,条件循环只能在列表中或字典之类的可迭代对象中进行循环,而顺序循环遍历节点不依赖这些对象进行循环。其他的用法基本一致。
|
||||
|
||||
例如需要编写一个逻辑,从5打印数字到10,就可以设置其实索引为5,终止索引为10,然后将值进行打印。就像下图这样。
|
||||
|
||||

|
||||
|
||||
## 课后作业
|
||||
|
||||
1. 在 实体受到伤害 事件中,判断 攻击者为 玩家,并手持 钻石剑 时,才会将伤害返还给攻击者。
|
||||
2. 在 实体受到伤害 事件中,判断 攻击者为 玩家,并手持 钻石剑 时,会根据 物品列表 掉落随机 物品道具。
|
||||
|
||||
本节课的作业可以在上一节作业的基础上进行修改。首先可以确定的是,两个要求都需要判断攻击者为玩家,并且手持钻石剑。
|
||||
|
||||
那么我们就可以在接口中首先查找获取玩家手中物品的接口,然后再获取物品的id,判断是否是钻石剑。
|
||||
|
||||
- 搜索`GetEngineTypeStr`,创建一个获取实体类型的零件接口,将它的实体ID和伤害源ID连接,并判断实体类型是否是`minecraft:player`。
|
||||
- 搜索`GetPlayerItem`,创建一个获取玩家物品的零件接口,判断物品信息字典的newItemName是否是`minecraft:diamond_sword`。
|
||||
|
||||
物品信息字典中的数据格式,可以在<a href="../../../../mcguide/20-玩法开发/10-基本概念/1-我的世界基础概念.html#物品信息字典">文档</a>中查阅。也可以自己打印物品字典信息,在日志窗口中找到你想要判断的物品的物品名。
|
||||
|
||||
获取玩家物品的节点处,根据<a href="../../../../mcdocs/1-ModAPI/接口/玩家/背包.html?key=GetPlayerItem&docindex=1&type=0">文档</a>,物品位置是一个玩家物品位置枚举,我们可以创建一个枚举对象,然后在右侧属性,将其更改为主手。
|
||||
|
||||

|
||||
|
||||
现在就获取到了玩家手中的物品信息,我们从字典中获取newItemName,来判断是否是`minecraft:diamond_sword`.
|
||||
|
||||

|
||||
|
||||
这样我们就可以筛选出了使用钻石剑攻击的玩家,才返还伤害。接下来继续完成掉落物的生成。掉落物这里我们直接使用生成物品掉落物接口。
|
||||
|
||||

|
||||
|
||||
同时,要随机抽取掉落物,我们还要构造一个列表,来存储需要随机的物品列表。这里我们构造一个2长度的列表,里面先存好了钻石和铁锭的物品名。`minecraft:diamond`和`minecraft:iron_ingot`。接下来需要随机给他抽取。
|
||||
|
||||

|
||||
|
||||
随机抽取就需要使用随机函数,在0到列表长度-1的数字中抽取一个数字,然后获取这个数字对应列表索引的值。或者为了方便起见,我们也可以使用内置python接口的shuffle函数,来打乱这个列表,并获取第0位元素。然后构造一个字典,根据物品字典的格式,我们必填`newItemName`,`newAuxValue`,`count`这几个值。
|
||||
|
||||

|
||||
|
||||
这样我们就获得了一个随机的物品信息字典,接下来就要将它生成到被攻击的实体的位置上。
|
||||
|
||||
创建一个生成物品掉落物的零件接口节点,可以看到我们还需要维度id和生成位置。通过查阅文档可以知道,维度id是实体所在的维度的id,生成位置是用来定位生成坐标的。它们都可以通过零件接口获取。
|
||||
|
||||
<img src="./images/54.png" style="zoom:150%;" />
|
||||
|
||||
上图的实体id均连接了被伤害实体ID。这样我们就完成了随机掉落物的生成。
|
||||
|
||||
我们把第一个In节点接到设置实体伤害后,让它接着设置伤害之后执行。
|
||||
|
||||

|
||||
|
||||
这样我们就完成了所有节点的连接。可以进入游戏测试效果了!
|
||||
|
||||
100
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/5-逻辑编辑器的基础概念(4).md
Normal file
100
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/5-逻辑编辑器的基础概念(4).md
Normal file
@@ -0,0 +1,100 @@
|
||||
---
|
||||
front:
|
||||
hard: 进阶
|
||||
time: 20分钟
|
||||
---
|
||||
# 逻辑编辑器的基础概念(4)
|
||||
|
||||
在学习使用了官方提供的各种零件接口和SDK接口之后,现在我们就可以尝试自己自定义一个接口啦。
|
||||
|
||||
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=6328664ee6c041f2578ca804" width="800" height="600" allow="fullscreen"/>
|
||||
|
||||
## 什么是自定义接口
|
||||
|
||||
在大型玩法开发中,我们会发现有时候很多地方都需要调用相同的功能,执行除了参数以外,几乎一样的逻辑节点。那么自定义接口就可以很好地解决这个问题,我们可以自定义一个接口,并且定义接口内部执行的逻辑节点。并且自由地调用它。这样可以极大地简化我们的逻辑代码。
|
||||
|
||||
## 定义自定义接口
|
||||
|
||||
在逻辑编辑器中,我们在左侧可以看到自定义接口一栏。在这里就可以创建一个自定义接口。
|
||||
|
||||

|
||||
|
||||
点击自定义接口右侧的加号,就可以创建一个自定义接口。然后修改其名字,我们这里改成`f_test`,需要注意,自定义接口必须以`f_`开头。
|
||||
|
||||
并且在顶部可以看到`Graph > f_test`,代表我们正在编辑的接口。
|
||||
|
||||
点击Graph即可返回到原来的编辑界面。双击左侧的自定义接口中的`f_test`,即可返回这个自定义接口的编辑。
|
||||
|
||||

|
||||
|
||||
我们可以在这里编写我们需要的逻辑,从In的输入处开始执行,直到输出处的Out,就退出自定义函数。
|
||||
|
||||
自定义函数必须要从In到Out有一条完整的执行连线,否则无法正常工作。
|
||||
|
||||
例如我们在这里循环从1打印到100,然后链接输出。
|
||||
|
||||

|
||||
|
||||
这样就完成了自定义接口的编辑。我们回到Graph界面。
|
||||
|
||||
可以从左侧自定义接口中,选中`f_test`,并拖动到编辑界面中,就创建了一个节点调用我们的自定义接口。然后我们把它连接到服务端初始化之后来执行,查看日志窗口的输出效果。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
可以看到像预期一样,从1打印到了100。
|
||||
|
||||
## 自定义接口的参数
|
||||
|
||||
自定义接口如果只是能像刚刚所做的那样,能把一部分节点,封装到一个接口中,进行调用,就会显得很死板,因为其中的值都被固定。
|
||||
|
||||
遇到这种情况,我们就可以给它创建一个参数,在外部调用这个接口的时候,将参数带入接口,就可以让这个接口的实用性大大提高。
|
||||
|
||||

|
||||
|
||||
在左侧自定义接口选中了要编辑的自定义接口后,右侧属性面板就会出现相应的配置。可以看到有一个`inputParams`栏,还有一个`outputParams`栏。
|
||||
|
||||
我们可以在这里新增输入和输出参数,让它在运行前传入一些值,在运行结束后,再传出一些值。
|
||||
|
||||
假如还是刚才的循环的自定义接口,我们希望传入参数,指定它从1循环到多少,我们就可以新增一个`inputParams`,点击加号新增。
|
||||
|
||||
如果我们还需要这个接口将某个运算结果传递回来,也可以新增一个`outputParams`,作为返回值。
|
||||
|
||||

|
||||
|
||||
我们这里先新增一个输入参数,定义它的名字为`循环到`,类型为`int`,然后再次回到自定义接口编辑处。就可以看到输入的节点多了一个循环到的端口,我们可以将它进行对应的参数传递,来达到预期的效果。
|
||||
|
||||

|
||||
|
||||
这样我们就可以在自定义接口外部定义需要循环多少次。现在就可以输入需要循环到的数字。
|
||||
|
||||

|
||||
|
||||
## Python模块
|
||||
|
||||
除了逻辑编辑器已经提供的接口外,我们还可以直接调用Python的内置模块,来实现更强大的功能。
|
||||
|
||||

|
||||
|
||||
细心的同学可能早就发现了,在我们的编辑器中,还有一个内置Python接口的分类,在这里可以调用一些Python提供的接口,例如对列表和字典的工具函数。
|
||||
|
||||
具体使用方法可以查阅Python的函数文档。
|
||||
|
||||
## 课后作业
|
||||
|
||||
在`实体受到伤害`事件中,利用自定义接口 定义`实体标识符`、`手持物品名称`、`物品列表`三个参数,并重新实现攻击实体会随机掉落物品列表内的物品`的逻辑。
|
||||
|
||||
### 操作步骤
|
||||
|
||||
首先我们需要新建一个自定义接口,这里叫做`f_dropRandomItem`,并给它定义3个输入参数,物品列表的类型应该为list,但是这里并没有列出list,所以选择Any代表任意。
|
||||
|
||||

|
||||
|
||||
接下来我们可以把部分之前已经编写过的逻辑节点,复制到自定义接口中。然后对其连线进行调整。最后的效果如图:
|
||||
|
||||

|
||||
|
||||
完成配置后,再回到Graph中,直接将随机生成掉落物的逻辑节点,替换成调用自定义接口就可以了。
|
||||
|
||||

|
||||
110
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/6-逻辑编辑器的基础概念(5).md
Normal file
110
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/6-逻辑编辑器的基础概念(5).md
Normal file
@@ -0,0 +1,110 @@
|
||||
---
|
||||
front:
|
||||
hard: 进阶
|
||||
time: 15分钟
|
||||
---
|
||||
# 逻辑编辑器的基础概念(5)
|
||||
|
||||
目前为止,我们已经基本介绍完了所有逻辑编辑器的基础概念。本节将继续介绍一些综合性的知识。
|
||||
|
||||
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=63286681a240f794f8c5fbb7" width="800" height="600" allow="fullscreen"/>
|
||||
|
||||
## 零件节点和SDK节点
|
||||
|
||||
相信在之前的学习过程中,大家都已经注意到了,很多接口或者事件,都同时拥有零件节点和SDK节点。
|
||||
|
||||
如果属于只有零件节点或SDK的接口或者事件,我们可以直接使用这个SDK或零件节点。
|
||||
|
||||
那么在某个接口或者事件,同时拥有零件和SDK节点的情况下,该如何选择呢?
|
||||
|
||||

|
||||
|
||||
上面的图片同样都是生成爆炸接口,但是左侧是SDK接口,右侧是零件接口。
|
||||
|
||||
可以很清晰地发现,除了第一个参数外,其他所有参数都是一致的。SDK接口的第一个参数是存档ID,需要调用`GetLevelId`接口来获取,而零件接口第一个参数是调用对象,可以不填写。
|
||||
|
||||
那么就可以从接口的节点方面,就可以很轻松地看出来,SDK接口需要额外多传入一个存档ID的参数,而零件接口不需要。显而易见,零件接口更加的方便。
|
||||
|
||||
对于事件来说,SDK接口和零件接口基本是一致的,只不过零件事件的使用需要和它所挂接的预设的类型匹配,否则有可能无法正常工作。
|
||||
|
||||
## 非空预设和空预设
|
||||
|
||||
在本章之前的所有内容中,我们都是把蓝图零件挂接在一个具体的预设上的,即非空预设。例如我们之前制作的监听实体受伤的事件,就是在玩家预设上挂接了一个蓝图零件。
|
||||
|
||||
但是,其实在预设分类中,还有一个比较特殊的预设,那就是空预设。
|
||||
|
||||

|
||||
|
||||
空预设不和任何实体、方块等游戏内元素挂钩,直接创建空预设并挂载蓝图零件会无法使用。
|
||||
|
||||

|
||||
|
||||
只有在空预设的属性处,勾选预加载,才会主动生效这个预设,在(0,100,0)的位置。具体说明可以把鼠标移动到预加载标签上进行查看。
|
||||
|
||||
如果勾选常加载,就不会随着区块卸载而取消加载这个预设。
|
||||
|
||||
一般来说,如果制作一些通用的蓝图零件,可以在空预设上挂接蓝图零件,并且勾选预加载和常加载,通过监听SDK事件来实现需要的功能。
|
||||
|
||||
## 课后作业
|
||||
|
||||
现在相信各位已经对于逻辑编辑器的基础用法基本上都了解了,那么现在尝试使用逻辑编辑器和预设功能,制作一个完整的玩法功能吧!
|
||||
|
||||
**作业要求:**
|
||||
|
||||
利用开发者工作台的编辑器,制作出一个幸运方块玩法
|
||||
|
||||
### 操作步骤
|
||||
|
||||
首先新建一个空白附加包。在关卡编辑器的菜单栏,找到作品,更改命名空间为`luckyblock`,这样我们的mod名就不再是随机的字符,同时如果玩家使用指令给予物品也更方便辨认。
|
||||
|
||||

|
||||
|
||||
接下来我们新建一个方块配置,命名为`luckyblock`,数据模板选择发光的普通方块。
|
||||
|
||||
自己绘制一个幸运方块的贴图,或者将下放的贴图保存,然后复制到`textures/blocks`中。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
然后设置一些相关属性,设置后如图所示。
|
||||
|
||||

|
||||
|
||||
这样我们就得到了一个会发光的,挖掉可以正常掉落的幸运方块。但是它还没有任何的实际功能。
|
||||
|
||||
接下来我们创建一个玩家预设,并且新建并挂载一个名为`LuckyBlock`的蓝图零件。
|
||||
|
||||

|
||||
|
||||
接下来打开`LuckyBlockPart`的蓝图逻辑,我们需要监听方块即将破坏的事件,判断是不是幸运方块,并且取消掉落物生成,再触发一个随机事件。
|
||||
|
||||
监听`ServerPlayerTryDestroyBlockEvent`零件事件,并将方块标识符和`luckyblock:luckyblock`进行字符串比较,如果`=`再进行下一步,将args中的`spawnResources`设置为False
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
接下来就是事件的随机了,我们这里简单做一个随机生成生物。要随机生成生物,我们首先就应该有一个随机的生物identifier列表。
|
||||
|
||||
首先在左侧变量窗口,我们新建一个`randomList`变量,定义它为我们的生物随机列表。
|
||||
|
||||
并且在服务端初始化时,给其赋值。
|
||||
|
||||
列表中我们这里给3个值,`minecraft:zombie`,`minecraft:skeleton`,`minecraft:creeper`,代表3种怪物。
|
||||
|
||||

|
||||
|
||||
接下来获取变量randomList,然后根据它的最大长度,进行随机,取一个[0,数量)的整数值,获取randomList中的属性,这样就可以得到一个随机的实体id。
|
||||
|
||||

|
||||
|
||||
接下来通过类型创建实体,实体类型就是我们随机获得的值。
|
||||
|
||||

|
||||
|
||||
最后将数据进行传递,生成坐标、纬度ID通过事件的参数获得,生成面向为一个0 0的二维坐标。
|
||||
|
||||
这样我们就完成了一个可以随机刷新生物的随机方块,那么更多的随机事件就可以由大家自行去探索。
|
||||
|
||||

|
||||
292
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/7-界面的制作和逻辑编写.md
Normal file
292
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/7-界面的制作和逻辑编写.md
Normal file
@@ -0,0 +1,292 @@
|
||||
---
|
||||
front:
|
||||
hard: 进阶
|
||||
time: 30分钟
|
||||
---
|
||||
# 界面的制作和逻辑编写
|
||||
|
||||
本节将会介绍如何使用界面编辑器、逻辑编辑器、预设编辑器,来制作一个界面。
|
||||
|
||||
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=63286c08e6c041f2578ca84e" width="800" height="600" allow="fullscreen"/>
|
||||
|
||||
## 界面绘制
|
||||
|
||||
首先来学习如何使用界面编辑器。切换到界面编辑器之后,我们首先需要创建一个界面,才能进行编辑。
|
||||
|
||||

|
||||
|
||||
在资源管理中,新建界面,我们给他命名成`团队名_界面名`,以防止冲突。这里我们叫做`soldier_screen`。
|
||||
|
||||
这样,我们选中刚创建的界面,就可以开始编辑了。界面的上方工具栏,是一些可以快捷创建界面控件的按钮。
|
||||
|
||||
点击这些按钮,就可以在被选中的结构下,创建一个新的控件。
|
||||
|
||||
左侧显示了目前界面的控件的父子关系,并且可以看到默认已经创建了一个main控件,这是一个画布,是一个界面的根控件。
|
||||
|
||||

|
||||
|
||||
接下来我们尝试制作一个简单的显示玩家实时坐标的界面。
|
||||
|
||||
例如现在我们点击上方的面板按钮,创建一个叫做`main_panel`的控件,在`main`下。
|
||||
|
||||
然后修改他的父子锚点到右下角,这样就可以看到面板的红色轮廓,被固定在了界面的右下角。
|
||||
|
||||

|
||||
|
||||
相应的,属性面板还可以设置它的位移坐标,尺寸大小。
|
||||
|
||||
例如我们这里将位移X改为`-10+父控件尺寸X*1%`,位移Y改成`父控件尺寸Y*-1%`。尺寸Y修改为20。
|
||||
|
||||
可以看到,尺寸控制了这个控件的大小,目前红色框为一个100x20的矩形。
|
||||
|
||||
而位移控制了它相对于锚点位置的偏移值。使用跟随父控件,可以基于百分比进行设置,这样可以在分辨率不同的情况下更好地进行界面的适配。
|
||||
|
||||

|
||||
|
||||
同时,游戏界面上方的分辨率选择框,可以选择预览的长宽比,我们这里选择`21:9`,可以看到位移X和Y,是基于父控件(目前是整个屏幕)的1%进行了偏移。
|
||||
|
||||
由此可以看出,使用百分比的相对位置进行布局,可以在屏幕分辨率不同的情况下,轻松地对界面的位置进行适配,而不会出现因为分辨率更变出现界面布局错乱的情况。
|
||||
|
||||
> 虽然基于百分比的布局这样看来很方便,但是它实际上是在界面初始化的时候,根据玩家屏幕的分辨率计算出来的值
|
||||
>
|
||||
> 在PC端游戏中途,调整窗口大小,分辨率动态改变的情况下,会出现布局错乱的情况。这就需要开发者们自行对比,选择更适合自己使用的。
|
||||
|
||||

|
||||
|
||||
设置完位置后,我们可以给这个面板添加一个图片,作为背景。
|
||||
|
||||
选中`main_panel`控件后,点击图片按钮,新建一个图片。
|
||||
|
||||

|
||||
|
||||
并且尺寸X,尺寸Y全部勾选适应。这样就可以使这个图片完全撑满它的父容器,即`main_panel`这个面板。
|
||||
|
||||

|
||||
|
||||
接下来,我们可以更换这个图片控件使用的图片资源,使用一个原版的图片资源。点击右侧文件夹按钮,选择图片`./ui/effect_background.png`
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
这样我们就成功给这个图片换成了药水效果的背景图片,这是一个原版的九宫格资源,如果自己绘制图片界面,建议让美术同学绘制九宫格资源,具体的规则[点我](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/16-%E7%BE%8E%E6%9C%AF/50-%E8%B4%B4%E5%9B%BE%E8%A7%84%E8%8C%83%E5%8F%8A%E4%B9%9D%E5%AE%AB%E6%A0%BC%E4%BD%BF%E7%94%A8.html)。
|
||||
|
||||
接下来我们可以,继续在`main_panel`下创建一个文本控件,同样尺寸X,尺寸Y适应,并给它改名为`pos_text`。
|
||||
|
||||
需要注意的是,目前我们所创建的所有控件的命名,都是为了后续编写逻辑的时候更方便的通过它们的名字来找到它们。
|
||||
|
||||
比如我们现在的这个文本控件,所在的路径就应该是`/main_panel/pos_text`,后面我们可以使用逻辑编辑器,通过逻辑节点找到它,并修改它的值。
|
||||
|
||||

|
||||
|
||||
## 创建预设
|
||||
|
||||
绘制完了界面,我们就需要到预设编辑器,创建一个界面预设。
|
||||
|
||||

|
||||
|
||||
第一个文件命名我们这里叫做`PosUI`,需要保证这个名字唯一,它将会被用作创建这个界面的标识符。
|
||||
|
||||
同时底部还有一个文件命名,这里是对应的界面的控制文件命名,也需要保证每个界面对应的文件唯一。
|
||||
|
||||

|
||||
|
||||
预设创建完成后,就可以看到界面中已经自动勾选了我们之前所编辑的界面,如果没有,可以在`绑定的界面画布`处自行选择。
|
||||
|
||||
在属性窗口中,主要需要关注的就是下面框选的地方。
|
||||
|
||||

|
||||
|
||||
### 预加载
|
||||
|
||||
预加载**一定要勾选**,只有勾选了预加载,这个界面才会被显示。
|
||||
|
||||
### 绑定的界面画布
|
||||
|
||||
选择界面编辑器中的界面文件和对应的画布,画布一般是main。
|
||||
|
||||
### 显示方式
|
||||
|
||||
#### CreateUI
|
||||
|
||||
使用CreateUI创建的界面,会直接在玩家的游戏界面上进行叠加。
|
||||
|
||||
一般适用于创建HUD。
|
||||
|
||||
#### PushScreen
|
||||
|
||||
使用PushScreen创建的界面,会以栈的形式来创建一个界面,在游戏中只显示这个界面,不显示类似物品栏,操作按钮等界面。并且在PC端调用会自动呼出鼠标。
|
||||
|
||||
一般适用于创建类似箱子,熔炉等单独的操作界面。
|
||||
|
||||
### Hud
|
||||
|
||||
勾选Hud,那么界面将会悬浮在游戏窗口中,不会影响游戏的实际交互。
|
||||
|
||||
例如原版中的血条,饱食度,物品栏的界面,就都是Hud。
|
||||
|
||||
### 逻辑编写
|
||||
|
||||
那么完成了配置,我们的界面进入游戏之后就可以正常显示了。
|
||||
|
||||
接下来我们就要创建一个蓝图UI零件,来为这个界面编写逻辑。
|
||||
|
||||

|
||||
|
||||
同样的,把新创建的零件,挂接到界面预设上。然后双击逻辑文件,打开逻辑编辑器。
|
||||
|
||||

|
||||
|
||||
可以看到,相比于一般的蓝图零件,多了一块UI相关的事件监听。
|
||||
|
||||
其中,`创建`和`监听`,是使用任意方式创建的界面,可以触发的函数。而`激活时`和`反激活`时,是使用`PushScreen`方式创建的界面,额外会触发的事件。
|
||||
|
||||
|
||||
|
||||
接下来,我们要实现实时更新坐标,就需要在服务端每刻处,创建一个`GetBaseUIControl`接口的节点,用来获取对象。
|
||||
|
||||

|
||||
|
||||
节点中的控件路径,就是我们之前的文本标签`/main_panel/pos_text`,经过这个节点的运算,就可以得到文本所对应的基础控件对象,我们接下来要把它转换成更加具体的文本控件对象,才能更改文本的值。
|
||||
|
||||

|
||||
|
||||
找到`asLabel`接口,将它转换成文本控件对象,然后再次调用`SetText`节点,设置文本的值。
|
||||
|
||||
那么文本的值就需要我们获取玩家的坐标信息,查阅文档,使用`GetPos`即可,并拼接字符串。
|
||||
|
||||

|
||||
|
||||
完成后效果如图,这样就可以在客户端每Tick中,更新文本控件的内容,实时显示坐标。
|
||||
|
||||
当然这也是有很多可以优化的地方的,例如我们的坐标信息其实并不需要1秒更新30次。
|
||||
|
||||
进入游戏后,可以看到右下角出现了界面,并且显示了我们的实时坐标。
|
||||
|
||||

|
||||
|
||||
不过由于小数点过长,不能完整显示。大家可以自行尝试修改界面位置到屏幕的正中间,并修改尺寸X,来让图片包住文本。
|
||||
|
||||

|
||||
|
||||
只需要将`main_panel`的锚点全部修改为中上方的即可。
|
||||
|
||||
|
||||
|
||||
总结下来,需要在逻辑中,修改界面内部的数据,总共有一下几个步骤
|
||||
|
||||
1. 根据控件路径,通过`GetBaseUIControl`,获取基础控件示例
|
||||
2. 根据控件的具体种类不同,通过`asXXXX`,将其转换为具体的示例(例如我们这里的Label文本,类似的还有Button按钮)
|
||||
3. 调用对应的示例内的接口,来达到实际修改的效果
|
||||
|
||||
所有UI相关接口,都可以在[文档](https://mc.163.com/dev/mcmanual/mc-dev/mcdocs/1-ModAPI/%E6%8E%A5%E5%8F%A3/%E8%87%AA%E5%AE%9A%E4%B9%89UI/UI%E6%8E%A7%E4%BB%B6.html?catalog=1)中查到。
|
||||
|
||||
## 课后作业
|
||||
|
||||
课后作业要求制作一个界面,将玩家输入的内容通过title的方式,广播给所有在线玩家。
|
||||
|
||||
### 界面绘制
|
||||
|
||||
- 创建一个`soldier_title_screen`界面,进行编辑。
|
||||
- 添加一个叫`main_panel`的面板,锚点居中,尺寸X和尺寸Y分别为200,150。
|
||||
- `main_panel`下添加图片,尺寸X,尺寸Y适应,图片更换为原生图片`./ui/achievements_dialog.png`。
|
||||
|
||||

|
||||
|
||||
- 这样就完成了一个简单的窗口框架。接下来我们添加 文本输入框 和 按钮,在`main_panel`节点下。
|
||||
- 将文本输入框的尺寸修改为`180,27`,名称修改为`title_text`。
|
||||
- 将按钮的名称修改为`confirm_button`尺寸X修改为50,尺寸Y修改为20。字体缩放倍数修改为0.5,文本修改为`发送`。位移Y设置为`35`。
|
||||
|
||||
完成后效果如图,大家可以自由发挥,为页面添加更多元素。例如添加一个文本框,并填写:`发送title的内容`,作为提示。
|
||||
|
||||
并且可以自由调整这个界面的尺寸,让它看起来更加美观。
|
||||
|
||||

|
||||
|
||||
例如这里添加了一个文本作为标题。
|
||||
|
||||

|
||||
|
||||
这样我们就完成了界面的编辑,大家可以参照自己的界面,是否和教程中的路径一致。
|
||||
|
||||
需要检查的是文本框的路径是否为`/main_panel/title_text`,按钮的路径是否为`/main_panel/confirm_button`,后面逻辑的编写会用到。
|
||||
|
||||
### 创建预设
|
||||
|
||||
新建一个界面预设,文件命名都改为`TitleScreen`。
|
||||
|
||||

|
||||
|
||||
1. 勾选预加载
|
||||
2. 修改绑定的界面画布为`soldier_title_screen`
|
||||
3. 修改显示方式为PushScreen
|
||||
|
||||

|
||||
|
||||
接下来新建一个蓝图UI零件,进行挂接,并打开对应的逻辑文件。
|
||||
|
||||
### 逻辑编写
|
||||
|
||||
在创建时,根据路径获取按钮的实例,并开启按钮的回调功能。具体操作如下:
|
||||
|
||||

|
||||
|
||||
需要注意的是,参数字典,可以在[文档](https://mc.163.com/dev/mcmanual/mc-dev/mcdocs/1-ModAPI/%E6%8E%A5%E5%8F%A3/%E8%87%AA%E5%AE%9A%E4%B9%89UI/UI%E6%8E%A7%E4%BB%B6.html#addtoucheventparams)中找到,这里我们直接设置为True。
|
||||
|
||||

|
||||
|
||||
接下来我们新建一个自定义接口`f_ConfirmButtonClick`,用来编写按钮点击之后的响应逻辑。并添加一个类型为Any的参数,命名为`args`,这个是按钮的点击事件参数,具体类型为一个dict,可以打印查看,我们可以不使用,但是需要在自定义接口中设置这个参数。
|
||||
|
||||
首先我们正常获取这个文本框的实例,然后获取其中的文本,这就是我们要发送的内容。
|
||||
|
||||

|
||||
|
||||
接下来因为要调用命令来发送title,而UI是客户端逻辑,不能直接调用服务端接口。所以我们需要使用通知服务端接口,来发送这个信息到服务端,并让服务端来处理这个数据。
|
||||
|
||||
通知服务端接口主要需要2个参数,一个是事件名称,一个是事件数据。
|
||||
|
||||
事件名称应该是一个文本,可以自己根据喜好来起名,用来区分每个通信的内容。在整个玩法组件的开发中,应该和其功能对应唯一。
|
||||
|
||||
例如我们这里设置为`SendTitle`,那么就应该认定,所有发送title数据的通信,都用这个事件名称来定义,防止数据混淆。
|
||||
|
||||
事件数据应为一个Dict,是具体的事件数据的载体,会完整地发送到服务端。
|
||||
|
||||
|
||||
|
||||
了解了通信的基本流程之后,就可以来编写对应的逻辑。
|
||||
|
||||
这里我们构造一个字典,key1为`text`,value1为title的内容,并把这字典作为事件数据,发送事件`SendTitle`到服务端。
|
||||
|
||||
发送完毕后,调用`PopScreen`,来以堆栈管理的形式关闭这个界面。
|
||||
|
||||

|
||||
|
||||
编辑完这个函数,我们回到Graph界面,在开启按钮回调功能之后,使用`SetButtonTouchUpCallback`设置这个按钮的回调函数。
|
||||
|
||||
这个接口的调用对象为按钮控件示例,回调函数,通过**获取零件变量**,获取名为`f_ConfirmButtonClick`的自定义接口,即我们刚刚编辑的函数。
|
||||
|
||||

|
||||
|
||||
完成了客户端的按钮的逻辑,就需要在服务端监听这个自定义事件,来完成title信息的发送。
|
||||
|
||||
同样需要新建一个自定义接口,我们这里新建一个叫做`f_OnRecvTitle`的自定义接口,参数同样是any类型的args,这个参数就是我们从客户端发送过来的字典。
|
||||
|
||||
然后我们在服务端初始化的时候,使用获取自身接口,再获取零件变量,获取到我们名为`f_OnRecvTitle`的自定义接口作为回调函数,然后调用监听自身事件,来监听我们的`SendTitle`事件
|
||||
|
||||

|
||||
|
||||
接下来我们继续编辑`f_OnRecvTitle`来获取args参数中的text文本。并将它和title命令`title @a title `拼接(注意最后有一个空格),最后在游戏内执行。
|
||||
|
||||

|
||||
|
||||
这里我们打印了输入参数的args,方便大家更直观的在日志中看到args中的内容。
|
||||
|
||||
需要注意的是,使用游戏内指令这个接口根据文档,有3个参数,其中`playerId`和`showOutput`都是可以选参数,我们这里都选择不填,所以需要将这个节点的这两个参数均删除,否则仍然算作填写了一个空的str参数。
|
||||
|
||||
至此,我们的界面就制作完成。如果在关闭界面之后仍然需要打开,则可以调用`PushScreen`来打开,其中命名空间和界面名称都可以在我们界面预设处可以找到,打开参数可以不用填写。
|
||||
|
||||
命名空间可以命名成自己的mod英文名,在关卡编辑器上方的作品按钮,可以找到
|
||||
|
||||

|
||||
|
||||

|
||||
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/01.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/01.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/02.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/02.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/03.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/03.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/04.gif
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/04.gif
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/05.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/05.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/06.gif
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/06.gif
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/07.gif
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/07.gif
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/08.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/08.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/09.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/09.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/10.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/10.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/100.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/100.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/101.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/101.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/102.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/102.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/103.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/103.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/104.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/104.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/105.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/105.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/106.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/106.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/107.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/107.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/108.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/108.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/109.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/109.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/11.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/11.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/110.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/110.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/111.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/111.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/112.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/112.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/113.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/113.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/114.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/114.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/12.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/12.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/13.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/13.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/14.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/14.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/15.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/15.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/16.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/16.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/17.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/17.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/18.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/18.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/19.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/19.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/20.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/20.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/21.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/21.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/22.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/22.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/23.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/23.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/24.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/24.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/25.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/25.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/26.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/26.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/27.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/27.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/28.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/28.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/29.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/29.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/30.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/30.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/31.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/31.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/32.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/32.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/33.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/33.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/34.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/34.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/35.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/35.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/36.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/36.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/37.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/37.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/38.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/38.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/39.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/39.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/40.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/40.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/41.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/41.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/42.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/42.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/43.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/43.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/44.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/44.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/45.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/45.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/46.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/46.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/47.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/47.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/48.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/48.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/49.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/49.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/50.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/50.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/51.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/51.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/52.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/52.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/53.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/53.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/54.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/54.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/55.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/55.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/56.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/56.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/57.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/57.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/58.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/58.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/59.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/59.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/60.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/60.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/61.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/61.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/62.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/62.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/63.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/63.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/64.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/64.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/65.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/65.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/66.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/66.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/67.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/67.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/68.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/68.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/69.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/69.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/70.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/70.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/71.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/71.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/72.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/72.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/73.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/73.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/74.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/74.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/75.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/75.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/76.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/76.png
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/77.png
LFS
Normal file
BIN
docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/2-逻辑编辑器基础/images/77.png
LFS
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user