first commit

This commit is contained in:
boybook
2025-03-17 13:24:39 +08:00
commit 9a0334ee84
6410 changed files with 221907 additions and 0 deletions

View File

@@ -0,0 +1,76 @@
# 认识新版逻辑编辑器
在本次更新中,我们上线了新版逻辑编辑器。相比旧版逻辑编辑器,我们做出了一些重大的改进,主要包括:
1图标的组织形式更新为节点式
![](./images/1-1.png)
2逻辑文件现在更名为蓝图脚本每个蓝图脚本都固定绑定到了一个蓝图零件上将蓝图零件挂接到预设下即可使其中的逻辑生效
![image-20211102174048791](./images/1-2.png)
3提供了模组SDK的所有接口以及大幅扩展了对python原生接口的支持
![](./images/1-3.png)
4支持编写客户端逻辑特效音效模型动画等
![](./images/0-5.png)
5独立的变量和自定义接口管理
![](./images/0-1.png)
6更多的起始事件完整的事件系统支持
![](./images/0-2.png)
7支持了循环逻辑
8支持编写UI蓝图
![](./images/0-4.png)
9我们为绝大部分节点添加了汉化尽力减少了语言壁垒给模组开发带来的不便
![](./images/1-4.png)

View File

@@ -0,0 +1,74 @@
# 需要了解的基础概念
## 预设与实例
预设Preset就是预先设定的意思。即开发者们可以将方块、素材、实体、特效以及玩法逻辑拼装成一个预设。在使用时一个预设作为一个整体被放置在游戏中被放置到游戏中的预设被称为实例。
关于预设和实例的更多信息请访问[这篇文档](../../14-预设玩法编程/0-第一个预设Mod/1-新建预设并添加素材.md)。
## 零件
零件Part是预设架构下一种可以挂接到预设下的玩法逻辑对象。当我们把逻辑写到零件代码里再将零件挂接到一个生效的预设下时零件的逻辑也会随之生效。
关于零件的更多信息请访问[这篇文档](../../14-预设玩法编程/0-第一个预设Mod/4-创建和挂接零件.md)。
## 蓝图
在新版逻辑编辑器中,我们通过节点式编程的形式,将不同的节点通过执行连线和数据连线相连构成节点网络,从而编写一套完整的逻辑。这些承载了节点与连线的图表,我们将其称为**蓝图**Blueprint。蓝图需要用新版逻辑编辑器进行编辑。
![](./images/1-1.png)
## 蓝图零件
蓝图零件BlueprintPart顾名思义则是一种使用蓝图编写零件逻辑的特殊零件。与普通零件相比蓝图文件在资源管理器的文件夹中多了一个.bp文件即蓝图脚本文件。在资源管理器中双击.bp文件即可在资源管理器中打开该蓝图零件的蓝图图表进行编辑。
![](./images/1-5-1.png)
## 事件
事件Event是模组SDK架构的核心组成部分也是编程的一类常用技术。模组SDK的事件系统可以参考这篇文档[事件简介](../../../20-玩法开发/13-模组SDK编程/2-Python脚本开发/9-事件简介.md)。
简单来说,事件系统就是用于写明白在某种情况触发的时候应该执行什么逻辑。例如“当玩家点击潜行键时播放角色蹲下的动画”,那么“当玩家点击潜行键时”就是一个事件。当监听到这个事件后,系统就会执行“播放角色蹲下的动画”这个逻辑。
在蓝图中,事件监听节点是蓝图逻辑网络执行的起点,通过事件节点连出的执行引线连接一系列接口,那么系统监听到这个事件时,后续的一系列节点逻辑都会被按顺序执行。
![](./images/1-5-2.png)
## 接口
接口Interface在蓝图中是节点图表的一种可以从其他蓝图图表中调用其内部逻辑。
我们将所有的SDK接口以及大量的python接口都制作成了内置接口放在右键菜单中供开发者直接调用开发者无法直接修改这些接口的逻辑同时我们还允许开发者创建自定义接口编写自己需要的节点逻辑。
**举个例子:**我们在下面这个自定义接口图表中编写好了Interface_1这个自定义接口的逻辑
![](./images/1-5-3.png)
然后在跟图表中调用Interface_1就可以直接复用其内部逻辑进行运算。
![](./images/1-5-4.png)
## 变量
变量Variable用于储存值或对象属性可通过获取变量节点调用变量值也可以通过设置变量节点为该变量设置新的值。
![](./images/1-5-5.png)

View File

@@ -0,0 +1,62 @@
# 创建蓝图零件
## 创建一个蓝图零件
![2-1](./images/2-1.gif)
正如普通零件一样,蓝图零件也可以通过新建文件向导创建。点击资源管理器左侧的【新建】按钮打开新建文件向导,选择蓝图零件,创建一个空的蓝图零件。你可以为蓝图文件自定义名称(需注意,当前仅支持纯英文、数字命名)。创建新的蓝图零件后,下方资源管理器将自动跳转到新创建的零件目录。
## 两种蓝图零件
正如在新建文件向导的蓝图零件页面显示的那样,蓝图零件目前共有两种:
1蓝图零件即普通的用蓝图脚本撰写逻辑的零件
2UI蓝图零件专门为UI控制而编写的蓝图零件其中包含了部分专用于UI控制的事件、接口。
### 蓝图零件
![2-2](./images/2-2.png)
蓝图零件的目录下会自动创建如下5个文件以默认命名Blueprint为例
1Blueprint.part
2BlueprintPart.bp
3BlueprintPart.py
4BlueprintPartMeta.py
5\_init_.py
相比与普通零件这里新增了一个BlueprintPart.bp。这里的.bp文件即是我们的 **蓝图脚本** 文件,对其进行**双击**,即可在新版逻辑编辑器中打开对应的蓝图脚本,通过可视化的节点式编程进行逻辑编辑。
### UI蓝图零件
UI蓝图零件目录下会自动创建如下6个文件以默认命名BlueprintUI为例
1BlueprintUI.part
2BlueprintUIPart.bp
3BlueprintUIPart.py
4BlueprintUIPartMeta.py
5BlueprintUIPartUI.py
6\_init_.py
与蓝图零件类似该目录下我们可以编辑的是BlueprintUIPart.bp。对其进行**双击**即可在新版逻辑编辑器中打开对应的UI蓝图脚本进行编辑。

View File

@@ -0,0 +1,68 @@
# 新版逻辑编辑器界面
打开新版逻辑编辑器的界面,你会发现界面与旧版编辑器相比有不小的改变。新版界面主要包括如下几个部分:
![](./images/2-3.png)
## 工具栏
![](./images/2-4.png)
工具栏固定显示在逻辑编辑器的顶部,用于访问常用的命令按钮。其中有两个需稍作说明:
1浏览在资源管理器重定位当前蓝图零件脚本的位置
2运行使用ModPC开发包运行当前作品用以测试蓝图逻辑是否正常运行。
## 导航栏
![](./images/2-5.png)
导航栏用于陈列不同的蓝图脚本文件,当你同时打开不同的蓝图脚本文件时,它们将以选项卡的形式陈列在此处,点击即可在不同蓝图脚本间快速切换。
## 脚本元素窗口
![](./images/2-6.png)
脚本元素窗口默认停靠在屏幕最左侧,用于显示或创建蓝图中图表、自定义接口、变量等自定义元素内容,以便让使用者更加便捷地查看蓝图现有元素或创建新元素。脚本元素窗口主要包括节点图、自定义接口、变量三个区域,用户可点击每个模块右上角的“+”按钮新增对应的元素,也可右键点击现有元素,进行重命名、删除等操作。双击节点图或自定义接口,还可打开对应图表/子图表,进行内部逻辑编辑。
## 图表编辑窗口
![](./images/2-7.png)
图表编辑窗口是新版逻辑编辑器的核心窗口,你可以在此创建事件、接口等节点,并将它们用执行或数据引线相连,从而撰写零件的脚本逻辑。
如果你在蓝图脚本中创建了自定义接口你就会需要接口图表来编辑这个自定义接口的内部逻辑。在脚本元素窗口双击该自定义接口即可打开其接口图表通常包含一个输入接口和一个输出接口此时会在图表编辑区域的左上角显示面包屑导航例图在这个截图中就展示了在Graph1图表中打开了Interface_1的接口图表点击面包屑导航上的Graph1即可返回Graph1图表
![](./images/2-9.gif)
## 属性窗口
![](./images/2-10.png)
属性窗口主要用于编辑被选中项的属性。在脚本元素窗口或者图表编辑窗口中选中某个对象,即可在右侧属性窗口中展示出它的各类属性信息,并可供开发者自行按需修改。
_需注意:部分自定义节点属性通过图表中直接选中可能无法完整获取,请在左侧脚本元素窗口中选中后,再在属性窗口中修改。_
## 查找结果窗口
![](./images/2-11.gif)
查找结果窗口用于让开发者输入查询的节点名称、引脚名称或关键词,展示符合条件的查找结果,并可通过双击结果转到对应的节点。
如果你关闭了查找结果窗口可通过快捷键ctrl+F再次调出。

View File

@@ -0,0 +1,167 @@
# 脚本元素
在新版逻辑编辑器中,我们的“脚本元素”通常指如下几类:
| 脚本元素 | 描述 |
| :------- | ------------------------------------------------------------ |
| 事件 | 事件节点是节点网络的逻辑起点,当某个事件被触发后,即会执行该事件节点后连接的所有节点逻辑。<br />当前版本的逻辑编辑器,仅支持通过右键菜单创建编辑器自带的事件,暂时不支持开发者自定义事件 |
| 接口 | 接口是节点图表的一种,可以从其他蓝图图表中调用其内部逻辑 |
| 变量 | 用于储存值或对象属性,可通过获取变量节点调用变量值,也可以通过设置变量节点为该变量设置新的值 |
## 事件
事件是模组逻辑代码的起点,所以任何一条蓝图执行逻辑都必须要以一个事件监听节点为起点,这样整条执行连线串联起来的逻辑链才能够被执行。
![](./images/3-3.gif)
### 默认起始事件
以蓝图零件为例其在新建时会默认自带6个起始事件监听节点分别为
**1、客户端默认起始事件**
| 事件名称 | 事件英文名 | 描述 |
| :----------- | ------------- | ------------------------------------------------------------ |
| 客户端初始化 | InitClient | 客户端初始化,可以作为客户端逻辑的入口 |
| 客户端每刻 | TickClient | 客户端每刻执行的逻辑从这里连出在我的世界中1秒由30刻组成 |
| 客户端销毁 | DestroyClient | 客户端销毁时执行的逻辑(预设销毁时,它下面挂的所有预设/零件/素材也都会跟着销毁) |
![](./images/3-1.png)
**2、服务端默认起始事件**
| 事件名称 | 事件英文名 | 描述 |
| :----------- | ------------- | ------------------------------------------------------------ |
| 服务端初始化 | InitServer | 服务端初始化,可以作为客户端逻辑的入口 |
| 服务端每刻 | TickServer | 服务端每刻执行的逻辑从这里连出在我的世界中1秒由30刻组成 |
| 服务端销毁 | DestroyServer | 服务端销毁时执行的逻辑(预设销毁时,它下面挂的所有预设/零件/素材也都会跟着销毁) |
![](./images/3-2.png)
### 创建事件监听节点
除了创建蓝图时默认生成的初始事件监听节点,逻辑编辑器还有丰富的事件库供开发者选择。可以通过在图表空白处点击右键打开节点列表,直接在列表中选择需要添加的时间监听节点;如果知道事件的中文/英文名称,也可通过输入关键词的形式找到该事件监听节点。
![](./images/3-4.gif)
## 接口
新版逻辑编辑器为开发者提供了丰富的接口来实现你的创意。这些接口既包括现有中国版模组SDK里的全部接口也包括一些Python自带接口和逻辑编辑器自带接口。
### 自带接口
自带接口指的是编辑器自带的内置游戏接口、Python接口以及一些辅助逻辑完成的基础接口。正如在“事件”部分中描述的那样你可以通过在图表空白处右键的方式新建接口监听/调用节点;此外,你也可以在拖出执行或数据连线后松开鼠标左键,从自动弹出的节点菜单中选择/搜索你需要的接口监听/调用节点。
![](./images/3-5.gif)
### 自定义接口
除了右键菜单中的这些编辑器内置接口,新版逻辑编辑器还支持开发者创建自定义接口。找到左侧脚本元素窗口中的【接口】选项卡,点击其右上角的”+“号,即可新建一个自定义接口。
> 创建时可为该自定义接口重命名,仅支持英文、数字和下划线(接口名只能以英文字母开始)。
自定义接口像其他接口一样,拥有一个调用调用节点,触发后即会执行该接口内的蓝图逻辑。
![](./images/3-6.gif)
在左侧脚本元素窗口选中自定义接口后,可在右侧属性窗口修改该自定义接口的属性:
- 纯接口:可选项。勾选后该自定义接口将转为纯接口(无执行输入、输出引脚)
- 参数inputParams点击“+”可为该自定义接口添加参数,支持编辑参数名和参数数据类型;点击垃圾桶按钮可以清除已添加的参数
- 返回值outputParams点击“+”可为该自定义接口添加返回值,支持编辑返回值名和返回值数据类型;点击垃圾桶按钮可以清除已添加的返回值
自定义接口创建后,在左侧脚本元素窗口双击该自定义接口(或者直接在图表中双击该接口的调用节点),即可打开该自定义接口的 **接口图表**。接口图表用于编写接口的内部逻辑。每个接口图表都会自带一个输入Input和一个输出Output节点输出节点是接口的逻辑起点同时用于将参数传入接口内部逻辑输出节点是接口逻辑的终点同时用于将运算完的数据以返回值的形式传出接口。
正如在普通蓝图图表中使用节点编写逻辑一样,你可以在接口图表中使用各类节点,并用执行连线将他们构成一个完整的逻辑网络,但是整个接口的内部逻辑必须是以执行连线从输入节点,经过内部其他节点,能够顺利走向输出节点的。
![](./images/3-7.gif)
## 变量
**变量****蓝图零件变量**,用于储存值或对象属性,可以通过左侧脚本元素窗口的【蓝图零件变量】选项卡右上角的“+”按钮创建变量。变量在创建后可以自行重命名。
> 【**注意**】
> 1. 对蓝图零件变量做出的所有修改都必须【保存】蓝图之后才会生效。
> 2. 蓝图零件变量的命名只能包含**英文**、**数字**、**下划线**不能超过20个字符**且只能以'v_'开始**。
![](./images/801.gif)
蓝图零件变量创建后,**如果开发者按下【保存】按钮**,则该变量会同步显示到该蓝图零件的 **.part** 文件的属性面板中,这样开发者在其他编辑器中就可以在不打开蓝图文件的情况下,直接修改该蓝图零件变量的默认值了。**注意必须先关闭蓝图,才能在其他编辑器修改蓝图零件变量的值,否则会发生冲突报错。**
![](./images/803.png)
> 【**注意**】
>除了【蓝图零件变量】选项卡,早期蓝图还有一个【变量】选项卡,在后续版本会逐步淘汰。
>![](./images/802.png)
### 变量属性
在左侧脚本元素窗口单击选中变量,可以在右侧属性窗口浏览该变量的全部属性,并可以修改其中的一部分。主要包括:
- **变量名**字符串支持英文、数字、下划线。变量名暂不支持在右侧属性面板直接修改可在左侧【蓝图零件变量】窗口选中需要修改的变量右键选中【重命名】或直接按下F2键修改变量名。
- **变量显示文本**:即该变量在蓝图零件.part文件属性面板中显示的名称可以支持中英文、数字、符号。注意需要保存之后对显示文本的修改才会生效
- **变量分组**:即定义该变量在蓝图零件.part文件属性面板中所在的分组。默认分组名为【蓝图零件】开发者可任意修改。注意所有的修改都需要保存才能生效
如果改为当前属性窗口中不存在的分组名,则会在属性窗口中创建一个该名称的分组,并将这个变量放入其中;
如果改为当前属性窗口中已经存在的分组名,则会直接将这个变量放入该分组。
- **变量类型**:通过下拉框可以选择该变量的数据类型。变量数据类型主要包括:
1布尔值假false0真true1
2浮点型有符号1.234, -3.14
3整型有符号1, 2, 3, 0, -1, -2, -3
4字符串由数字、字母、下划线组成的一串字符"abc", "123", "abc_123"
- **默认值**:编辑该变量的默认值
![](./images/804.gif)
### 获取变量
有两种途径可以在蓝图中获取get一个变量中存储的值
1. 直接拖出右键节点菜单,并输入该变量的变量名关键词即可搜索到它的【获取】节点(你也可以在右键菜单中的【零件变量】子目录下找到它;
>
2. 将变量从左侧脚本元素窗口中拖动到图表中,松开后从弹出的下拉列表中选择获取节点。
![](./images/805.gif)
### 设置变量值
如果你想为现有的变量设置set一个新的值那么有两种方式可以做到
1. 直接在右键中搜索该变量名,创建该变量的【设置】节点,再为这个设置节点传入新的值;
2. 将变量从左侧脚本元素窗口中拖动到图表中,松开后从弹出的下拉列表中选择设置节点,再为这个设置节点传入新的值。
为变量传入新的值也有两种操作方式:
1. 通过数据连线连接到设置节点的参数引脚
2. 直接在设置节点的参数输入框中输入
![](./images/806.gif)

View File

@@ -0,0 +1,173 @@
# 节点连接
节点是一个蓝图图表的基本组成元素之一。通过将蓝图的节点连接起来,形成一个完整的逻辑网络,我们就可以让这些节点的逻辑按顺序/条件执行,从而写出符合游戏设计需求的逻辑。每一个脚本元素都有自己对应的一个或多个节点,下面让我们简单了解一下这些节点的使用方法。
> 关于脚本元素的更多介绍请 [点击此处查看](./40-脚本元素.md) 。
## 节点组成部分
一个常见的节点通常包括以下几个部分:
1. 节点名称:用于节点间相互区别
2. 执行引脚:包括输入执行引脚和输出执行引脚,下文有详细说明
3. 数据引脚:包括参数输入引脚和返回值输出引脚,下文有详细说明
> 节点种类多样,功能不同决定了节点样式不同。有些节点并不会包含上述三种组成部分的全部,比如变量设置节点没有返回值、纯接口没有执行引脚等。
![](./images/5-1.png)
## 创建节点
尽管节点种类繁多,但基本都可以通过下面的两种方式创建:
1、图表空白处右键会弹出节点菜单从中选择你需要的节点也可直接输入节点名称关键词搜索
2、从其他节点的引脚处按住一个左键拖拽出来松开左键后从弹出的节点菜单中选择或搜索你需要的节点
> 对于自定义接口、变量等在左侧窗口中有显示的脚本元素,可以直接通过从左侧窗口中拖拽至图表,松开鼠标后,即可生成与之相关的节点
![](./images/5-2.gif)
## 节点选择与移动
1、单个节点单个节点可以通过单击直接选中。选中后节点底色会发生变化。按住鼠标左键可拖拽改变该节点在图表中的位置。
![](./images/5-3.gif)
2、多个节点可以通过在图表中拖动鼠标框选或通过按住ctrl连续单击选中多个节点。选中后按住鼠标左键拖拽可同时改变全部被选中节点的位置。
![](./images/5-4.gif)
## 节点的引脚
节点共有2种引脚执行引脚和数据引脚。
![](./images/5-5.png)
-- to do 图片替换-自定义接口
### 1. 执行引脚
执行引脚用于控制逻辑的执行顺序,分为输入执行引脚和输出执行引脚。
- 输入执行引脚在节点的左上角。当输入执行引脚被通过黄色的执行连线与其他节点相连时,会被激活,开始执行该节点的逻辑。
- 输出执行引脚在节点的右上角。当节点逻辑执行完毕后,输出执行引脚会被激活,当这个引脚被通过执行连线与其他节点相连时,则会继续执行后续的流程。
节点不一定会有一对输入执行引脚和输出执行引脚。例如纯接口调用节点既没有输入执行引脚也没有输出执行引脚条件节点有1个输入执行引脚和2个输出执行引脚顺序遍历节点有2个输入执行引脚和2个输出执行引脚。具体哪个执行引脚被执行有连线和具体节点逻辑判断。
> 可以有多条执行引线连入同一个执行引脚,同样的,同一个输出执行引脚也可以发出多条执行连线。
>
>
### 2. 数据引脚
节点的数据引脚主要用于数据的输入和输出,分为参数输入引脚和返回值输出引脚。
- 参数输入引脚在节点的左侧,需要与绿色的数据连线相连。通过将数据连线与参数输入引脚相连,可将数据传入该节点,并赋值给这个参数。
- 返回值输出引脚在节点的右侧,需要与绿色的数据连线相连。通过将数据连线与返回值输出引脚相连,可将数据以返回值的形式从该节点传递出去。
节点的数据引脚数量没有限制,也可以没有参数输入引脚或返回值输出引脚(即该节点没有参数或没有返回值)。
> 同一个返回值输出引脚可以发出多条数据连线,向不同节点传输同一个数据,但是同一个参数输入节点只能有一条数据连线传入数据,否则会引起混乱。
需要注意的是数据引脚是与该节点的参数或返回值的数据类型一一对应的所以两个数据类型不同或者不兼容的数据引脚是不可以通过数据连线直接进行数据传递的。例如节点A的返回值类型是Int节点B的参数类型是Bool那么这两个数据引脚是不可以直接相连的但如果节点B的参数类型是Any即不限制传入数据的类型则二者可以直接相连。
## 节点的连线
节点共有2种连线执行连线和数据连线。
![](./images/5-6.png)
-- to do 图片替换-自定义接口
### 1. 执行连线
执行连线是黄色的,用于连接各个节点的执行引脚,形成一个完整的节点网络,从而正确地执行整个蓝图的逻辑。
> 注意:在非特殊情况下,不要使用执行连线将同一个节点的输入执行引脚和输出执行引脚相连。
### 2. 数据连线
数据连线是绿色的,用于连接各个节点的数据引脚,从而保证数据在各个节点间的正确传递。
> 注意:在非特殊情况下,不要使用数据连线将同一个节点的参数输入引脚和返回值输出引脚相连。
## 一些节点连接的规则
尽管蓝图节点的连接相对自由,但是其中还是有一些规则需要遵守:
### 1. 数据引脚的数据类型限定
数据引脚是与该节点的参数或返回值的数据类型一一对应的所以两个数据类型不同或者不兼容的数据引脚是不可以通过数据连线直接进行数据传递的。例如节点A的返回值类型是Int节点B的参数类型是Bool那么这两个数据引脚是不可以直接相连的但如果节点B的参数类型是Any即不限制传入数据的类型则二者可以直接相连。
![](./images/5-7.gif)
### 2. 两个支持端冲突的节点不可以直接相连
根据功能不同,每个节点的支持端是不同的。共分为以下三类:
1双端支持该节点既可以用于服务端逻辑也可以用于客户端逻辑。
2仅客户端支持该节点仅可用于客户端逻辑不能与仅服务端支持的节点相连。
3仅服务端支持该节点仅可用于服务端逻辑不能与仅客户端支持的节点相连。
例如“监听:玩家升级时”是一个仅服务端支持节点,而“调用:客户端设置左上角通知内容”是一个仅客户端支持节点,二者之间是不可以直接相连的。
![](./images/5-8.gif)
### 3. 同侧引脚不可以直接相连
不可以将一个节点的输入引脚与另一个节点的输入引脚相连(无论是执行还是数据引脚);
不可以将一个节点的输出引脚与另一个节点的输出引脚相连(无论是执行还是数据引脚)。
![](./images/5-1.gif)
### 4. 数据输入引脚不可以有多条数据连线传入
节点的执行输入引脚可以有多条执行连线传入,但是数据引脚不能有多条数据连线传入。
![](./images/5-9.gif)

View File

@@ -0,0 +1,101 @@
# 事件监听与广播
## 事件简介与引擎事件
事件是模组SDK架构的核心组成部分也是编程的一类常用技术。模组SDK的事件系统可以参考这篇文档[事件简介](../../../20-玩法开发/13-模组SDK编程/2-Python脚本开发/9-事件简介.md)。
在我的世界中国版的游戏进行的过程中模组SDK会在各种时机广播一些事件比如游戏开始时玩家加入时等等我们监听这些事件然后在这些事件触发的时候执行相应的逻辑即可对游戏产生影响。
![image-20211104104739344](./images/image-20211104104739344.png)
模组SDK中有大量已经内置在我的世界中的事件他们被称为引擎事件可以参考技术手册的这篇文档<a href="../../../../mcdocs/1-ModAPI/事件/世界.html" rel="noopenner"> 世界 </a>。
![image-20211104105446744](./images/image-20211104105446744.png)
如果你使用Python编程的话需要手动监听引擎事件但是对于蓝图来说并不需要。
当你想要监听某个引擎事件时,你只需要添加一个对应的节点即可,比如希望在玩家发送聊天信息的时候执行某些逻辑。
如下图(你可以在新的指令模板里找到),当玩家发送聊天信息时,会走到这个节点,并且执行后面的打印信息节点,将信息内容打印出来。
![image-20211104111554404](./images/image-20211104111554404.png)
## 模组SDK事件与零件事件
零件事件是预设架构的事件系统在模组SDK事件的基础上进行了一些改进。可以参考这篇文档[零件事件](../../../20-玩法开发/14-预设玩法编程/2-深入理解零件/0-零件开发.md#零件事件)。
我们以<a href="../../../../mcdocs/1-ModAPI/事件/实体.html#actorhurtserverevent" rel="noopenner"> 服务端生物受伤事件 </a>为例,他在技术手册中的文档如下:
![image-20211104112640545](./images/image-20211104112640545.png)
当你在逻辑编辑器中使用这个节点时,你会发现两个版本:
- 监听事件……这个是模组SDK的事件节点
- 监听零件事件……:这个是零件事件的节点
![image-20211104112722262](./images/image-20211104112722262.png)
这两种节点目前看起来没有什么区别,你只能选中他们,在属性面板上查看。
![image-20211104113645797](./images/image-20211104113645797.png)
如下图模组SDK事件“监听事件”打头的节点的类型为SdkEventNode而零件事件“监听零件事件”打头的节点的类型为PartEventNode。
![image-20211104113749053](./images/image-20211104113749053.png)
对于生物受伤来说如果你希望当前场景中的任何一个生物在受伤的时候都会从监听节点开始执行一些逻辑那么你应该使用模组SDK事件“监听事件”打头的节点。当然后续你可以根据伤害来源实体ID来判断到底是谁触发的这个事件。
零件事件只用于预设架构,如果你使用了实体预设/玩家预设,并且将你的蓝图零件挂接在了这个预设下,那么如果使用零件事件的话,只有实际受伤/造成伤害的生物玩家才会监听到这个事件并且执行后续的逻辑在某些情况下你可以省去判断ID的步骤。即如果你希望只有零件挂接的当事人触发这个事件那么建议使用零件事件。
使用零件事件通常会拥有更好的性能,尤其是如果你把零件挂接在会生成大量实例的预设下的时候,比如覆盖原版的僵尸预设。
## 监听和广播自定义事件
除了自带的引擎事件外,你自己也可以使用这套事件系统。事件系统的主要目的是实现逻辑的解耦。
与旧版的逻辑编辑器相比新版的基于预设架构的逻辑编辑器的bp文件往往比旧版的ets文件数量更多如果有良好的代码习惯的话你的逻辑应该被合适的解耦并写到不同的零件中挂接到合适的预设下。
比如跟HUD相关的UI写到界面蓝图零件里并且挂接到界面预设下跟玩家有关的逻辑写到另外一个零件挂接到玩家预设下。
在这种前提下,你就需要使用事件系统来进行不同零件(实例)之间的通讯(沟通)。
我们以跑酷模板为例。
如下图这是在服务端进行事件监听的节点节点4为“监听预设系统事件”节点一般使用这个节点进行监听即可。这个事件有3个参数需要填写
- 事件名称:建议起一个表意清晰的名称,支持中文
- 目标对象当触发这个事件的时候希望谁对象实例做出反应我们在这里是希望自身做出反应所以使用节点2获取到自身然后把值传进去了
- 回调函数当触发这个事件的时候希望执行哪个函数我们在这里希望执行自身的Place函数自定义接口所以使用节点3获取到自身的Place接口并且把值传进去了
我们希望达到的最终效果是接收到“放置红石”的消息时在零件的位置放置一块红石表意精准哈哈这是个服务端的操作所以我们需要在服务端初始化的时候进行监听即节点1执行的时候进行监听。
在监听完成之前,是不会收到消息的,所以一般监听都是在最开始的时候,如果需要执行服务端的逻辑,就在服务端进行监听,否则在客户端。
![image-20211109204301000](./images/image-20211109203335707.png)
除了监听之外,我们还需要在合适的时机发送事件,发送事件使用下面这个节点,需要注意两个参数:
- 事件名称:即我们定好的名称
- 事件数据如果不需要传递数据的话这个参数留空即可如果需要传递数据的话一般需要传递一个字典由于我们的参数类型没有支持字典dict可以先选择any代替。然后在事件接收方执行的函数里通过获取属性的方式获取传过去的参数。
调用发送事件后,如果我们的零件可以接收到事件,就可以顺利的执行对应的逻辑了。
![image-20211109211258319](./images/image-20211109211258319.png)
需要传递参数的发送事件,和执行接收事件对应的函数如下图(这里用的通知,和广播类似,参考[网络通讯(服务端客户端)](./48-网络通讯(服务端客户端).md))。
![image-20211109211820719](./images/image-20211109211820719.png)
![image-20211109212110498](./images/image-20211109212110498.png)
## 监听和广播零件事件
上一节的预设系统事件在不涉及具体的零件时比较适用,如果你希望只监听来自特定零件(实例)的事件,或者只通知到某些特定的零件(实例),你需要使用“监听零件事件”的接口。
这个接口有4个参数需要关注
- 零件ID即监听来自哪个零件的消息只有这个零件发送的消息才会被监听到这个是与上一节的“预设系统事件”的主要区别。
- 事件名称,目标,函数,与上一节的意义相同。
![image-20211109224625106](./images/image-20211109224625106.png)

View File

@@ -0,0 +1,91 @@
# 网络通讯(服务端客户端)
## 什么是服务端、客户端?
当你运行我的世界的时候,一部分逻辑是在服务端跑的,另一部分是在客户端跑的,两者之间有着较为严格的界限。
如果涉及到数据同步的逻辑,一般都是需要在服务端运行的,这样当你进行多人游戏的时候,每个玩家才会看到其他玩家的行为。
比如实体(或者)生物的移动/位置,攻击,血量计算,生成实体/方块等等等等。
如果无需数据同步,或者只是表现层的逻辑,一般在客户端运行即可。
比如使用自定义模型,动画,特效,音效等等,以及界面,按键等等交互内容。
客户端是运行在本地的,即你当前游玩我的世界使用的电脑或者手机,而服务端的逻辑视情况而定,如果你在进行单机游戏,那么服务端也是运行在本地设备上的,如果你进行联机游戏,那么所有玩家的服务端逻辑都是运行在房主的设备上的,如果你在玩服务器(比如租赁服或者网络游戏),那么服务端的逻辑是运行在服务器上的。
注意,由于客户端和服务端相对分割,所以在任何时候都不能在一端调用另外一端的逻辑!
## 服务端节点,客户端节点
所有的节点都被区分为3类
- 仅服务端节点,他们只能运行在服务端
- 仅客户端节点,他们只能运行在客户端
- 双端节点,在服务端和客户端都能跑,会根据当前执行的环境改变逻辑
下图是创建一个蓝图零件时默认写到蓝图里的节点可以看到包含3个服务端的节点和3个客户端的节点你需要根据上述的标准判断自己需要从哪个端的节点连出后续的逻辑。
![image-20211109203119882](./images/image-20211109203036317.png)
如下图,你可以点击节点,在他的属性面板里查看他支持哪个端。
你自己创建的所有自定义接口都是双端支持的(无法修改这一属性,即使你没有做双端的支持)。
![image-20211110001957475](./images/image-20211110001957475.png)
如下图,我们目前在节点连接的规则里添加了这样的规则:在一个互相联通的图表里,不能同时存在仅客户端和仅服务端的逻辑。
![image-20211110095111391](./images/image-20211110095111391.png)
## 网络通讯
如上节所述,我们无法直接在一端直接调用另一端,如果我们需要此类的逻辑,可以通过事件监听和网络通讯来实现。
我们以蓝图的指令系统为例,里面有一个需求是当玩家输入“@击杀”时,我们需要获取到准星指向的目标,然后将其击杀(如果是实体的话)。我们拆分一下需求会发现:
- 判断聊天信息是服务端逻辑
- 获取准星指向的目标是客户端逻辑
- 击杀实体是服务端逻辑
这三个逻辑之间都是无法直接调用的,于是我们需要采取下面这种方式。
首先,在判断玩家输入的消息是“@击杀”后向客户端发送一个叫做“准星目标”的事件调用“通知客户端”接口注意因为我们只想要输入这条聊天信息的玩家获取他的准星目标所以我们在这里需要把玩家id设置为该玩家的在之前的逻辑里此处不做展示
![image-20211110100119250](./images/image-20211110100119250.png)
然后我们在客户端初始化的时候监听“准星目标”这个事件在收到该事件的时候执行自定义的“PickEntityClient”接口如下图第2个节点
![image-20211110100631985](./images/image-20211110100631985.png)
在“PickEntityClient”接口里我们获取到准星处的实体后将该数据通过“通知服务端”接口发送到服务端事件名为“杀死实体”。
![image-20211110100801003](./images/image-20211110100801003.png)
同理我们需要在服务端初始化的时候监听“杀死实体”事件并在接收到事件的时候执行自定义接口“KillEntityServer”。
![image-20211110101353293](./images/image-20211110101353293.png)
在这个接口中我们最终获取到传过来的实体id数据实现对这个id的实体的击杀。
![image-20211110101500037](./images/image-20211110101500037.png)
## 事件与网络通讯总结
结合[事件监听与广播](./47-事件监听与广播.md),我们可以总结一下此类节点的用法。
如果你需要通知到其他零件,或者自身执行一些逻辑,又不方便直接调用接口的时候,你需要使用下面这些节点:
- 广播事件:适用于在同一端的情况,比如服务端广播到服务端,客户端广播到客户端
- 通知服务端:适用于在客户端,通知服务端执行某些逻辑
- 通知客户端:适用于在服务端,通知某个(玩家的)客户端执行某些逻辑
- 向所有客户端广播:适用于需要所有(玩家的)客户端都执行的逻辑
![image-20211110102654036](./images/image-20211110102654036.png)
然后事件的接收方,需要在服务端初始化,或者客户端初始化的时候(一般是在这个时候,有需要的话可以在任意时候)进行监听。
- 监听预设系统事件:常用的监听方式
- 监听零件事件:只希望监听来自某个零件的事件
![image-20211110103110489](./images/image-20211110103110489.png)

View File

@@ -0,0 +1,53 @@
# 界面蓝图
此部分较难,推荐观看下列视频
- [更换模型和添加界面](../30-新版示例教程(视频)/07-制作简易射击附加包(视频)/01.md)
- [开关瞄准镜](../30-新版示例教程(视频)/07-制作简易射击附加包(视频)/02.md)
## 创建蓝图和组装预设
我们提供的蓝图简易射击模板里有界面蓝图的使用,可以参考他的写法进行学习。
新版逻辑编辑器支持制作界面,在制作前,你可能需要先了解一下[界面预设](../../11-组装简单玩法/10-预设/5-界面预设.md)。
在创建完UI预设之后你可以通过新建文件向导创建一个UI蓝图。
![image-20211110231943840](./images/image-20211110231943840.png)
注意想要UI蓝图零件生效你必须将其直接挂接到对应的UI蓝图下类似下图。
![image-20211110232306239](./images/image-20211110232306239.png)
## 起始事件
打开UI蓝图零件除了蓝图零件自带的6个事件之外你会发现他还有4个额外的UI相关的事件如下图分别是
- 创建UI创建成功时一般在这里进行UI逻辑的初始化
- 激活反激活时当你的UI被激活或者取消激活时
- 销毁你的UI被销毁时
![image-20211110231901698](./images/image-20211110231901698.png)
可以查看一下你的UI预设如果你选择的CreateUI那么你主要使用上述的“创建”节点否则选PushScreen你主要使用“激活”和“反激活”节点。
![image-20211110232517582](./images/image-20211110232517582.png)
## 调用接口
界面相关的接口主要分布在下图的菜单中。
![image-20211110233301115](./images/image-20211110233301115.png)
我们以设置控件显示为例,下面这个节点是我们需要使用的节点
- 控件路径:希望对哪个控件调用
- 是否可见:希望控件显示还是隐藏
- 是否强制刷新:是否在调用接口后立刻刷新这个控件的显示状态
![image-20211110233153639](./images/image-20211110233153639.png)
对于控件路径,我们可以在界面编辑器中获取,比如右键复制下面这个控件的路径,并粘贴到上图的节点中。
![image-20211110233812392](./images/image-20211110233812392.png)

View File

@@ -0,0 +1,27 @@
# 蓝图测试
下面我们将演示蓝图的测试:
我们以一个挂在预加载空预设下的蓝图零件为例该蓝图的逻辑是每帧在日志窗口打印一句hello。
![](./images/6-2.png)
![image-20211101231504319](./images/6-1.png)
在.bp文件中编辑完蓝图的逻辑后首先需要点击保存按钮保存蓝图。
![](./images/6-0.png)
保存蓝图之后,我们点击运行按钮,即可在开发包中测试我们的蓝图逻辑:
![](./images/6-4.png)
初次进入时,可能需要等待较长的时间以完成加载。
![6-5](./images/6-5.png)
进入游戏后我们打开日志窗口即可看到每帧都会打印一句hello证明该蓝图零件的逻辑已在游戏中生效。
![](./images/6-6.png)

View File

@@ -0,0 +1,42 @@
# 错误解决
一般情况下由于我们对蓝图做出了诸多的连接限制使用蓝图很少会出现语法错误但是仍然可能出现一些逻辑上的错误当出现错误bug的时候你就需要用到一些简单的技巧来排查和解决这些错误。
与模组SDK的代码编程类似我们没有提供单步调试的功能你只能通过观察日志的方式来解决bug。
## 打印信息
打印print在大部分情况下都是你最好的伙伴出现任何费解的问题都可以通过打印看一下当前的情况。
目前我们支持一种简单的打印:打印信息,以及三种复杂的打印方式:调试,错误和消息日志。将这些节点如下图连接好,并且填上相应的信息,然后点击运行。
![image-20211103214353278](./images/image-20211103213847820.png)
运行后,你可以在脚本测试日志里看到如下的信息。将你认为有问题的值连接到打印节点的信息处即可将他们打印出来。
![image-20211103215513698](./images/image-20211103215513698.png)
如下图我们可以将玩家发送的信息和玩家id同时打印出来。
![image-20211110105959120](./images/image-20211110105139129.png)
下图即输入黑曜石之后的打印结果。
![image-20211110110938554](./images/image-20211110110938554.png)
Python的大部分变量都是可以打印的包括数字字典甚至是零件和预设对象你可以直接打印“获取自身”的返回节点试一下。
## 详细调试日志
有时,如果懒得打印,或者没有特别的打印需求,可以直接点击觉得有问题的节点,并勾选详细调试日志,如果这个节点被正确的跑到了,那么会在日志里显示节点执行的详细信息。
![image-20211110111335551](./images/image-20211110111335551.png)
下图就是这个节点的详细信息,我们只需要关注黄框内的基础信息:
- apiName是哪个接口与这个节点的英文名称对应可以在节点的属性面板找到
- portData字典显示你传入的所有参数
- constants也是参数但只显示你在节点直接输入的参数
![image-20211110112352851](./images/image-20211110112352851.png)

View File

@@ -0,0 +1,29 @@
# 在文档中查阅内置游戏接口
新版编辑器有大量的**内置游戏接口**开发者在使用时可能难以通过节点本身样式了解到该节点是如何使用的。在这种情况下开发者可以使用节点的接口名在官网API文档中查阅对应接口的说明。
第一步选中节点在右侧属性窗口中找到该内置游戏接口的接口名通过ctrl+c复制下来。
![](./images/7-1.png)
第二步:打开开发者官网的[API文档](https://mc.163.com/dev/mcmanual/mc-dev/mcdocs/0-%E6%A6%82%E8%BF%B0/0-%E6%A6%82%E8%BF%B0.html)。
![](./images/7-2.png)
第三步:将复制下来的接口名粘贴到页面搜索框中,然后在弹出的搜索结果中根据接口类别找到对应的接口。
![](./images/7-3.png)
第四步:点击后,会自动跳转到对应接口的说明文档。
![](./images/7-4.png)

View File

@@ -0,0 +1,99 @@
# 节点基础
新版逻辑编辑器提供的蓝图在使用上与Python代码保持着比较大的一致性。使用不同类型的节点会有不同的规则。
## 让蓝图生效
注意,想要让你写的节点图运行起来,你需要将蓝图零件挂接至一个勾选有预加载的空预设(请参考[新建预设并添加素材](../../14-预设玩法编程/0-第一个预设Mod/1-新建预设并添加素材.md)),或者挂接至预设,并将其通过关卡编辑器放置在场景中。
![image-20211103214606192](./images/image-20211103214606192.png)
![image-20211103214626299](./images/image-20211103214626299.png)
## 监听和调用
通过在图表的空白处右键浏览节点时,你会发现我们相同的节点会有不同的前缀,分别是“监听”和“调用”。
![image-20211103204900301](./images/image-20211103204900301.png)
调用的意思是执行这个接口的操作比如“发送向某个玩家聊天框消息”如下图你可以看到调用类型的节点既有“In”也有“Out”有执行引脚才能连到节点图中用于执行逻辑。
监听的意思是当“发送聊天框消息”这个接口被调用的时候。可以看到监听类型的节点没有“In”只有“Out”因为它表示一个时机在这个时机生效并开始顺序想“Out”连接的节点执行。
![image-20211103205025435](./images/image-20211103205025435.png)
## 调用对象和静态方法
这部分需要你对面向对象有一个基本的概念,这是一个编程的概念,如果你不知道的话,可以看这个视频:[什么是面向过程编程,面向对象编程](https://www.bilibili.com/video/BV1pV411d7sL?from=search&seid=7248194267465509786&spm_id_from=333.337.0.0)UP主对此进行了深入浅出的讲解。
我们以下面两个节点举例,第一个节点是静态方法,不需要对象即可调用。
第二个节点是零件的节点,只能通过零件的对象(实例)调用,你可以发现在此类节点的参数中,都包含一个“调用对象”。
![image-20211103210846572](./images/image-20211103210846572.png)
如果你希望自身去调用这个接口这个零件本身去执行这个接口你需要通过自身self调用即下面这样。但是这种情况实在是太多了所以我们做了简化处理即如果调用对象没有传入数据那么就默认调用对象的是自身self
![image-20211103211835382](./images/image-20211103211835382.png)
现在举另外的例子,比如,你希望摧毁自己的父对象,那么显然你需要让“父对象”去调用摧毁这个接口,如下图(因为要销毁的是预设对象,你需要使用预设对象的销毁接口)。
![image-20211103212200759](./images/image-20211103212200759.png)
![image-20211103212241434](./images/image-20211103212241434.png)
## 获取/设置变量
我们提供了独立的变量管理功能,在新建变量之后,你可以通过直接将变量拖拽出来,并选择获取和设置两种功能节点:
- 获取在获取的value输出节点可以获取到这个变量的值
- 设置在设置的value节点可以传入或者直接编辑希望设置的值
![image-20211110173230125](./images/image-20211110173230125.png)
## 获取/设置自定义接口
除了变量之外在Python里函数自定义接口也可以作为一种变量但是我们目前没有提供拖拽自定义接口来获取或者设置的方法。
你需要使用这两个节点来获取和设置自定义接口:
- 获取零件变量在key里面输入接口名称就可以从value节点获取到接口了
- 设置零件变量在key里面输入接口名称就可以把这个接口设置为value节点传入的节点
![image-20211110175952305](./images/image-20211110175952305.png)
## 零件预设接口和SDK组件接口
我们以传送玩家为例可以看到3种不同的调用接口
- 维度组件服务端接口归属于模组SDK的接口
- 零件接口:归属于预设架构的接口
- 预设对象接口:与零件接口基本一致
![image-20211110230003065](./images/image-20211110230003065.png)
下图左边是维度组件服务端接口右边是零件接口我们可以对照他们的api文档进行讲解。
![image-20211110230242256](./images/image-20211110230242256.png)
下图是维度组件服务端调用传送玩家的接口,我们重点关注他的示例。
![image-20211110230548813](./images/image-20211110230548813.png)
可以看到这里是先给player玩家创建了一个Dimension组件然后再调用组件执行后续的传送逻辑。
```python
import mod.server.extraServerApi as serverApi
comp = serverApi.GetEngineCompFactory().CreateDimension(playerId)
comp.ChangePlayerDimension(0, (0,4,0))
```
所以这个节点的entityId应该传我们希望进行传送的玩家。
![image-20211110231010069](./images/image-20211110231010069.png)
像下图的零件接口的版本,翻译比较清晰。
![image-20211110231230648](./images/image-20211110231230648.png)
建议在有类似这种有相同名称的接口的情况下,直接选择零件接口。

View File

@@ -0,0 +1,121 @@
# 常用节点
## 参数节点
参数节点可通过右键菜单直接创建用于构造并传递对应类型的参数共有以下3类
#### 1构造列表ListParameterNode
用于构造一个列表,并传递给下一个节点。可以通过右边属性窗口【长度】属性修改列表长度。列表元素可以分别选择数据类型,并直接填入值。同时,也可以通过数据连线将值传入列表,对列表元素进行赋值。
![](./images/42-1.gif)
#### 2构造列表ListParameterNode
用于构造一个字典并传递给下一个节点。可以通过右边属性窗口【长度】属性修改字典键值对数。字典的键key)、值value可以分别选择数据类型但一般键都会是字符串Str。键和值都可以直接填写也可以通过数据连线将值传入。
![](./images/42-2.gif)
#### 3其他参数节点
剩余的参数节点共有5种分别是任意类型参数Any、布尔型参数Bool、整型参数Int、浮点型参数Float、字符串参数Str。这些类型可用于固定值的传入以及同一个值同时传入多个节点的情况方便统一修改
![](./images/49-3.png)
![](./images/42-4.png)
## 定时器
定时器是一种用于延迟执行自定义接口的节点,我们提供了:
- 添加定时器:在一段延迟时间后,执行函数
- 添加重复定时器:在一段延迟时间后,重复执行函数,重复的时间与延迟时间相同
函数使用获取自定义接口的方法获取比如我们下图中我们希望每隔1秒执行一次Ticking函数。
![image-20211110172933248](./images/image-20211110172933248.png)
添加定时器的输出节点是定时器实例,如果你想要停止定时器,你可以
- 在添加定时器的时候,将返回值设置到一个变量中
- 获取变量,并调用取消定时器的接口
![image-20211110193210054](./images/image-20211110193210054.png)
## 条件和阀门
当你想编写分支逻辑的时候,你需要用到条件节点或者阀门节点
- 条件根据传入的bool布尔值判断如果是真true执行“真”连出去的逻辑否则执行“假”连出去的逻辑
- 阀门对传入的input1和input2进行判断如果他们相等那么继续向后执行否则不再继续执行
![image-20211110205224092](./images/image-20211110205224092.png)
如下图,这个是跑酷模板的一部分逻辑,如果可以获取到红石预设的话,我们就销毁这个红石,如果获取不到,我们就生成一个红石。
![image-20211110212643504](./images/image-20211110212643504.png)
## 拆分/合并坐标
如果一个节点需要tuple元组类型的参数除了通过list列表转化为tuple之外你可以通过下面4个节点进行2,3个元素的tuple的拆分和合并。
![image-20211110213136712](./images/image-20211110213136712.png)
例如下面这个例子我们要判断玩家的高度是否小于80需要用到这个接口他的返回值是一个包含3个float的tuple。
![image-20211110213654548](./images/image-20211110213654548.png)
我们可以这样连接蓝图。
![image-20211110213400957](./images/image-20211110213400957.png)
需要传入tuple同理参考下面的蓝图可以把玩家传送到0175-3处。
![image-20211110213836400](./images/image-20211110213836400.png)
## 枚举节点
如果你遇到某些节点需要传入枚举值数据,那么枚举节点可以很方便地帮你找到对应的枚举值。
在逻辑编辑器的节点菜单中,我们可以找到 **“枚举节点”**,在它的二级菜单中有我们可能用到的所有枚举值类型。
![](./images/12.png)
例如我们需要“盔甲槽位”枚举值,可以直接需要传入枚举值的引脚拖出连线,调出节点菜单,然后在 **“枚举节点”** 中选择 **“构造 盔甲槽位 枚举值”**,即可创建该枚举值节点。想要选择具体传入的值,我们直接在右侧属性窗口的 **“盔甲槽位”** 下拉框中选择需要的值即可。
![](./images/13.gif)
## 循环
我们很开心的告诉大家,旧版逻辑编辑器不支持的循环在新版里得到了支持。你可以看到下面两种节点,他们的生效机制略有不同,我们分开来讲。
![image-20211110214107115](./images/image-20211110214107115.png)
下图是顺序循环遍历节点的使用示例从起始索引开始向终止索引按照1的步长每次迭代执行一次循环体并在迭代结束后执行遍历完成。
![image-20211110214520598](./images/image-20211110214520598.png)
他的日志输出结果如下图。
![image-20211110214852572](./images/image-20211110214852572.png)
另外一种循环是对列表的所有元素进行迭代,这种循环的应用场景要广泛的多。我们的很多接口都会返回一个列表,除了直接获取第几个元素之外,我们最常见的应用方法还是直接使用条件循环对其进行迭代。
循环的另外一个功能是,当有输入从循环节点的跳出连进去时,直接跳出这个循环(立刻执行遍历完成的逻辑)。
![image-20211110215505160](./images/image-20211110215505160.png)
上图的日志结果如下图所示。
![image-20211110215446972](./images/image-20211110215446972.png)

View File

@@ -0,0 +1,78 @@
# 万能节点
## 获取/设置属性
这两个节点几乎可以用于任何对象的属性获取和设置
- 对象:从“谁”那获取
- key获取哪个属性
- 值:获取的值
![image-20211110221804343](./images/image-20211110221804343.png)
例如你可以通过这个节点获取字典某一个key对应的值
![image-20211110222644905](./images/image-20211110222644905.png)
获取列表的某个元素也可以使用这个节点如下图在key里填写1即可获取到列表的第2个元素列表的元素的序号是从0开始的
![image-20211126145506399](./images/image-20211126145506399.png)
## 调用零件接口
目前我们已经支持了几乎所有的零件接口,如果你还是会遇到零件接口确实,或者参数/返回值缺失等等情况,那么你可以直接使用“调用零件接口”,在他的属性界面进行设置。
- 输入参数可以增加输入参数参数的名称随意但是类型需要尽量和官方文档里的类型匹配如果没有可以设置为any
- 输出端口:与输入类似,对应文档的输出
- 调用接口:填写接口的名称
![image-20211110223110612](./images/image-20211110223110612.png)
调用零件接口只能在<a href="../../../../mcdocs/3-PresetAPI/预设对象/零件/零件PartBase.html" rel="noopenner"> 零件PartBase </a>的接口中寻找。
如图可以使用partbase和其继承的接口。
![image-20211110223749837](./images/image-20211110223749837.png)
例如下面这个接口。
![image-20211110224142679](./images/image-20211110224142679.png)
可以在进行如下简单设置后直接使用。
![image-20211110224407274](./images/image-20211110224407274.png)
## 调用预设对象接口
与调用零件接口非常类似。
![image-20211110224447563](./images/image-20211110224447563.png)
适用于下面的所有分类下的接口。
![image-20211110224633204](./images/image-20211110224633204.png)
![image-20211110224701846](./images/image-20211110224701846.png)
注意,这些接口往往不是通过零件自身调用的,调用对象一般不能留空,例如。
这个是玩家对象的接口,只能由玩家预设(继承自玩家对象)来调用。
![image-20211110224828594](./images/image-20211110224828594.png)
## 调用预设管理接口
与上面的节点类似,适用于<a href="../../../../mcdocs/3-PresetAPI/预设管理/PresetApi.html" rel="noopenner"> PresetApi预设管理接口 </a>的直接调用。
![image-20211110224928639](./images/image-20211110224928639.png)
## SDK组件接口
与上面的节点类似,分为服务端和客户端两种不同的接口。
![image-20211110225234874](./images/image-20211110225234874.png)
适用于Mod API的接口的调用。
![image-20211110225314449](./images/image-20211110225314449.png)

View File

@@ -0,0 +1,25 @@
# 使用变长参数
变长参数是Python的一种函数的参数用法现阶段的逻辑编辑器没有自动支持但是需要的时候你仍然可以自主添加。
目前的内置接口里,涉及到变长参数的有下面这些
- AddRepeatedTimer添加重复定时器
- AddTimer添加定时器
- LogDebug调试日志
- LogInfo消息日志
- LogError错误日志
不同节点的变长参数的作用不同,我们以“添加重复定时器为例”。下图是其在技术手册中的<a href="../../../../mcdocs/3-PresetAPI/预设对象/通用/SDK接口封装SdkInterface.html#addrepeatedtimer" rel="noopenner"> 文档 </a>。
在文档的参数表格中可以看到,这个节点最后包括一个变长参数和一个字典变长参数。
![image-20211104095205627](./images/image-20211104094208227.png)
在逻辑编辑器中添加这个节点,点击节点,可以在节点的属性面板中看到它的输入参数(一般情况下,对于内置节点来说这个是无需改动的)。
![image-20211109194323495](./images/image-20211109194323495.png)
我们按照技术手册的文档为这个函数手动增加两个参数,就可以使用变长参数了,如下图。对于定时器来说,你可以给变长参数传递触发函数所需要的参数,是一种比较常见的用法。
![image-20211109195209563](./images/image-20211109195209563.png)

View File

@@ -0,0 +1,51 @@
# 将旧版逻辑编辑器作品到新版
## 打开ets文件
新建新版作品和旧版作品升级的方法请见[创建新版作品](../../14-预设玩法编程/0-第一个预设Mod/0-创建新版作品.md)。
对于逻辑文件来说,旧版编辑器使用的是.ets文件而新版使用的.bp文件。
新版逻辑编辑器的改动非常大无法正常支持ets文件你只能在旧版编辑器里打开并在新版编辑器中再连接一遍对此带来的问题我们深表歉意。
新版编辑器虽然不支持打开ets但是ets文件仍然是生效的并且手机和电脑端的我的世界也将继续支持使用ets的模组。
如果你需要继续编辑ets可以打开旧版编辑器使用逻辑编辑器的打开功能选择需要编辑的ets文件这一步可以是任意目录不需要是作品自身的目录
![image-20211103112229909](./images/image-20211103112229909.png)
## 新旧逻辑文件的对比
新旧逻辑编辑器在形式和功能上有巨大的差异,但是底层逻辑实际是相似的。
下图是跑酷模板的开头,我们现在将其转换为新版的写法。
![image-20211104134712751](./images/image-20211104134712751.png)
他们的对应关系可以参考下面的表格。
| 旧版逻辑编辑器 | 新版逻辑编辑器 |
| ------------------------------------------ | ------------------------------------------------- |
| 语句 | 节点 |
| 箭头引脚(语句的突起和凹陷) | 节点的执行引脚“In”相当于凹陷“Out”相当于突起 |
| 事件语句(橙色),只有突起(用于引出箭头) | 事件节点只有“Out”引脚 |
| 临时变量 | 变量 |
| 宏 | 自定义接口(功能有一定区别) |
对于变量来说,旧版逻辑编辑器的变量只出现在语句之间,而新版有了正式的变量,并且移除了旧版的临时变量。
你可以看到新版逻辑编辑器的左侧有变量的管理界面,你可以在这里新建/删除/重命名变量,并且设定变量的类型和默认值。例如上图的最后一个语句(设置一个临时变量的默认值),在新版的结构中就不再需要一个单独的节点了。
![image-20211104145352011](./images/image-20211104144804209.png)
新版逻辑编辑器引入了几乎所有对中国版模组开发有用的节点,并且删除了大量之前的语句,例如你可以看到,“世界创建完成时”语句被替换成了“服务端初始化”,“获取当时时间”被替换成了“当前时间戳”。
## 旧逻辑文件的使用
无论你是使用旧版逻辑文件ets还是新版逻辑文件bp你都需要用到零件。
除了在熟悉的世界零件里添加ets之外你可以在任意零件的属性面板里发现逻辑文件点击“+”即可添加一个逻辑文件的选择下拉框在这里选择ets文件即可。
只把ets配在这里是不会让他在游戏内生效的你需要将零件挂接在预设中并且让预设最终在游戏内实例化。相关的文档可以查看这里[在场景中实例化](../../14-预设玩法编程/0-第一个预设Mod/2-在场景中实例化.md)。
![image-20211109195754625](./images/image-20211109195754625.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 899 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 612 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 903 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 732 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 939 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 951 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

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