feat:上传mcguide-开发指南部份
4
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/00-教程视频.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# 教程视频
|
||||
|
||||
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=6194d3f448e2749089207e3c" height="600" width="800" allow="fullscreen" />
|
||||
|
||||
54
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/10-准备工作.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# 准备工作
|
||||
|
||||
|
||||
|
||||
## 制作目标
|
||||
|
||||
本系列文档会带您一步一步从0开始学习如何使用新版逻辑编辑器制作您的第一个蓝图Mod。
|
||||
|
||||
我们为这个Mod定下的目标是:制作出一只每次受到实际伤害后会移动速度翻倍的动物(我们先以猪为模板制作),当它的速度达到上限后将不再增加。
|
||||
|
||||
这是一个非常简单的逻辑,但可以让初学者了解一些基本的概念和新版逻辑编辑器的使用方式。
|
||||
|
||||
|
||||
|
||||
## 新建作品
|
||||
|
||||
我们需要通过新版编辑器创建作品,这样才能使用新版逻辑编辑器。
|
||||
|
||||
如果你尚不清楚如何创建新版作品,请参考[这篇文章](../../14-预设玩法编程/9-第一个预设Mod/0-创建新版作品.md)。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 准备地图
|
||||
|
||||
我们将会需要一个固定的场地来做测试。因为我们的实验对象(那只可爱的猪)最后可能有非常离谱的速度,所以我们需要一个相对封闭的场地将它的活动范围限制住。这里你可以用2格高的墙将它围起来,当然更简单的方式,就是在地图编辑器中,使用一块被栅栏围住的小型平地(例如下图中的塔顶)。
|
||||
|
||||
> **第一次使用地图编辑器?**
|
||||
>
|
||||
> 你可以查看《[地图编辑器使用说明](../../../14-地图制作/2-地图编辑器使用说明.md)》了解它的基本操作方式。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 准备实体预设(实验对象)
|
||||
|
||||
下面我们需要准备一只猪,作为实验对象。这里我们需要用到新版编辑器的实体预设来制作它。
|
||||
|
||||
首先我们点击下方资源管理器界面的【新建】按钮,在【预设】菜单下选择【实体预设】,点击【下一步】。然后我们可以在实体列表中通过关键词搜索找到“猪”,并在下方文件命名处将其命名为“Pig”。最后点击绿色的【创建】按钮,即可通过预设编辑器打开我们新创建的Pig实体预设。
|
||||
|
||||

|
||||
|
||||
我们接下来可以在【关卡编辑器】中,将刚刚创建好的Pig预设拖到场景中,并放置到刚刚用栅栏圈出的区域里,这样它就不会导出乱跑了。
|
||||
|
||||
放置完成后务必记得点击右上角的【保存】按钮,勤保存是一个很好的习惯。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**在下一篇文档中,我们将使用蓝图零件,来为这只猪附上蓝图脚本。**
|
||||
|
||||
32
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/20-创建并挂接蓝图零件.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# 创建并挂接蓝图零件
|
||||
|
||||
|
||||
|
||||
在新版逻辑编辑器中,我们使用节点式编程的形式编写逻辑,而这些承载了节点与连线的图表,我们将其称为**蓝图**。
|
||||
|
||||

|
||||
|
||||
正如我们在之前的文档中介绍的那样,零件是预设架构下,一种可以挂接到预设下的玩法逻辑对象。而蓝图零件,顾名思义,则是一种使用蓝图编写零件逻辑的特殊零件,需要用新版逻辑编辑器进行编辑。
|
||||
|
||||
|
||||
|
||||
## 创建蓝图零件
|
||||
|
||||
我们可以使用新建文件向导创建蓝图零件。例如当前处于关卡编辑器界面,你可以点击左下角资源管理器的【新建】按钮打开新建文件向导,选择【蓝图零件】-【空蓝图零件】,然后点击【下一步】。接着你可以为这个蓝图零件命名,比如我们这里需要让这个蓝图零件起到调整速度的作用,那么我们就先起名为“SpeedChange”。
|
||||
|
||||
> 零件、预设等的命名是比较自由的,但是一个清晰的命名可以帮你提升查找速度。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 蓝图零件挂接到实体预设
|
||||
|
||||
零件都需要挂接到预设下才能生效。我们这里首先在资源管理器重双击Pig.preset,在预设编辑器中打开这个实体预设,然后直接拖动白色的SpeedChange.part文件,并将其拖动到左侧【层级】面板中的Pig下。这里我们也可以修改SpeedChange这个零件在Pig预设下的显示名称(例如我们可以同样将其改为SpeedChange)。
|
||||
|
||||
保存之后退回到关卡编辑器,我们可以看到在左侧舞台窗口中,Pig预设的实例下也多了一个SpeedChange零件。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
104
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/30-蓝图逻辑编写:必要的准备工作.md
Normal file
@@ -0,0 +1,104 @@
|
||||
# 蓝图逻辑编写:必要的准备工作
|
||||
|
||||
|
||||
|
||||
回忆一下,我们的目标是:让猪每实际受到一次伤害,其移动速度都会翻倍。在此之前,我们需要做一系列的准备工作:
|
||||
|
||||
1. 获取实体预设对象:我们后面调整血量、设置速度等操作都需要指定具体是对谁进行;
|
||||
2. 提升猪的血量:目的是为了让猪在我们的测试中不会打几下就去世了。这里需要调整血量上限和当前血量两个属性;
|
||||
3. 设置并猪的速度和最大速度:为了让演示效果比较夸张,我们把猪的当前速度设置为0.05(正常移速的五分之一),并把它的最大速度设置为32,同时需要使用两个变量将这两个速度值存储起来,用于后续计算和赋值。
|
||||
|
||||
|
||||
|
||||
## 获取实体预设对象
|
||||
|
||||
我们需要在客户端初始化的时候就获取实体预设对象,并存为一个独立的变量Parent,以便在后续的逻辑中随时使用它。我们可以从服务端初始化节点的输出执行引脚(Out)拖出一条黄色的执行引线,松开鼠标后会弹出节点菜单。
|
||||
|
||||
这里我们需要获取到的是当前蓝图节点的父预设(猪的实体预设),所以我们需要用到【获取父对象】这个接口。我们可以
|
||||
|
||||
1. 在节点列表中直接寻找这个节点(在你不知道节点名称的情况下通常需要这么做)
|
||||
2. 输入中文关键词进行检索,例如“父对象”
|
||||
3. 输入接口英文名称,例如“GetParent”
|
||||
|
||||
这三个方法都可以找到我们需要的节点,在后续的编辑中使用哪种方式大家可根据实际情况自行选择。
|
||||
|
||||

|
||||
|
||||
我们看到这里其实有2个【调用:获取父对象】节点可以选择,一个是【调用零件接口】,一个是【调用预设对象接口】。其实对于我们当前的情境下使用这两个节点并没有什么区别,但如果我们是在预设多层嵌套的情况下获取预设的父预设,那么我们就不能使用零件接口的获取父对象节点了。
|
||||
|
||||
在成功获取到父预设的对象后,我们可以养成一个好习惯,将其用一个变量的形式存储起来,以便后续在图表其他位置或自定义接口的接口图表中调用。
|
||||
|
||||
我们首先在左侧脚本元素窗口中的变量菜单下点击右上角的“+”号,创建一个变量,并命名为【Parent】。由于父对象是一个Object类型,不属于当前编辑器提供的自定义变量数据类型,故我们就使用默认的Any类型即可,不需对变量类型做出改动。
|
||||
|
||||
创建好【Parent】变量后,我们将其从左侧变量菜单拖到图表空白处,松开左键后选择【设置Parent】,即可创建该变量的设置节点,用于修改该变量的值。我们将【调动:获取父对象】节点与【获取 Parent】节点通过黄色执行引线连接起来,再将获取父对象的结果通过数据引线传递给设置Parent的参数Value,即可将该对象传递到Parent变量存储起来。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 提升实体的血量
|
||||
|
||||
为了让猪不会在我们的测试过程中因为血量不足去世,我们需要将其最大血量和当前血量同时提升,需要用到的接口分别是【调用:设置属性最大值】和【调用:设置属性值】。(注意这里需要选择的是【调用预设对象接口】类)
|
||||
|
||||

|
||||
|
||||
这两个节点都需要传入实体对象,以确认是对哪个对象进行设置操作。这里由于我们之前已经将父对象存为了变量,我们可以直接获取Parent变量的值,然后将它传递给这两个设置接口的【调用对象】参数。
|
||||
|
||||

|
||||
|
||||
下面我们需要确定的是,这个设置属性最大值和设置属性值的操作,是对实体的哪一个属性进行的。确定属性类型我们需要查阅对应属性类型的枚举值,并将其传递给这两个设置接口。
|
||||
|
||||
更一般情况下,当我们不知道一个节点的参数或者返回值代表的含义,可以直接在开发者官网的API文档中查阅对应接口的信息。比如这里,我们通过搜索找到了【设置属性值(SetAttrValue)】这个接口,在参数信息中,我们可以看到attrType需要填写的是AttrType枚举值,我们点击链接可以跳转到属性类型枚举值页面,看到生命值(Health)对应的属性类型是0,正好是默认值,所以我们这里不需要改变这个参数的值。
|
||||
|
||||

|
||||
|
||||
然后,我们将这只猪的最大血量和当前血量设置都设置为80,就可以完成提升血量的步骤了。这里我们直接把两个节点的【属性最大值】和【属性值】两个参数都改为浮点数(float),然后将数值都改成80即可。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 设置并存储实体的速度上限和初始速度
|
||||
|
||||
在一般情况下,猪在游戏中的默认移动速度是0.25,为了让演示效果更夸张些,我们将它的初始速度调整为0.05,并且将其最大速度设置为32。同时,为了方便后续计算,我们需要将猪的当前速度存储为变量Speed(浮点型),同时将猪的最大速度存储为变量MaxSpeed(浮点型)。
|
||||
|
||||
速度最大值的设置和获取节点我们可以直接使用预设API的接口:【设置最大速度】、【获取最大速度】;
|
||||
|
||||
速度的设置和获取节点我们可以直接使用预设API的接口:【设置速度】、【获取速度】。
|
||||
|
||||

|
||||
|
||||
我们可以直接从获取Parent的输出执行引脚再拖出一条执行连线,连接到设置最大速度,这样代表的逻辑就是,先执行【设置属性最大值】→【设置属性值】这条执行线,再执行【设置最大速度】这条逻辑。同时,我们在最大速度参数处填入我们需要的速度上限32。
|
||||
|
||||

|
||||
|
||||
设置好最大速度后,我们需要将最大速度存为变量MaxSpeed。这里我们首先通过【获取最大速度】节点获取到当前实体的最大速度值(即等于我们刚刚设置的32),再创建一个名为MaxSpeed的浮点型(float)变量,将其值设置为我们刚刚获取到的最大速度值。
|
||||
|
||||

|
||||
|
||||
同理,我们还需要获取当前实体速度值,并将其传给新建的变量Speed。
|
||||
|
||||

|
||||
|
||||
这样,我们就完成了设置并存储实体速度上限和初始速度的工作。
|
||||
|
||||
|
||||
|
||||
## 小技巧:通过分组、注释工具管理节点
|
||||
|
||||
如果图表中有太多的节点,我们通常会感觉比较混乱,寻找某条逻辑的时候不知道从哪里开始找。这时,我们就可以利用分组和注释工具对节点进行标识和管理。
|
||||
|
||||
我们在需要框选的节点左上角空白处点击右键,从菜单中选择【创建分组】,可以看到在图表中生成了一个默认大小的分组框,在框内的节点都会被默认识别为该分组的内容,并且在拖动分组的时候会被统一移动。我们可以更改分组的命名,调节分组框的大小使其囊括其他我们需要的节点,也可以更改分组的颜色,使其更加醒目。
|
||||
|
||||

|
||||
|
||||
同样的,我们也可以为速度设置和存储的节点创建分组。
|
||||
|
||||

|
||||
|
||||
如果你需要为某个节点添加注释,可以对该节点点击右键,并选择【编辑注释】,这样可以方便地提供更多关于该节点的信息。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
# 蓝图逻辑编写:自定义接口与定时器逻辑
|
||||
|
||||
|
||||
|
||||
我们的目标是对猪的移动速度进行修改,但是我们并不能通过猪在游戏中的实际奔跑状态看出我们编写的逻辑是否达到了我们预期的效果。这时候,我们就需要通过日志打印,来返回猪的实时移动速度,来精确判断每次实际收到伤害后,猪的移动速度是否翻倍。
|
||||
|
||||
|
||||
|
||||
## 使用重复定时器
|
||||
|
||||
如果使用服务端每刻(TickServer)监听事件来调用打印事件,我们会受到过多的打印信息。其实我们更加希望的是每隔一段时间(以1秒为例),打印一次实时速度。这里我们需要借助一个特殊的节点,也就是【添加重复定时器】。重复定时器与普通定时器的区别是:普通定时器用于一段时间后执行的逻辑,重复定时器用于每隔一段时间都会执行一次的重复逻辑。
|
||||
|
||||

|
||||
|
||||
首先我们需要把【延迟】参数的类型改为浮点型(float),然后我们需要传入一个触发函数,它的意思是每隔1秒都会执行一次这个函数。这个函数我们需要将其以零件变量的形式传进来,这里我们调用【获取零件变量】接口,用执行连线连接【服务端初始化(InitServer)→ 获取零件变量 → 添加重复定时器】,然后将获取到的零件变量传递给【触发函数】引脚。
|
||||
|
||||
> 这里使用【服务端初始化(InitServer)】时间是因为我们希望在服务端初始化后就立刻创建这个定时器,并开始每秒执行一次打印逻辑。这里千万不要使用【服务端每刻(TickServer)】来创建定时器,否则会每个Tick都创建一次,导致日志量暴增。
|
||||
|
||||

|
||||
|
||||
接下来,我们需要创建一个自定义接口,写入打印逻辑后,将其以作为零件变量传递给触发函数。
|
||||
|
||||
|
||||
|
||||
## 自定义接口的创建与编辑
|
||||
|
||||
首先,我们在左侧脚本元素窗口中点击自定义接口菜单中的“+”按钮,新建一个自定义接口,并命名为printspeed。
|
||||
|
||||

|
||||
|
||||
创建自定义接口的同时,逻辑编辑器会自动为我们打开该自定义接口的接口图表。我们需要将这个接口的逻辑写在图表里,并形成【输入节点→接口逻辑节点→输出节点】的节点网络,从而才能在根图表中调用这个自定义接口的逻辑。
|
||||
|
||||
> 此处我们并不需要这个printspeed接口有参数或返回值,所以不需要添加。
|
||||
>
|
||||
> 如果你在今后的编辑过程中需要为自定义接口添加参数和返回值,那么你可以在左侧脚本元素窗口选中该自定义接口,并在右侧属性窗口为其添加参数/返回值。
|
||||
>
|
||||
> ** 需要注意的是,在图表中选中自定义接口的调用节点是没法编辑自定义接口的属性的。
|
||||
|
||||
然后,我们就可以在自定义接口的接口图表中编辑我们需要的打印速度的逻辑了。
|
||||
|
||||
我们需要获取到实体真实最大速度和当前速度,所以先获取到Parent,然后传递给【获取最大速度】和【获取速度】的调用对象参数。
|
||||
|
||||

|
||||
|
||||
为了让日志打印可读性更高,我们需要使用【连接字符串】节点,定义一下打印信息的格式:【当前速度:(当前实体速度)/(实体最大速度)】
|
||||
|
||||

|
||||
|
||||
完成了自定义接口的内部逻辑后,我们将它的名字填入根图表【获取零件变量】的key中,这样就可以每秒钟执行一次printspeed接口逻辑。
|
||||
|
||||

|
||||
|
||||
至此,定时器需要每秒执行的自定义接口逻辑就编辑完了,我们可以简单测试一下。
|
||||
|
||||
|
||||
|
||||
## 测试定时器逻辑
|
||||
|
||||
保存后,我们点击工具栏上的运行按钮,即可开始对定时器逻辑的测试。
|
||||
|
||||

|
||||
|
||||
从日志窗口中我们可以看到,每秒钟都会有一个猪的速度和最大速度的打印,说明我们定时器的逻辑编写是无误的。
|
||||
|
||||

|
||||
57
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/50-蓝图逻辑编写:受击加速逻辑.md
Normal file
@@ -0,0 +1,57 @@
|
||||
# 蓝图逻辑编写:受击加速逻辑
|
||||
|
||||
|
||||
|
||||
完成了定时打印逻辑的编写之后,接下来就到了我们的重头戏:受击加速逻辑了。这一部分主要包括2步:
|
||||
|
||||
1. 判断受伤实体是否为我们的实体预设
|
||||
2. 计算受击后猪的速度并传给猪
|
||||
|
||||
|
||||
|
||||
## 实体ID判断
|
||||
|
||||
对于猪实际受到伤害的监听我们用到的节点是:【监听:服务端实体实际受到伤害时】。这里我们可以选择第一个【监听服务端事件】类的,它是一个sdk事件监听节点。
|
||||
|
||||

|
||||
|
||||
这个节点可以为我们传出被伤害实体的ID,这里我们需要将它与我们生物预设的实体ID进行比较,如果它们完全相等,则判断为实际受到伤害的就是我们的猪,进而继续执行后续的变速逻辑。现在我们需要补充获取猪的实体ID的逻辑。
|
||||
|
||||
首先,我们需要通过【调用:获取实体ID】节点,获取到父对象对应的实体ID,然后新建一个类型为字符串(Str)的变量Entity,将获取到的实体ID存入Entity。我们需要将这段逻辑插入到获取父对象存入Parent之后。
|
||||
|
||||

|
||||
|
||||
然后,我们需要判断这个实体ID与被伤害实体ID是否相同。这里需要用到【是否相等】这个节点,它通过传入两个值,判断二者是否相等,并返回一个布尔值。如果两个参数值相等,则返回真(True);不相等,则返回假(False)。
|
||||
|
||||
接着,我们将这个布尔值传入【条件节点】,它有两个输出执行引线,布尔值为真的时候走“真”这条引线;布尔值为假的时候走“假”这条逻辑。
|
||||
|
||||

|
||||
|
||||
到此为止,我们就完成了实体ID判断的逻辑。
|
||||
|
||||
|
||||
|
||||
## 计算受击后实体速度
|
||||
|
||||
我们计算受击后猪的速度的思路如下:
|
||||
|
||||
获取Speed,并将Speed乘以2得到**2Speed**,然后与**MaxSpeed**相比较:
|
||||
|
||||
1. 如果2Speed小于或等于MaxSpeed,则将2Speed重新赋值给Speed变量,并将Speed的值设置为实体当前速度;
|
||||
2. 如果2Speed大于MaxSpeed,则将MaxSpeed赋值给Speed变量,并将Speed的值设置为实体当前速度。
|
||||
|
||||
首先我们获取Speed,并通过【*】乘法节点将其乘以2;再获取MaxSpeed。
|
||||
|
||||

|
||||
|
||||
然后我们通过【数字比较】节点比较2Speed和MaxSpeed的大小,并根据上述逻辑将对应的值赋给Speed。
|
||||
|
||||

|
||||
|
||||
最后,我们重新获取最新的Speed,并将它的值设置为实体速度。
|
||||
|
||||

|
||||
|
||||
至此,我们就完成了受击后实体速度加倍的逻辑,使用紫色分组框将这部分归为一组。接下来,我们就可以测试我们写的逻辑是否正确生效了。
|
||||
|
||||

|
||||
24
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/60-最终测试.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# 最终测试
|
||||
|
||||
|
||||
|
||||
保存后,我们点击工具栏上的运行按钮,即可开始最终测试。
|
||||
|
||||

|
||||
|
||||
运行后,我们使用木剑(攻击力小些)攻击猪,可以看到它的速度是每受击一次就翻倍的,符合预期。
|
||||
|
||||

|
||||
|
||||
当我们持续攻击猪的时候,它的速度越来越快,直到速度超过32时,被限制在了最大值32。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
至此,我们的《第一个蓝图Mod》系列教程就结束了,希望大家能通过一步一步跟随这个教程学习,对使用新版逻辑编辑器开发模组有一个初步的认识。欢迎大家尝试新版逻辑编辑器的更多功能,遇到问题时也欢迎随时[反馈给我们](https://mcdev.webapp.163.com/#/feedbackModal?target=browser)!
|
||||
|
||||
|
||||
|
||||
**完!结!撒!花!**
|
||||
|
||||
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/0-1.png
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/0-2.gif
Normal file
|
After Width: | Height: | Size: 4.9 MiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/0-3.gif
Normal file
|
After Width: | Height: | Size: 20 MiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/1-1.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/1-2.gif
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/1-3.gif
Normal file
|
After Width: | Height: | Size: 6.1 MiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/3-1.gif
Normal file
|
After Width: | Height: | Size: 470 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/3-11.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/3-12.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/3-13.gif
Normal file
|
After Width: | Height: | Size: 2.3 MiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/3-14.gif
Normal file
|
After Width: | Height: | Size: 141 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/3-15.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/3-2.gif
Normal file
|
After Width: | Height: | Size: 247 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/3-3.gif
Normal file
|
After Width: | Height: | Size: 442 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/3-4.gif
Normal file
|
After Width: | Height: | Size: 326 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/3-5.gif
Normal file
|
After Width: | Height: | Size: 590 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/3-6.gif
Normal file
|
After Width: | Height: | Size: 192 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/3-7.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/3-8.gif
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/4-01.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/4-02.gif
Normal file
|
After Width: | Height: | Size: 419 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/4-05.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/4-11.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/4-12.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/4-13.gif
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/4-14.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/5-1.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/5-2.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/5-3.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/5-4.gif
Normal file
|
After Width: | Height: | Size: 379 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/5-5.gif
Normal file
|
After Width: | Height: | Size: 587 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/5-6.gif
Normal file
|
After Width: | Height: | Size: 528 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/5-7.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/6-1.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/6-2.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/6-3.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/6-4.gif
Normal file
|
After Width: | Height: | Size: 492 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/00-第一个蓝图Mod/images/new001.png
Normal file
|
After Width: | Height: | Size: 171 KiB |
75
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/01-什么是逻辑编辑器.md
Normal file
@@ -0,0 +1,75 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 10分钟
|
||||
selection:
|
||||
---
|
||||
|
||||
# 什么是逻辑编辑器
|
||||
|
||||
很多开发者都有这样的疑惑:我不是编程专业出身,或者之前没有模组代码开发的经验,可以制作带玩法逻辑的模组吗?**完全可以!** 使用逻辑编辑器,通过“连连看”就能够快速构建模组的玩法逻辑,编程从此不再是障碍!
|
||||
|
||||
## 逻辑编辑器简介
|
||||
|
||||
逻辑编辑器是为中国版开发者打造的、以蓝图为载体进行节点式逻辑编写的编辑器。我们将中国版全套SDK接口、python内置函数都集成到了逻辑编辑器中,开发者们可以直接在蓝图中找到自己需要的节点,将它们按照逻辑运行顺序连接起来,就可以在游戏中生效了。
|
||||
|
||||
## 逻辑编辑器功能亮点
|
||||
|
||||
下面将为大家简单介绍逻辑编辑器的功能亮点:
|
||||
|
||||
### 1. 节点式逻辑编写
|
||||
|
||||
逻辑编辑器使用节点式的逻辑编写方式,通过节点添加接口,通过连线控制数据传递,方便快捷。
|
||||
|
||||

|
||||
|
||||
### 2. 即挂即用,方便复用
|
||||
|
||||
逻辑编辑器将逻辑保存为一个个**蓝图脚本(.bp)**,每个蓝图脚本都固定绑定到了一个**蓝图零件**上,将蓝图零件挂接到预设下即可使其中的逻辑生效。
|
||||
|
||||
同一个蓝图零件可以挂接到不同的预设下,在右侧属性栏对其中开放的属性变量进行调整,从而实现逻辑的快捷复用,提高开发效率。
|
||||
|
||||

|
||||
|
||||
### 3. SDK接口全覆盖且已汉化
|
||||
|
||||
提供了模组SDK的所有接口,以及大幅扩展了对python原生接口的支持。同时还提供了节点搜索和鼠标悬停提示,帮助开发者快速找到自己需要的接口。
|
||||
|
||||
同时,逻辑编辑器内的全部接口**均已汉化**,让开发者可以清晰地知道每个节点的作用。
|
||||
|
||||

|
||||
|
||||
### 4. 快捷的节点搜索
|
||||
|
||||
逻辑编辑器的右键节点菜单支持中文、英文、拼音搜索,并且支持在两个词之间插入空格进行分词搜索,最大程度帮助开发者快速定位需要的接口。
|
||||
|
||||

|
||||
|
||||
### 5. 变量和自定义接口管理
|
||||
|
||||
左侧脚本元素窗口提供零件变量、自定义接口的边界管理,包括创建与删除、属性修改、添加备注等。自定义接口还提供了专门的接口图表,供开发者进行接口逻辑编写。
|
||||
|
||||

|
||||
|
||||
### 6. 支持蓝图编写UI逻辑
|
||||
|
||||
逻辑编辑器不仅有蓝图零件,还有蓝图UI零件,支持使用蓝图编写UI逻辑。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
71
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/15-逻辑编辑器基础概念.md
Normal file
@@ -0,0 +1,71 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 10分钟
|
||||
selection:
|
||||
---
|
||||
|
||||
# 逻辑编辑器基础概念
|
||||
|
||||
## 预设与实例
|
||||
|
||||
**预设(Preset)** 就是“预先设定”的意思。开发者们可以将方块、素材、实体、特效以及玩法逻辑拼装成一个预设。在使用时,一个预设作为一个整体被放置在游戏中,被放置到游戏中的预设被称为 **实例**。
|
||||
|
||||
关于预设和实例的更多信息请访问[这篇文档](../../14-预设玩法编程/9-第一个预设Mod/1-新建预设并添加素材.md)。
|
||||
|
||||
## 零件
|
||||
|
||||
**零件(Part)** 是预设架构下,一种可以挂接到预设下的玩法逻辑对象。当我们把逻辑写到零件代码里,再将零件挂接到一个生效的预设下时,零件的逻辑也会随之生效。
|
||||
|
||||
关于零件的更多信息请访问[这篇文档](../../14-预设玩法编程/9-第一个预设Mod/4-创建和挂接零件.md)。
|
||||
|
||||
## 蓝图
|
||||
|
||||
在逻辑编辑器中,我们通过节点式编程的形式,将不同的节点通过执行连线和数据连线相连构成节点网络,从而编写一套完整的逻辑。这些承载了节点与连线的图表,我们将其称为**蓝图(Blueprint)**。蓝图只能通过逻辑编辑器进行编辑。
|
||||
|
||||
> 蓝图是仅限新版逻辑编辑器才有的功能,在旧版编辑器内将无法打开蓝图文件。旧版编辑器现已停止维护,请将编辑器升级至新版后继续开发。
|
||||
|
||||

|
||||
|
||||
## 蓝图零件
|
||||
|
||||
**蓝图零件(BlueprintPart)**,顾名思义,则是一种使用蓝图编写零件逻辑的特殊零件。与普通零件相比,蓝图文件在资源管理器的文件夹中多了一个 **.bp** 文件,即**蓝图脚本文件**。在资源管理器中双击.bp文件,即可在逻辑编辑器中打开该蓝图零件的蓝图图表,进行编辑。
|
||||
|
||||
> 在资源管理器的【精简模式】下,你可以在【蓝图】分页下找到每个零件的蓝图;
|
||||
> 在资源管理器的【完整模型】下,你可以在每个蓝图零件文件夹中找到对应零件的蓝图。
|
||||
|
||||

|
||||
|
||||
## 事件
|
||||
|
||||
**事件(Event)** 是模组SDK架构的核心组成部分,也是编程的一类常用技术。模组SDK的事件系统可以参考这篇文档:[事件简介](../../../20-玩法开发/13-模组SDK编程/2-Python脚本开发/9-事件简介.md)。
|
||||
|
||||
简单来说,事件系统就是用于写明白在某种情况触发的时候应该执行什么逻辑。例如“当玩家点击潜行键时播放角色蹲下的动画”,那么“当玩家点击潜行键时”就是一个事件。当监听到这个事件后,系统就会执行“播放角色蹲下的动画”这个逻辑。
|
||||
|
||||
在蓝图中,事件监听节点是蓝图逻辑网络执行的起点,通过事件节点连出的执行引线连接一系列接口,那么系统监听到这个事件时,后续的一系列节点逻辑都会被按顺序执行。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 接口
|
||||
|
||||
**接口(Interface)** 在蓝图中是节点图表的一种,可以从其他蓝图图表中调用其内部逻辑。
|
||||
|
||||
我们将所有的SDK接口以及大量的python接口都制作成了**内置接口**,放在右键菜单中供开发者直接调用(开发者无法直接修改这些接口的逻辑);同时,我们还允许开发者创建**自定义接口**,编写自己需要的节点逻辑。
|
||||
|
||||
举个例子: 我们在下面这个自定义接口图表中编写好了Interface_1这个自定义接口的逻辑:
|
||||
|
||||

|
||||
|
||||
然后在跟图表中调用Interface_1,就可以直接复用其内部逻辑进行运算。
|
||||
|
||||

|
||||
|
||||
|
||||
## 蓝图零件变量
|
||||
|
||||
**蓝图零件变量** 用于储存值或对象属性,可通过【获取变量】节点调用变量值,也可以通过【设置变量】节点为该变量设置新的值。
|
||||
|
||||

|
||||
|
||||
57
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/20-创建蓝图零件.md
Normal file
@@ -0,0 +1,57 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 10分钟
|
||||
selection:
|
||||
---
|
||||
|
||||
# 创建蓝图零件
|
||||
|
||||
逻辑编辑器的逻辑都需要在**蓝图**上编写,而蓝图则存在于一个又一个**蓝图零件**中。这篇文档将带各位开发者们了解如何创建蓝图零件。
|
||||
|
||||
## 创建蓝图零件
|
||||
|
||||
正如普通零件一样,蓝图零件也可以通过新建文件向导创建。点击资源管理器左侧的【新建】按钮打开新建文件向导,选择【蓝图零件】,即可创建一个空的蓝图零件。你可以为蓝图文件自定义名称。创建新的蓝图零件后,下方资源管理器将自动跳转到新创建的零件目录。
|
||||
|
||||
> **注意:**
|
||||
>
|
||||
> 当前蓝图零件命名仅支持纯英文、数字。
|
||||
|
||||

|
||||
|
||||
## 两种蓝图零件
|
||||
|
||||
正如在新建文件向导的蓝图零件页面显示的那样,蓝图零件目前共有两种:
|
||||
|
||||
- **蓝图零件:** 即普通的用蓝图脚本撰写逻辑的零件;
|
||||
- **UI蓝图零件:** 专门为UI控制而编写的蓝图零件,其中包含了部分专用于UI控制的事件、接口。
|
||||
|
||||
### 1. 蓝图零件
|
||||
|
||||
蓝图零件的目录下会自动创建如下5个文件(以默认命名Blueprint为例):
|
||||
|
||||
- Blueprint.part
|
||||
- BlueprintPart.bp
|
||||
- BlueprintPart.py
|
||||
- BlueprintPartMeta.py
|
||||
- \_init_.py
|
||||
|
||||
相比与普通零件,这里新增了一个BlueprintPart.bp。这里的.bp文件即是我们的 **蓝图文件** ,对其进行**双击**,即可在新版逻辑编辑器中打开对应的蓝图,通过可视化的节点式编程进行逻辑编辑。
|
||||
|
||||

|
||||
|
||||
### 2. UI蓝图零件
|
||||
|
||||
UI蓝图零件目录下会自动创建如下6个文件(以默认命名BlueprintUI为例):
|
||||
|
||||
- BlueprintUI.part
|
||||
- BlueprintUIPart.bp
|
||||
- BlueprintUIPart.py
|
||||
- BlueprintUIPartMeta.py
|
||||
- BlueprintUIPartUI.py
|
||||
- \_init_.py
|
||||
|
||||
与蓝图零件类似,该目录下我们可以编辑的是BlueprintUIPart.bp。对其进行**双击**,即可在新版逻辑编辑器中打开对应的UI蓝图脚本进行编辑。
|
||||
|
||||
|
||||
|
||||
74
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/30-认识逻辑编辑器界面.md
Normal file
@@ -0,0 +1,74 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 10分钟
|
||||
selection:
|
||||
---
|
||||
|
||||
# 认识逻辑编辑器界面
|
||||
|
||||
逻辑编辑器的界面主要包括如下几个部分:
|
||||
|
||||

|
||||
|
||||
## 工具栏
|
||||
|
||||

|
||||
|
||||
工具栏固定显示在逻辑编辑器的顶部,用于访问常用的命令按钮。其中有两个需稍作说明:
|
||||
|
||||
- **保存:** 保存对当前蓝图的修改。
|
||||
- **另存为:** 单独保存当前蓝图.bp文件到本地指定位置。
|
||||
- **撤销:** 撤销上一次编辑操作。
|
||||
- **重做:** 重新执行上一次编辑操作。
|
||||
- **浏览:** 在资源管理器重定位当前蓝图零件脚本的位置。
|
||||
- **运行:** 使用ModPC开发包运行当前作品,用以测试蓝图逻辑是否正常运行。
|
||||
|
||||
## 导航栏
|
||||
|
||||

|
||||
|
||||
当你同时打开不同的蓝图脚本文件时,它们将以页签的形式陈列在此处,点击即可在不同蓝图间快速切换。
|
||||
|
||||
## 脚本元素窗口
|
||||
|
||||

|
||||
|
||||
脚本元素窗口默认停靠在屏幕最左侧,用于显示或创建蓝图中零件变量、自定义接口等内容,以便让开发者们更加便捷地查看蓝图现有元素或创建新元素。
|
||||
|
||||
脚本元素窗口主要包括蓝图零件变量、自定义接口、变量三个区域,用户可点击每个模块右上角的“+”按钮新增对应的元素,也可右键点击现有元素,进行重命名、分组、删除等操作。双击自定义接口,还可打开对应的接口图表,进行内部逻辑编辑。
|
||||
|
||||
> **参考:**
|
||||
>
|
||||
> 关于脚本元素的更多指南内容,请参考[这篇文档](./40-事件、接口、变量.md)。
|
||||
|
||||
> **注意:**
|
||||
>
|
||||
> 请开发者们尽量使用【蓝图零件变量】,而不是【变量】。底部的变量窗口是过渡性功能,将在未来合适的时间被逐步废弃。
|
||||
|
||||
## 图表编辑窗口
|
||||
|
||||

|
||||
|
||||
图表编辑窗口是逻辑编辑器的核心窗口,你可以在此创建事件、接口等节点,并将它们用执行或数据引线相连,从而撰写零件的脚本逻辑。
|
||||
|
||||
如果你在蓝图脚本中创建了自定义接口,你就会需要**接口图表**来编辑这个自定义接口的内部逻辑。在脚本元素窗口双击该自定义接口,即可打开其接口图表(通常包含一个输入接口和一个输出接口),此时会在图表编辑区域的左上角显示面包屑导航(例图在这个截图中,就展示了在Graph图表中打开了f_printspeed的接口图表,点击面包屑导航上的Graph,即可返回Graph图表)。
|
||||
|
||||

|
||||
|
||||
## 属性窗口
|
||||
|
||||

|
||||
|
||||
属性窗口主要用于编辑被选中项的属性。在脚本元素窗口或者图表编辑窗口中选中某个对象,即可在右侧属性窗口中展示出它的各类属性信息,并可供开发者自行按需修改。
|
||||
|
||||
>**注意:**
|
||||
>部分自定义节点属性通过图表中直接选中可能无法完整获取,请在左侧脚本元素窗口中选中后,再在属性窗口中修改。
|
||||
|
||||
## 查找窗口
|
||||
|
||||

|
||||
|
||||
查找窗口用于让开发者输入查询的节点名称、引脚名称或关键词,展示符合条件的查找结果,并可通过双击结果转到对应的节点。
|
||||
|
||||
查找窗口与脚本元素窗口位置重叠,可以通过左下角页签切换。如果你关闭了查找窗口,可通过快捷键ctrl+F再次调出。
|
||||
189
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/40-事件、接口、变量.md
Normal file
@@ -0,0 +1,189 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 20分钟
|
||||
selection:
|
||||
---
|
||||
|
||||
# 事件、接口、变量
|
||||
|
||||
<style type="text/css">
|
||||
.photo{background-color:#fabfc2;}
|
||||
</style>
|
||||
|
||||
在我们编写蓝图脚本的时候,一定会用到事件、接口和变量,我们将它们统称为“**脚本元素**”。三者的作用如下:
|
||||
|
||||
| 脚本元素 | 描述 |
|
||||
| ---- | ---- |
|
||||
| 事件 | 事件节点是节点网络的逻辑起点,当某个事件被触发后,即会执行该事件节点后连接的所有节点逻辑。<br />当前版本的逻辑编辑器,仅支持通过右键菜单创建编辑器自带的事件,暂时不支持开发者自定义事件。 |
|
||||
| 接口 | 接口是节点图表的一种,可以从其他蓝图图表中调用其内部逻辑。 |
|
||||
| 变量 | 用于储存值或对象属性,可通过获取变量节点调用变量值,也可以通过设置变量节点为该变量设置新的值。 |
|
||||
|
||||
下面我们将对它们逐一进行介绍。
|
||||
|
||||
## 事件
|
||||
|
||||
事件是模组逻辑代码的起点,所以任何一条蓝图执行逻辑都必须要以一个事件监听节点为起点,这样整条执行连线串联起来的逻辑链才能够被执行。
|
||||
|
||||

|
||||
|
||||
### 1. 默认起始事件
|
||||
|
||||
以蓝图零件为例,其在新建时会默认自带6个起始事件监听节点,分别为:
|
||||
|
||||
**1)客户端默认起始事件**
|
||||
|
||||
| 事件名称 | 事件英文名 | 描述 |
|
||||
| :----------- | ------------- | ------------------------------------------------------------ |
|
||||
| 客户端初始化 | InitClient | 客户端初始化,可以作为客户端逻辑的入口。 |
|
||||
| 客户端每刻 | TickClient | 客户端每刻执行的逻辑从这里连出,在我的世界中,1秒由30刻组成。 |
|
||||
| 客户端销毁 | DestroyClient | 客户端销毁时执行的逻辑(预设销毁时,它下面挂的所有预设/零件/素材也都会跟着销毁)。 |
|
||||
|
||||

|
||||
|
||||
**2)服务端默认起始事件**
|
||||
|
||||
| 事件名称 | 事件英文名 | 描述 |
|
||||
| :----------- | ------------- | ------------------------------------------------------------ |
|
||||
| 服务端初始化 | InitServer | 服务端初始化,可以作为客户端逻辑的入口。 |
|
||||
| 服务端每刻 | TickServer | 服务端每刻执行的逻辑从这里连出,在我的世界中,1秒由30刻组成。 |
|
||||
| 服务端销毁 | DestroyServer | 服务端销毁时执行的逻辑(预设销毁时,它下面挂的所有预设/零件/素材也都会跟着销毁)。 |
|
||||
|
||||

|
||||
|
||||
### 2. 创建事件监听节点
|
||||
|
||||
除了创建蓝图时默认生成的初始事件监听节点,逻辑编辑器还有丰富的事件库供开发者选择。可以通过右键菜单浏览、搜索我们需要的事件监听节点。
|
||||
|
||||
> **提示:**
|
||||
>
|
||||
> 关于节点的创建方式,请参考[这篇文档](./43-节点创建与连接.md#创建节点)
|
||||
|
||||

|
||||
|
||||
## 接口
|
||||
|
||||
新版逻辑编辑器为开发者提供了丰富的接口来实现你的创意。这些接口既包括现有中国版模组SDK(即ModSDK)里的全部接口,也包括一些Python接口和逻辑编辑器内置接口。
|
||||
|
||||
### 1. 内置接口
|
||||
|
||||
内置接口指的是模组SDK接口、Python接口以及一些辅助逻辑完成的基础接口。
|
||||
|
||||
可以通过右键菜单浏览、搜索我们需要的接口调用节点。
|
||||
|
||||

|
||||
|
||||
### 2. 自定义接口
|
||||
|
||||
除了右键菜单中的这些编辑器内置接口,新版逻辑编辑器还支持开发者创建自定义接口。找到左侧脚本元素窗口中的【自定义接口】选项卡,点击其右上角的【+】号,即可新建一个自定义接口。
|
||||
|
||||
> **<font color="#ff646e">自定义接口命名规范</font>**
|
||||
>
|
||||
> 创建时可为该自定义接口重命名,其命名规范如下:
|
||||
> 1. 以“f_”开头(代表function)
|
||||
> 2. 不超过20个字符
|
||||
> 3. 仅可包含英文字母、数字、下划线
|
||||
|
||||
自定义接口像其他接口一样,拥有一个调用调用节点,触发后即会执行该接口内的蓝图逻辑。
|
||||
|
||||

|
||||
|
||||
在左侧脚本元素窗口选中自定义接口后,可在右侧属性窗口修改该自定义接口的属性:
|
||||
|
||||

|
||||
|
||||
- **纯接口:** 可选项。勾选后该自定义接口将转为纯接口(无执行输入、输出引脚)
|
||||
- **输入参数(inputParams):** 点击“+”可为该自定义接口添加输入参数,支持编辑参数名和参数数据类型;点击垃圾桶按钮可以清除已添加的参数
|
||||
- **输出参数(outputParams):** 点击“+”可为该自定义接口添加输出参数(返回值),支持编辑返回值名和返回值数据类型;点击垃圾桶按钮可以清除已添加的返回值。
|
||||
- **备注:** 在此处填写的备注信息可以用来增加对该变量的说明。备注将显示在【当前蓝图】窗口中相应的自定义接口后面。
|
||||
- **接口分组:** 用于对自定义接口进行分类管理。开发者创建的自定义接口会被默认归类于`接口`分组下。如果想要创建一个新的分组并将该接口放入其中,只需要修改`接口分组`字段的文本,左侧【当前蓝图】窗口就会自动用该命名创建一个接口分组,并将该接口放入新的分组。
|
||||

|
||||
|
||||
自定义接口创建后,在左侧脚本元素窗口双击该自定义接口(或者直接在图表中双击该接口的调用节点),即可打开该自定义接口的 **接口图表**。接口图表用于编写接口的内部逻辑。每个接口图表都会自带一个 **输入(Input)** 和一个 **输出(Output)** 节点。
|
||||
|
||||
- 输入节点是接口的逻辑起点,同时用于将参数传入接口内部逻辑;
|
||||
- 输出节点是接口逻辑的终点,同时用于将运算完的数据以返回值的形式传出接口。
|
||||
|
||||
正如在普通蓝图图表中使用节点编写逻辑一样,你可以在接口图表中使用各类节点,并用执行连线将他们构成一个完整的逻辑网络,但是整个接口的内部逻辑必须是以执行连线从输入节点,经过内部其他节点,能够顺利走向输出节点的。
|
||||
|
||||

|
||||
|
||||
## 变量
|
||||
|
||||
<B>变量</B> 通常指 <B>蓝图零件变量</B>,用于储存值或对象属性,可以通过左侧脚本元素窗口的【蓝图零件变量】选项卡右上角的“+”按钮创建变量。变量在创建后可以自行重命名。
|
||||
|
||||
> **注意:**
|
||||
>
|
||||
> 对蓝图零件变量做出的所有修改在保存蓝图之后才会生效。
|
||||
|
||||
> **<font color="#ff646e">蓝图零件变量命名规范</font>**
|
||||
>
|
||||
> 创建时可为该变量重命名,其命名规范如下:
|
||||
> 1. 以“v_”开头(代表variable)
|
||||
> 2. 不超过20个字符
|
||||
> 3. 仅可包含英文字母、数字、下划线
|
||||
|
||||

|
||||
|
||||
蓝图零件变量创建后,**如果开发者按下【保存】按钮**,则该变量会同步显示到该蓝图零件的 **.part** 文件的属性面板中(可在关卡、预设编辑器中查看),这样开发者在其他编辑器中就可以在不打开蓝图文件的情况下,直接修改该蓝图零件变量的默认值了。变量属性栏中的【变量显示文本】字段可以用于指定该变量在其他编辑器的零件属性界面显示什么名字。
|
||||
|
||||
**注意必须先关闭改零件的蓝图,才能在其他编辑器修改蓝图零件变量的值,否则会发生冲突报错。**
|
||||
|
||||

|
||||
|
||||
|
||||
> **注意:**
|
||||
>
|
||||
>除了【蓝图零件变量】选项卡,早期蓝图还有一个【变量】选项卡,在后续版本会逐步淘汰,不建议开发者使用。
|
||||
>
|
||||
|
||||
### 1. 变量属性
|
||||
|
||||
在左侧脚本元素窗口单击选中变量,可以在右侧属性窗口浏览该变量的全部属性,并可以修改其中的一部分。主要包括:
|
||||
|
||||
- **变量名**:命名规范如上文【蓝图零件变量命名规范】中所示。变量名暂不支持在右侧属性面板直接修改,可在左侧【蓝图零件变量】窗口选中需要修改的变量,右键选中【重命名】或直接按下F2键修改变量名。
|
||||
|
||||
- **变量显示文本**:即该变量在蓝图零件.part文件属性面板中显示的名称,可以支持中英文、数字、符号。注意需要**保存**之后,对显示文本的修改才会生效!
|
||||
|
||||
- **变量分组**:除了像自定义接口的`接口分组`字段一样具有在【当前蓝图】窗口进行分类管理的功能外,`变量分组`子弹还能定义该变量在蓝图零件.part文件属性面板中所在的分组。默认分组名为【蓝图零件】,开发者可任意修改。注意所有的修改都需要**保存**才能生效!
|
||||
如果改为当前属性窗口中不存在的分组名,则会在属性窗口中创建一个该名称的分组,并将这个变量放入其中;
|
||||
如果改为当前属性窗口中已经存在的分组名,则会直接将这个变量放入该分组。
|
||||
|
||||
- **变量类型**:通过下拉框可以选择该变量的数据类型。变量数据类型主要包括:
|
||||
|
||||
1)布尔值(假false:0,真true:1)
|
||||
|
||||
2)浮点型(有符号:1.234, -3.14)
|
||||
|
||||
3)整型(有符号:1, 2, 3, 0, -1, -2, -3)
|
||||
|
||||
4)字符串(由数字、字母、下划线组成的一串字符:"abc", "123", "abc_123")
|
||||
|
||||
- **默认值**:编辑该变量的默认值
|
||||
|
||||

|
||||
|
||||
### 2. 获取变量
|
||||
|
||||
有两种途径可以在蓝图中获取(get)一个变量中存储的值:
|
||||
|
||||
1. 直接拖出右键节点菜单,并输入该变量的变量名关键词即可搜索到它的【获取】节点(你也可以在右键菜单中的【零件变量】子目录下找到它;
|
||||
|
||||
2. 将变量从左侧脚本元素窗口中拖动到图表中,松开后从弹出的下拉列表中选择获取节点。
|
||||
|
||||

|
||||
|
||||
### 3. 设置变量值
|
||||
|
||||
如果你想为现有的变量设置(set)一个新的值,那么有两种方式可以做到:
|
||||
|
||||
1. 直接在右键中搜索该变量名,创建该变量的【设置】节点,再为这个设置节点传入新的值;
|
||||
2. 将变量从左侧脚本元素窗口中拖动到图表中,松开后从弹出的下拉列表中选择设置节点,再为这个设置节点传入新的值。
|
||||
|
||||
为变量传入新的值也有两种操作方式:
|
||||
|
||||
1. 通过数据连线连接到设置节点的参数引脚
|
||||
2. 直接在设置节点的参数输入框中输入
|
||||
|
||||

|
||||
|
||||
155
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/43-节点创建与连接.md
Normal file
@@ -0,0 +1,155 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 15分钟
|
||||
selection:
|
||||
---
|
||||
|
||||
# 节点创建与连接
|
||||
|
||||
节点是一个蓝图图表的基本组成元素之一。通过将蓝图的节点连接起来,形成一个完整的逻辑网络,我们就可以让这些节点的逻辑按顺序/条件执行,从而写出符合游戏设计需求的逻辑。每一个事件、接口、变量都有自己对应的一个或多个节点,下面让我们简单了解一下这些节点的使用方法。
|
||||
|
||||
> 关于事件、接口、变量的更多介绍请 [点击此处查看](./40-事件、接口、变量.md) 。
|
||||
|
||||
## 节点组成部分
|
||||
|
||||
一个常见的节点通常包括以下几个部分:
|
||||
|
||||
1. **节点名称:** 用于节点间相互区别
|
||||
2. **执行引脚:** 包括输入执行引脚和输出执行引脚
|
||||
3. **数据引脚:** 包括参数输入引脚和返回值输出引脚
|
||||
|
||||
> **提示:**
|
||||
>
|
||||
> 节点种类多样,功能不同决定了节点样式不同。有些节点并不会包含上述三种组成部分的全部,比如变量设置节点没有返回值、纯接口没有执行引脚等。
|
||||
|
||||

|
||||
|
||||
## 创建节点
|
||||
|
||||
尽管节点种类繁多,但基本都可以通过下面的两种方式创建:
|
||||
|
||||
1、图表空白处右键,会弹出节点菜单,从中选择你需要的节点,也可直接输入节点名称关键词搜索
|
||||
|
||||
2、从其他节点的引脚处按住一个左键拖拽出来,松开左键后从弹出的节点菜单中选择或搜索你需要的节点
|
||||
|
||||
> **提示:**
|
||||
>
|
||||
> 对于自定义接口、变量等在左侧窗口中有显示的脚本元素,可以直接通过从左侧窗口中拖拽至图表,松开鼠标后,即可生成与之相关的节点。
|
||||
|
||||

|
||||
|
||||
### 节点搜索功能介绍
|
||||
|
||||
逻辑编辑器为开发者们提供了实用的节点搜索功能,帮助大家快速找到自己需要的节点。我们可以通过在右键菜单的搜索框中输入关键词直接查找名称中带有该关键词的节点。
|
||||
|
||||
例如我们搜索`设置速度`,即可精准定位到该接口的调用节点。
|
||||
|
||||

|
||||
|
||||
逻辑编辑器同样支持分词搜索,在两个关键词中加上空格,即可搜索到名称中同时带有这两个关键词的节点。
|
||||
|
||||
例如我们搜索`设置 速度`,即可搜索到节点名称同时带有`设置`和`速度`两个关键词的节点。
|
||||
|
||||

|
||||
|
||||
此外,节点搜索功能还支持英文、拼音搜索。
|
||||
例如搜索`InitClient`和`kehuduanchushihua`都可以找到“客户端初始化”监听节点。
|
||||
|
||||

|
||||
|
||||
## 节点选择与移动
|
||||
|
||||
单个节点可以通过单击直接选中。选中后节点底色会发生变化。按住鼠标左键可拖拽改变该节点在图表中的位置。
|
||||
|
||||
另外也可以通过在图表中拖动鼠标框选或通过按住ctrl连续单击选中多个节点。选中后按住鼠标左键拖拽可同时改变全部被选中节点的位置。
|
||||
|
||||

|
||||
|
||||
## 节点的引脚
|
||||
|
||||
节点共有2种引脚:执行引脚和数据引脚。
|
||||
|
||||

|
||||
|
||||
### 1. 执行引脚
|
||||
|
||||
执行引脚用于控制逻辑的执行顺序,分为输入执行引脚和输出执行引脚。
|
||||
|
||||
- **输入执行引脚** 在节点的左上角。当输入执行引脚被通过黄色的执行连线与其他节点相连时,会被激活,开始执行该节点的逻辑。
|
||||
|
||||
- **输出执行引脚** 在节点的右上角。当节点逻辑执行完毕后,输出执行引脚会被激活,当这个引脚被通过执行连线与其他节点相连时,则会继续执行后续的流程。
|
||||
|
||||
节点不一定会有一对输入执行引脚和输出执行引脚。例如:纯接口调用节点既没有输入执行引脚也没有输出执行引脚;条件节点有1个输入执行引脚和2个输出执行引脚;顺序遍历节点有2个输入执行引脚和2个输出执行引脚。具体哪个执行引脚被执行,有连线和具体节点逻辑判断。
|
||||
|
||||
> **提示:**
|
||||
>
|
||||
> 可以有多条执行引线连入同一个执行引脚,同样的,同一个输出执行引脚也可以发出多条执行连线。
|
||||
>
|
||||
>
|
||||
|
||||
### 2. 数据引脚
|
||||
|
||||
节点的数据引脚主要用于数据的输入和输出,分为参数输入引脚和返回值输出引脚。
|
||||
|
||||
- **参数输入引脚** 在节点的左侧,需要与蓝色的数据连线相连。通过将数据连线与参数输入引脚相连,可将数据传入该节点,并赋值给这个参数。
|
||||
- **返回值输出引脚** 在节点的右侧,需要与蓝色的数据连线相连。通过将数据连线与返回值输出引脚相连,可将数据以返回值的形式从该节点传递出去。
|
||||
|
||||
节点的数据引脚数量没有限制,也可以没有参数输入引脚或返回值输出引脚(即该节点没有参数或没有返回值)。
|
||||
|
||||
> 同一个返回值输出引脚可以发出多条数据连线,向不同节点传输同一个数据,但是同一个参数输入节点只能有一条数据连线传入数据,否则会引起混乱。
|
||||
|
||||
需要注意的是,数据引脚是与该节点的参数或返回值的数据类型一一对应的,所以两个数据类型不同(或者不兼容)的数据引脚,是不可以通过数据连线直接进行数据传递的。例如,节点A的返回值类型是Int,节点B的参数类型是Bool,那么这两个数据引脚是不可以直接相连的;但如果节点B的参数类型是Any,即不限制传入数据的类型,则二者可以直接相连。
|
||||
|
||||
## 节点的连线
|
||||
|
||||
节点共有2种连线:执行连线和数据连线。
|
||||
|
||||

|
||||
|
||||
|
||||
### 1. 执行连线
|
||||
|
||||
执行连线是黄色的,用于连接各个节点的执行引脚,形成一个完整的节点网络,从而正确地执行整个蓝图的逻辑。
|
||||
|
||||
> **注意:**
|
||||
>
|
||||
> 在非特殊情况下,不要使用执行连线将同一个节点的输入执行引脚和输出执行引脚相连。
|
||||
|
||||
### 2. 数据连线
|
||||
|
||||
数据连线是绿色的,用于连接各个节点的数据引脚,从而保证数据在各个节点间的正确传递。
|
||||
|
||||
> **注意:**
|
||||
>
|
||||
> 在非特殊情况下,不要使用数据连线将同一个节点的参数输入引脚和返回值输出引脚相连。
|
||||
|
||||
## 一些节点连接的规则
|
||||
|
||||
尽管蓝图节点的连接相对自由,但是其中还是有一些规则需要遵守:
|
||||
|
||||
### 1. 数据引脚的数据类型限定
|
||||
|
||||
数据引脚是与该节点的参数或返回值的数据类型一一对应的,所以两个数据类型不同(或者不兼容)的数据引脚,是不可以通过数据连线直接进行数据传递的。例如,节点A的返回值类型是Int,节点B的参数类型是Bool,那么这两个数据引脚是不可以直接相连的;但如果节点B的参数类型是Any,即不限制传入数据的类型,则二者可以直接相连。
|
||||
|
||||
### 2. 两个支持端冲突的节点不可以直接相连
|
||||
|
||||
根据功能不同,每个节点的支持端是不同的。共分为以下三类:
|
||||
|
||||
1)双端支持:该节点既可以用于服务端逻辑,也可以用于客户端逻辑。
|
||||
|
||||
2)仅客户端支持:该节点仅可用于客户端逻辑,不能与仅服务端支持的节点相连。
|
||||
|
||||
3)仅服务端支持:该节点仅可用于服务端逻辑,不能与仅客户端支持的节点相连。
|
||||
|
||||
例如“监听:玩家升级时”是一个仅服务端支持节点,而“调用:客户端设置左上角通知内容”是一个仅客户端支持节点,二者之间是不可以直接相连的。
|
||||
|
||||
### 3. 同侧引脚不可以直接相连
|
||||
|
||||
不可以将一个节点的输入引脚与另一个节点的输入引脚相连(无论是执行还是数据引脚);
|
||||
不可以将一个节点的输出引脚与另一个节点的输出引脚相连(无论是执行还是数据引脚)。
|
||||
|
||||
### 4. 数据输入引脚不可以有多条数据连线传入
|
||||
|
||||
节点的执行输入引脚可以有多条执行连线传入,但是数据引脚不能有多条数据连线传入。
|
||||
|
||||
48
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/45-区分服务端与客户端.md
Normal file
@@ -0,0 +1,48 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 10分钟
|
||||
selection:
|
||||
---
|
||||
|
||||
# 区分服务端与客户端
|
||||
|
||||
## 什么是服务端、客户端?
|
||||
|
||||
当你运行我的世界的时候,一部分逻辑是在服务端跑的,另一部分是在客户端跑的,两者之间有着较为严格的界限。
|
||||
|
||||
如果涉及到数据同步的逻辑,一般都是需要在服务端运行的,这样当你进行多人游戏的时候,每个玩家才会看到其他玩家的行为。比如实体(或者)生物的移动/位置,攻击,血量计算,生成实体/方块等等等等。
|
||||
|
||||
如果无需数据同步,或者只是表现层的逻辑,一般在客户端运行即可。比如使用自定义模型,动画,特效,音效等等,以及界面,按键等等交互内容。
|
||||
|
||||
客户端是运行在本地的,即你当前游玩我的世界使用的电脑或者手机,而服务端的逻辑视情况而定,如果你在进行单机游戏,那么服务端也是运行在本地设备上的,如果你进行联机游戏,那么所有玩家的服务端逻辑都是运行在房主的设备上的,如果你在玩服务器(比如租赁服或者网络游戏),那么服务端的逻辑是运行在服务器上的。
|
||||
|
||||
>**注意:**
|
||||
>
|
||||
>由于客户端和服务端相对分割,所以在任何时候都不能在一端调用另外一端的逻辑!
|
||||
|
||||
## 服务端节点,客户端节点
|
||||
|
||||
所有的节点都被区分为3类:
|
||||
|
||||
- **仅服务端节点:** 他们只能运行在服务端。
|
||||
- **仅客户端节点:** 他们只能运行在客户端。
|
||||
- **双端节点:** 在服务端和客户端都能跑,会根据当前执行的环境改变逻辑。
|
||||
|
||||
下图是创建一个蓝图零件时,默认写到蓝图里的节点,可以看到包含3个服务端的节点和3个客户端的节点,你需要根据上述的标准判断自己需要从哪个端的节点连出后续的逻辑。
|
||||
|
||||

|
||||
|
||||
如下图,你可以点击节点,在他的属性面板里查看他支持哪个端。
|
||||
|
||||

|
||||
|
||||
我们使用逻辑编辑器创建的自定义接口都是双端支持的(无法修改这一属性,即使你没有做双端的支持)。
|
||||
|
||||
仅客户端节点与仅服务端节点不能存在于同一条执行连线连接的逻辑链上。
|
||||
|
||||
## 网络通讯
|
||||
|
||||
如上节所述,我们无法直接在一端直接调用另一端,如果我们需要此类的逻辑,可以通过事件广播和监听来实现网络通讯。
|
||||
|
||||
关于事件监听和广播的详细说明,请看下一篇指南:[事件监听与广播](./47-事件监听与广播.md)
|
||||
208
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/47-事件监听与广播.md
Normal file
@@ -0,0 +1,208 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 20分钟
|
||||
selection:
|
||||
---
|
||||
|
||||
# 事件监听与广播
|
||||
|
||||
## 事件简介与引擎事件
|
||||
|
||||
### 1. 什么是事件
|
||||
|
||||
事件是模组SDK架构的核心组成部分,也是编程的一类常用技术。模组SDK的事件系统可以参考这篇文档:[事件简介](../../../20-玩法开发/13-模组SDK编程/2-Python脚本开发/9-事件简介.md)。
|
||||
|
||||
在我的世界中国版的游戏进行的过程中,模组SDK会在各种时机广播一些事件,比如游戏开始时,玩家加入时等等,我们监听这些事件,然后在这些事件触发的时候执行相应的逻辑,即可对游戏产生影响。
|
||||
|
||||

|
||||
|
||||
### 2. 什么是引擎事件
|
||||
|
||||
模组SDK中有大量已经内置在我的世界中的事件,他们被称为**引擎事件**,可以参考技术手册的这篇文档:<a href="../../../../mcdocs/1-ModAPI/事件/世界.html" rel="noopenner"> 世界 </a>。
|
||||
|
||||

|
||||
|
||||
如果你使用Python编程的话,需要手动监听引擎事件,但是对于蓝图来说并不需要。
|
||||
|
||||
当你想要监听某个引擎事件时,你只需要添加一个对应的节点即可,比如希望在玩家发送聊天信息的时候在后台日志打印出该玩家的聊天内容。
|
||||
|
||||
如下图(你可以在新的指令模板里找到),当玩家发送聊天信息时,蓝图会开始执行这个事件节点,并且按连线顺序继续执行后面的打印信息节点,将信息内容打印出来。
|
||||
|
||||

|
||||
|
||||
## 模组SDK事件与零件事件
|
||||
|
||||
当我们在蓝图中搜索事件节点时,很多情况下我们会找到多个结果。
|
||||
|
||||
零件事件是预设架构的事件系统,在模组SDK事件的基础上进行了一些改进。如果你还不太了解零件事件,可以参考这篇文档:[零件事件](../../../20-玩法开发/14-预设玩法编程/12-深入理解零件/0-零件开发.md#零件事件)。
|
||||
|
||||
|
||||
|
||||
我们以<a href="../../../../mcdocs/1-ModAPI/事件/实体.html#actorhurtserverevent" rel="noopenner"> 服务端生物受伤事件 </a>为例,他在API文档中的说明如下:
|
||||
|
||||

|
||||
|
||||
当你在逻辑编辑器中搜索这个节点时,你会发现两个版本:
|
||||
|
||||
- 监听服务端事件……:这个是模组SDK的事件节点;
|
||||
- 监听零件事件……:这个是零件事件的节点。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
这两种节点外观上看起来没有什么区别,但你可以选中他们,在属性面板上找到不同。
|
||||
|
||||
- 模组SDK事件(“监听服务端事件:”开头的节点)的类型为**SdkEventNode**;
|
||||
- 零件事件(“监听零件事件:”开头的节点)的类型为**PartEventNode**。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
对于生物受伤来说,如果你希望当前场景中的任何一个生物在受伤的时候,都会从监听节点开始执行一些逻辑,那么你应该使用**模组SDK事件**(“监听事件:”开头的节点)。当然后续你可以根据伤害来源,实体ID来判断到底是谁触发的这个事件。
|
||||
|
||||
**零件事件**只用于预设架构,如果你使用了实体预设/玩家预设,并且将你的蓝图零件挂接在了这个预设下,那么如果使用零件事件的话,只有实际受伤/造成伤害的生物(玩家),才会监听到这个事件并且执行后续的逻辑,在某些情况下,你可以省去判断ID的步骤。即如果你希望只有零件挂接的当事人触发这个事件,那么建议使用零件事件。
|
||||
|
||||
使用零件事件通常会拥有更好的性能,尤其是如果你把零件挂接在会生成大量实例的预设下的时候,比如覆盖原版的僵尸预设。
|
||||
|
||||
## 监听和广播自定义事件
|
||||
|
||||
### 1. 事件系统
|
||||
|
||||
**事件系统**的主要目的是降低功能逻辑之间的相互关联性,提高开发者管理、编辑的便捷度。
|
||||
|
||||
如果有良好的代码习惯的话,你应该尽力减少功能逻辑之间的直接关联,并将不同的逻辑写到不同的零件中,挂接到合适的预设下。比如跟HUD相关的UI,写到界面蓝图零件里,并且挂接到界面预设下;跟玩家有关的逻辑,写到另外的零件,挂接到玩家预设下。在这种前提下,你就需要使用事件系统来进行不同零件(实例)之间的通讯(沟通)。
|
||||
|
||||
除了自带的引擎事件外,你自己也可以使用事件系统来进行**自定义事件**的广播和监听。为了让开发者更方便地使用自定义事件,我们将过去复杂的各类通讯节点整合为三个复合节点:
|
||||
|
||||
- 广播/通知事件节点
|
||||
- 监听事件节点
|
||||
- 取消监听事件节点
|
||||
|
||||
下面我们将通过一个例子展示如何使用这些节点。我们希望实现的效果是:**当监听到“放置红石”的事件时,在零件当前位置放置一个红石块。**
|
||||
|
||||
### 2. 广播/通知事件节点
|
||||
|
||||
当我们需要广播/通知一个事件时,可以单击鼠标右键,在节点菜单中找到【事件广播与监听】目录,然后在二级菜单下找到【广播/通知事件】节点,点击即可创建。
|
||||
|
||||

|
||||
|
||||
这个节点需要先选择一个【**广播/通知范围**】,并传递2个参数:【**事件名称**】和【**事件数据**】。
|
||||
|
||||
#### <font color="#0074e0">1)广播/通知范围</font>
|
||||
|
||||
广播/通知范围指的是我们希望这个事件可以被哪些对象监听到。在这个范围之外的对象,都不会对这个事件做出任何反应。点开下拉框,我们可以看到5个选项,它们分别的使用场景如下表所示:
|
||||
|
||||
| 广播/通知范围 | 使用场景 |
|
||||
| ---- | ---- |
|
||||
| 同一端内广播事件 (预设系统内) | <b>常用的广播选项。</b><br/>可用于<b>在预设系统内</b>进行<b>同一端</b>的事件广播,例如服务端广播到服务端,客户端广播到客户端。<br/>监听时范围请选择“<font color="#0074e0">来自预设系统的事件</font>”。|
|
||||
| 同一端内广播事件 (通用) | 可用于在<b>同一端内</b>广播零件事件,例如服务端广播到服务端,客户端广播到客户端。<br/>监听时范围请选择“<font color="#0074e0">来自某个零件的事件</font>”或“<font color="#0074e0">来自零件自身的事件</font>”。|
|
||||
| 从客户端通知到服务端 | 适用于<b>在客户端,通知服务端</b>执行某些逻辑。<br/>监听时范围请选择“<font color="#0074e0">来自某个零件的事件</font>”或“<font color="#0074e0">来自零件自身的事件</font>”。|
|
||||
| 从服务端通知到单个客户端 | 适用于<b>在服务端,通知某个(玩家的)客户端</b>执行某些逻辑。<br/>监听时范围请选择“<font color="#0074e0">来自某个零件的事件</font>”或“<font color="#0074e0">来自零件自身的事件</font>”。|
|
||||
| 从服务端广播到所有客户端 | 适用于<b>在服务端通知所有(玩家的)客户端</b> 都执行某些逻辑。<br/>监听时范围请选择“<font color="#0074e0">来自某个零件的事件</font>”或“<font color="#0074e0">来自零件自身的事件</font>”。|
|
||||
|
||||
我们在使用时可以直接将鼠标悬停到每个选项上,通过弹出的hover提示来阅读使用说明。
|
||||
|
||||
在这个示例中,我们没有其他特殊需求,故使用【同一端内广播事件(预设系统内)】即可。
|
||||
|
||||

|
||||
|
||||
#### <font color="#0074e0">2)事件名称</font>
|
||||
|
||||
即希望这个事件叫什么。这里我们需要输入名称字符串,可以按照它的功能直接将其命名为 **“放置红石”**。
|
||||
|
||||
#### <font color="#0074e0">3)事件数据</font>
|
||||
|
||||
如果你需要在事件触发时传入一些数据,可以将它们传到这个引脚。例如你需要在监听到放置红石的事件发生时,判断是否是玩家A放置的,则需要在事件广播时,在事件数据引脚中传入玩家Id,方便后续监听时调用。
|
||||
|
||||
当需要传递数据时,一般需要传递一个**字典**,然后在事件接收方执行的函数里通过**获取属性**的方式获取传过去的参数。如果不需要传递数据的话,这个参数留空即可。
|
||||
|
||||
> **提示:** 创建字典可以使用节点菜单中找到【参数构造节点】目录下的【构造字典】节点。
|
||||
|
||||

|
||||
|
||||
#### <font color="#0074e0">4)其他参数</font>
|
||||
|
||||
部分广播/通知范围选项会需要我们传入额外的参数。例如在选择【从服务端通知到单个客户端】时,我们可以发现下面新增了一个【玩家ID】引脚,用于指定是需要通知到那个玩家的客户端。
|
||||
|
||||
我们将广播/通知事件节点与其他节点通过执行连线连接起来,就可以在需要时进行“放置红石”事件的广播了。
|
||||
|
||||

|
||||
|
||||
### 3. 监听事件节点
|
||||
|
||||
当我们广播了一个事件,就需要在合适的地方对齐进行监听,保证能收到这个事件“信号”,从而进行后续操作。我们同样可以在【事件广播与监听】目录下点击【事件监听节点】来创建它。
|
||||
|
||||
使用事件监听节点时,首先需要指定该节点的【**监听范围**】,然后传入【**事件名称**】、【**回调函数所在对象**】、【**回调函数**】名三个参数。
|
||||
|
||||
#### <font color="#0074e0">1)监听范围</font>
|
||||
|
||||
监听范围指的是我们希望这个监听来自哪些对象的事件广播。在这个范围之外的对象发出的事件,都会被忽略。点开下拉框,我们可以看到5个选项,它们分别的使用场景如下表所示:
|
||||
|
||||
| 监听范围 | 使用场景 |
|
||||
| ---- | ---- |
|
||||
| 来自预设系统的事件 | <b>常用的监听范围。</b> <br/>可用于监听<b>来自预设系统</b>的某个事件。<br/>对应广播范围“<font color="#0074e0">同一端内广播事件(预设系统内)</font>”。 |
|
||||
| 来自某个零件的事件 | 只监听来自<b>某个零件</b>的某个事件。需要传入零件ID进行范围限定。<br/>可以监听<b>除</b>“<font color="#0074e0">同一端内广播事件 (预设系统内)</font>”<b>以外</b>的其他所有广播范围的事件。 |
|
||||
| 来自零件自身的事件 | 只监听来自<b>当前零件自身</b>的某个事件。是“<font color="#0074e0">来自某个零件的事件</font>”的特殊形式。<br/>可以监听<b>除</b>“<font color="#0074e0">同一端内广播事件 (预设系统内)</font>”<b>以外</b>的其他所有广播范围的事件。 |
|
||||
| 来自引擎的事件 | 监听来自<b>引擎</b>的某个事件。<br/>“来自引擎的事件”指的是中国版ModSDK自带的事件,你可以在<b>官网API文档</b>中查阅到它们。 |
|
||||
| 任意事件 | 监听<b>任意来源</b>的某个事件。<br/>如果需要监听你在模组中使用SDK代码自己写的事件,可以使用这个选项。 |
|
||||
|
||||
在这个示例中,我们没有其他特殊需求,故使用【来自预设系统的事件】即可。
|
||||
|
||||
#### <font color="#0074e0">2)事件名称</font>
|
||||
|
||||
即我们需要监听到的事件名字叫什么。这里我们可以填写之前广播的事件名称 **“放置红石”**。
|
||||
|
||||
#### <font color="#0074e0">3)回调函数所在对象</font>
|
||||
|
||||
**回调函数**是一个开发者在蓝图中创建的自定义接口。我们将需要执行的逻辑写到这个自定义接口中。当事件被监听到时,即可调用这个自定义接口,来执行对应的逻辑。
|
||||
|
||||
但是当零件A监听到一个事件E时,可能是要求另外一个零件B执行这个逻辑f_b。在这种情况下,我们应该将这个自定义接口f_b写在零件B的蓝图中。
|
||||
|
||||
这里的零件B就是**回调函数所在对象**。默认为零件自身。
|
||||
|
||||
在我们的例子中,由于事件就是零件本身发出的,所以这里可以留空不传入任何值。
|
||||
|
||||
#### <font color="#0074e0">4)回调函数名</font>
|
||||
|
||||
上面例子中的自定义接口名称f_b就是回调函数名。直接输入名称字符串即可。
|
||||
|
||||
> **注:自定义接口的命名规范:**
|
||||
> - 以“f_”开头
|
||||
> - 仅可包含英文字母、数字、下划线
|
||||
> - 不超过20个字符
|
||||
|
||||
在这个例子中,我们已经创建了一个自定义接口,名为“f_place”,所以这里我们在【回调函数名】处选择str类型,并填入“f_place”即可。
|
||||
|
||||

|
||||
|
||||
**<font color="#0074e0">提示:回调函数中事件数据的使用方式</font>**
|
||||
|
||||
如果事件在发送过程中传入了事件数据,则需要将其传入到回调函数对应的自定义接口图表中去。具体方法是:
|
||||
- 在左侧【当前蓝图】窗口中**鼠标左键点击**对应的自定义接口,右侧属性栏出现其属性;
|
||||
- 点击【输入参数】右侧的【+】号,创建一个输入参数,**并将其类型修改为Any**;
|
||||
- 创建【获取属性】节点,并将输入参数传递到【对象】引脚,然后在【key】中填写你需要获取的数据在字典中对应的key值,即可输出需要的事件数据了。
|
||||
|
||||

|
||||
|
||||
**<font color="#0074e0">5)其他参数</font>**
|
||||
|
||||
部分监听范围选项会需要我们传入额外的参数。例如在选择【来自某个零件的事件】时,我们可以发现下面新增了一个【零件ID】引脚,用于指定是需要监听来自哪个零件的事件。
|
||||
|
||||
放置方块是一个服务端操作,使用到的节点【设置方块(SetBlock)】是一个仅服务端节点,所以我们需要在服务端初始化的时候进行监听。将监听事件节点连接到【服务端初始化】节点之后,就可以监听到“放置红石”事件了。
|
||||
|
||||

|
||||
|
||||
至此,使用广播/通知事件节点和监听事件节点,我们就完成了我们所期望的逻辑编写。最终蓝图如下,其中主要运用的就是【广播/通知事件】和【监听事件】两个节点:
|
||||
|
||||

|
||||
|
||||
### 4. 取消监听事件节点
|
||||
|
||||
如果你有特殊需要,希望在逻辑执行过程中取消对某个事件的监听,则可以使用【取消监听事件】节点。该节点的各个参数配置方式、使用场景均与上述【监听事件】节点一致,故再次不再赘述。
|
||||
|
||||

|
||||
|
||||
|
||||
61
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/49-界面蓝图.md
Normal file
@@ -0,0 +1,61 @@
|
||||
---
|
||||
front:
|
||||
hard: 高级
|
||||
time: 20分钟
|
||||
selection:
|
||||
---
|
||||
|
||||
# 界面蓝图
|
||||
|
||||
界面蓝图学习起来相对较复杂,推荐开发者们先观看下列视频:
|
||||
|
||||
- [更换模型和添加界面](../30-新版示例教程(视频)/07-制作简易射击附加包(视频)/01.md)
|
||||
- [开关瞄准镜](../30-新版示例教程(视频)/07-制作简易射击附加包(视频)/02.md)
|
||||
|
||||
## 创建蓝图和组装预设
|
||||
|
||||
在编辑器蓝图简易射击模板中,有界面蓝图的使用示例,我们可以参考其中的写法进行学习。
|
||||
|
||||
新版逻辑编辑器支持制作界面,在制作前,你可能需要先了解一下[界面预设](../../14-预设玩法编程/0-理解预设系统/10-预设/5-界面预设.md)。
|
||||
|
||||
在创建完UI预设之后,你可以通过新建文件向导创建一个UI蓝图零件。
|
||||
|
||||

|
||||
|
||||
注意,想要UI蓝图零件生效,你必须将其直接挂接到对应的UI蓝图下,类似下图。
|
||||
|
||||

|
||||
|
||||
## 起始事件
|
||||
|
||||
打开UI蓝图零件,除了蓝图零件自带的6个事件之外,你会发现他还有4个额外的UI相关的事件,如下图,分别是:
|
||||
|
||||
- **创建:** UI创建成功时,一般在这里进行UI逻辑的初始化
|
||||
- **激活:** 当你的UI被激活时
|
||||
- **反激活:** 当你的UI被取消激活时
|
||||
- **销毁:** 你的UI被销毁时
|
||||
|
||||

|
||||
|
||||
可以查看一下你的UI预设,如果你选择的CreateUI,那么你主要使用上述的“创建”节点,否则(选PushScreen),你主要使用“激活”和“反激活”节点。
|
||||
|
||||

|
||||
|
||||
## 调用接口
|
||||
|
||||
界面相关的接口主要分布在下图的菜单中。
|
||||
|
||||

|
||||
|
||||
我们以`设置是否显示某控件(SetVisible)`为例,下面这个节点是我们需要使用的节点
|
||||
|
||||
- **调用对象:** 希望对哪个控件调用,需要使用`获取基础UI控制实例(GetBaseUIControl)`传入基础UI控制实例。
|
||||
- **是否可见:** 希望控件显示还是隐藏。
|
||||
- **是否强制刷新:** 是否在调用接口后立刻刷新这个控件的显示状态。
|
||||
|
||||

|
||||
|
||||
对于控件路径,我们可以在界面编辑器中获取,比如右键复制下面这个控件的路径,并粘贴到上图的节点中。
|
||||
|
||||

|
||||
|
||||
32
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/50-蓝图测试.md
Normal file
@@ -0,0 +1,32 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 5分钟
|
||||
selection:
|
||||
---
|
||||
|
||||
# 测试蓝图逻辑
|
||||
|
||||
当我们编写完蓝图逻辑,就可以进行测试,来检验我们的逻辑编写得是否正确。下面我们将演示蓝图的测试:
|
||||
|
||||
我们以一个挂在预加载空预设下的蓝图零件为例,该蓝图的逻辑是:每帧在日志窗口打印一句hello。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
在.bp文件中编辑完蓝图的逻辑后,首先需要点击保存按钮保存蓝图。
|
||||
|
||||

|
||||
|
||||
保存蓝图之后,我们点击运行按钮,即可在开发包中测试我们的蓝图逻辑:
|
||||
|
||||

|
||||
|
||||
初次进入时,可能需要等待较长的时间以完成加载。
|
||||
|
||||

|
||||
|
||||
进入游戏后,会为我们自动打开调试工具窗口,可以看到每帧都会打印一句hello,证明该蓝图零件的逻辑已在游戏中生效。
|
||||
|
||||

|
||||
48
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/55-错误解决.md
Normal file
@@ -0,0 +1,48 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 5分钟
|
||||
selection:
|
||||
---
|
||||
|
||||
# 错误解决
|
||||
|
||||
一般情况下,由于我们对蓝图做出了诸多的连接限制,使用蓝图很少会出现语法错误,但是仍然可能出现一些逻辑上的错误。当出现错误(bug)的时候,你就需要用到一些简单的技巧,来排查和解决这些错误。
|
||||
|
||||
与模组SDK的代码编程类似,我们没有提供单独调试的功能,你只能通过观察日志的方式来解决bug。
|
||||
|
||||
## 打印信息
|
||||
|
||||
打印(print)节点,在大部分情况下,都是你最好的伙伴,出现任何费解的问题,都可以通过打印看一下当前的情况。
|
||||
|
||||
目前我们支持一种简单的打印:打印信息,以及三种复杂的打印方式:调试,错误和消息日志。将这些节点如下图连接好,并且填上相应的信息,然后点击运行。
|
||||
|
||||

|
||||
|
||||
运行后,你可以在脚本测试日志里看到如下的信息。将你认为有问题的值连接到打印节点的信息处即可将他们打印出来。
|
||||
|
||||

|
||||
|
||||
如下图,我们可以让零件在有实体受到伤害时,打印伤害源ID和伤害来源的类型。
|
||||
|
||||

|
||||
|
||||
下图即为生存模式下玩家受到僵尸攻击时的打印日志。
|
||||
|
||||

|
||||
|
||||
## 详细调试日志
|
||||
|
||||
有时,如果不想加入太多的打印节点,或者没有特别的打印需求,可以直接点击觉得有问题的节点,并勾选详细调试日志,如果这个节点被正确的跑到了,那么会在日志里显示节点执行的详细信息。
|
||||
|
||||

|
||||
|
||||
下图就是这个节点的详细信息,我们只需要关注黄框内的基础信息:
|
||||
|
||||
- apiName:是哪个接口,与这个节点的英文名称对应,可以在节点的属性面板找到
|
||||
- portData:字典,显示你传入的所有参数
|
||||
- constants:也是参数,但只显示你在节点直接输入的参数
|
||||
|
||||

|
||||
|
||||
|
||||
29
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/60-在文档中查阅内置游戏接口.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# 在文档中查阅内置游戏接口
|
||||
|
||||
|
||||
|
||||
新版编辑器有大量的**内置游戏接口**,开发者在使用时可能难以通过节点本身样式了解到该节点是如何使用的。在这种情况下,开发者可以使用节点的接口名在官网API文档中查阅对应接口的说明。
|
||||
|
||||
|
||||
|
||||
第一步:选中节点,在右侧属性窗口中找到该内置游戏接口的接口名,通过ctrl+c复制下来。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
第二步:打开开发者官网的[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)。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
第三步:将复制下来的接口名粘贴到页面搜索框中,然后在弹出的搜索结果中根据接口类别找到对应的接口。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
第四步:点击后,会自动跳转到对应接口的说明文档。
|
||||
|
||||

|
||||
99
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/70-节点基础.md
Normal file
@@ -0,0 +1,99 @@
|
||||
# 节点基础
|
||||
|
||||
新版逻辑编辑器提供的蓝图在使用上与Python代码保持着比较大的一致性。使用不同类型的节点会有不同的规则。
|
||||
|
||||
## 让蓝图生效
|
||||
|
||||
注意,想要让你写的节点图运行起来,你需要将蓝图零件挂接至一个勾选有预加载的空预设(请参考[新建预设并添加素材](../../14-预设玩法编程/9-第一个预设Mod/1-新建预设并添加素材.md)),或者挂接至预设,并将其通过关卡编辑器放置在场景中。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 监听和调用
|
||||
|
||||
通过在图表的空白处右键浏览节点时,你会发现我们相同的节点会有不同的前缀,分别是“监听”和“调用”。
|
||||
|
||||

|
||||
|
||||
调用的意思是,执行这个接口的操作,比如“发送向某个玩家聊天框消息”,如下图你可以看到调用类型的节点,既有“In”也有“Out”,有执行引脚,才能连到节点图中用于执行逻辑。
|
||||
|
||||
监听的意思是:当“发送聊天框消息”这个接口被调用的时候。可以看到监听类型的节点没有“In”,只有“Out”,因为它表示一个时机,在这个时机生效,并开始顺序想“Out”连接的节点执行。
|
||||
|
||||

|
||||
|
||||
## 调用对象和静态方法
|
||||
|
||||
这部分需要你对面向对象有一个基本的概念,这是一个编程的概念,如果你不知道的话,可以看这个视频:[什么是面向过程编程,面向对象编程](https://www.bilibili.com/video/BV1pV411d7sL?from=search&seid=7248194267465509786&spm_id_from=333.337.0.0),UP主对此进行了深入浅出的讲解。
|
||||
|
||||
我们以下面两个节点举例,第一个节点是静态方法,不需要对象即可调用。
|
||||
|
||||
第二个节点是零件的节点,只能通过零件的对象(实例)调用,你可以发现在此类节点的参数中,都包含一个“调用对象”。
|
||||
|
||||

|
||||
|
||||
如果你希望自身去调用这个接口(这个零件本身去执行这个接口),你需要通过自身(self)调用,即下面这样。但是这种情况实在是太多了,所以我们做了简化处理,即如果调用对象没有传入数据,那么就默认调用对象的是自身(self)。
|
||||
|
||||

|
||||
|
||||
现在举另外的例子,比如,你希望摧毁自己的父对象,那么显然你需要让“父对象”去调用摧毁这个接口,如下图(因为要销毁的是预设对象,你需要使用预设对象的销毁接口)。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 获取/设置变量
|
||||
|
||||
我们提供了独立的变量管理功能,在新建变量之后,你可以通过直接将变量拖拽出来,并选择获取和设置两种功能节点:
|
||||
|
||||
- 获取:在获取的value输出节点,可以获取到这个变量的值
|
||||
- 设置:在设置的value节点,可以传入,或者直接编辑希望设置的值
|
||||
|
||||

|
||||
|
||||
## 获取/设置自定义接口
|
||||
|
||||
除了变量之外,在Python里,函数(自定义接口)也可以作为一种变量,但是我们目前没有提供拖拽自定义接口来获取或者设置的方法。
|
||||
|
||||
你需要使用这两个节点来获取和设置自定义接口:
|
||||
|
||||
- 获取零件变量:在key里面输入接口名称,就可以从value节点获取到接口了
|
||||
- 设置零件变量:在key里面输入接口名称,就可以把这个接口设置为value节点传入的节点
|
||||
|
||||

|
||||
|
||||
## 零件预设接口和SDK组件接口
|
||||
|
||||
我们以传送玩家为例,可以看到3种不同的调用接口:
|
||||
|
||||
- 维度组件服务端接口:归属于模组SDK的接口
|
||||
- 零件接口:归属于预设架构的接口
|
||||
- 预设对象接口:与零件接口基本一致
|
||||
|
||||

|
||||
|
||||
下图左边是维度组件服务端接口,右边是零件接口,我们可以对照他们的api文档进行讲解。
|
||||
|
||||

|
||||
|
||||
下图是维度组件服务端调用传送玩家的接口,我们重点关注他的示例。
|
||||
|
||||

|
||||
|
||||
可以看到,这里是先给player(玩家)创建了一个Dimension组件,然后再调用组件执行后续的传送逻辑。
|
||||
|
||||
```python
|
||||
import mod.server.extraServerApi as serverApi
|
||||
comp = serverApi.GetEngineCompFactory().CreateDimension(playerId)
|
||||
comp.ChangePlayerDimension(0, (0,4,0))
|
||||
```
|
||||
|
||||
所以这个节点的entityId应该传我们希望进行传送的玩家。
|
||||
|
||||

|
||||
|
||||
像下图的零件接口的版本,翻译比较清晰。
|
||||
|
||||

|
||||
|
||||
建议在有类似这种有相同名称的接口的情况下,直接选择零件接口。
|
||||
121
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/72-常用节点.md
Normal file
@@ -0,0 +1,121 @@
|
||||
# 常用节点
|
||||
|
||||
|
||||
|
||||
## 参数节点
|
||||
|
||||
参数节点可通过右键菜单直接创建,用于构造并传递对应类型的参数,共有以下3类:
|
||||
|
||||
#### 1)构造列表(ListParameterNode)
|
||||
|
||||
用于构造一个列表,并传递给下一个节点。可以通过右边属性窗口【长度】属性修改列表长度。列表元素可以分别选择数据类型,并直接填入值。同时,也可以通过数据连线将值传入列表,对列表元素进行赋值。
|
||||
|
||||

|
||||
|
||||
#### 2)构造列表(ListParameterNode)
|
||||
|
||||
用于构造一个字典,并传递给下一个节点。可以通过右边属性窗口【长度】属性修改字典键值对数。字典的键(key)、值(value)可以分别选择数据类型,但一般键都会是字符串(Str)。键和值都可以直接填写,也可以通过数据连线将值传入。
|
||||
|
||||

|
||||
|
||||
#### 3)其他参数节点
|
||||
|
||||
剩余的参数节点共有5种,分别是:任意类型参数(Any)、布尔型参数(Bool)、整型参数(Int)、浮点型参数(Float)、字符串参数(Str)。这些类型可用于固定值的传入,以及同一个值同时传入多个节点的情况(方便统一修改)。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 定时器
|
||||
|
||||
定时器是一种用于延迟执行自定义接口的节点,我们提供了:
|
||||
|
||||
- 添加定时器:在一段延迟时间后,执行函数
|
||||
- 添加重复定时器:在一段延迟时间后,重复执行函数,重复的时间与延迟时间相同
|
||||
|
||||
函数使用获取自定义接口的方法获取,比如我们下图中,我们希望每隔1秒,执行一次Ticking函数。
|
||||
|
||||

|
||||
|
||||
添加定时器的输出节点是定时器实例,如果你想要停止定时器,你可以
|
||||
|
||||
- 在添加定时器的时候,将返回值设置到一个变量中
|
||||
- 获取变量,并调用取消定时器的接口
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 条件和阀门
|
||||
|
||||
当你想编写分支逻辑的时候,你需要用到条件节点或者阀门节点
|
||||
|
||||
- 条件:根据传入的bool(布尔值)判断,如果是真(true)执行“真”连出去的逻辑,否则执行“假”连出去的逻辑
|
||||
- 阀门:对传入的input1和input2进行判断,如果他们相等,那么继续向后执行,否则不再继续执行
|
||||
|
||||

|
||||
|
||||
如下图,这个是跑酷模板的一部分逻辑,如果可以获取到红石预设的话,我们就销毁这个红石,如果获取不到,我们就生成一个红石。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 拆分/合并坐标
|
||||
|
||||
如果一个节点需要tuple(元组)类型的参数,除了通过list(列表)转化为tuple之外,你可以通过下面4个节点进行2,3个元素的tuple的拆分和合并。
|
||||
|
||||

|
||||
|
||||
例如下面这个例子,我们要判断玩家的高度是否小于80,需要用到这个接口,他的返回值是一个包含3个float的tuple。
|
||||
|
||||

|
||||
|
||||
我们可以这样连接蓝图。
|
||||
|
||||

|
||||
|
||||
需要传入tuple同理,参考下面的蓝图,可以把玩家传送到(0,175,-3)处。
|
||||
|
||||

|
||||
|
||||
|
||||
## 枚举节点
|
||||
|
||||
如果你遇到某些节点需要传入枚举值数据,那么枚举节点可以很方便地帮你找到对应的枚举值。
|
||||
|
||||
在逻辑编辑器的节点菜单中,我们可以找到 **“枚举节点”**,在它的二级菜单中有我们可能用到的所有枚举值类型。
|
||||
|
||||

|
||||
|
||||
例如我们需要“盔甲槽位”枚举值,可以直接需要传入枚举值的引脚拖出连线,调出节点菜单,然后在 **“枚举节点”** 中选择 **“构造 盔甲槽位 枚举值”**,即可创建该枚举值节点。想要选择具体传入的值,我们直接在右侧属性窗口的 **“盔甲槽位”** 下拉框中选择需要的值即可。
|
||||
|
||||

|
||||
|
||||
|
||||
## 循环
|
||||
|
||||
我们很开心的告诉大家,旧版逻辑编辑器不支持的循环在新版里得到了支持。你可以看到下面两种节点,他们的生效机制略有不同,我们分开来讲。
|
||||
|
||||

|
||||
|
||||
下图是顺序循环遍历节点的使用示例,从起始索引开始,向终止索引按照1的步长,每次迭代执行一次循环体,并在迭代结束后,执行遍历完成。
|
||||
|
||||

|
||||
|
||||
他的日志输出结果如下图。
|
||||
|
||||

|
||||
|
||||
另外一种循环是对列表的所有元素进行迭代,这种循环的应用场景要广泛的多。我们的很多接口都会返回一个列表,除了直接获取第几个元素之外,我们最常见的应用方法还是直接使用条件循环对其进行迭代。
|
||||
|
||||
循环的另外一个功能是,当有输入从循环节点的跳出连进去时,直接跳出这个循环(立刻执行遍历完成的逻辑)。
|
||||
|
||||

|
||||
|
||||
上图的日志结果如下图所示。
|
||||
|
||||

|
||||
|
||||
78
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/74-万能节点.md
Normal file
@@ -0,0 +1,78 @@
|
||||
# 万能节点
|
||||
|
||||
## 获取/设置属性
|
||||
|
||||
这两个节点几乎可以用于任何对象的属性获取和设置
|
||||
|
||||
- 对象:从“谁”那获取
|
||||
- key:获取哪个属性
|
||||
- 值:获取的值
|
||||
|
||||

|
||||
|
||||
例如你可以通过这个节点获取字典某一个key对应的值
|
||||
|
||||

|
||||
|
||||
获取列表的某个元素也可以使用这个节点,如下图,在key里填写1,即可获取到列表的第2个元素(列表的元素的序号是从0开始的)。
|
||||
|
||||

|
||||
|
||||
## 调用零件接口
|
||||
|
||||
目前我们已经支持了几乎所有的零件接口,如果你还是会遇到零件接口确实,或者参数/返回值缺失等等情况,那么你可以直接使用“调用零件接口”,在他的属性界面进行设置。
|
||||
|
||||
- 输入参数:可以增加输入参数,参数的名称随意,但是类型需要尽量和官方文档里的类型匹配(如果没有,可以设置为any)
|
||||
- 输出端口:与输入类似,对应文档的输出
|
||||
- 调用接口:填写接口的名称
|
||||
|
||||

|
||||
|
||||
调用零件接口只能在<a href="../../../../mcdocs/3-PresetAPI/预设对象/零件/零件PartBase.html" rel="noopenner"> 零件PartBase </a>的接口中寻找。
|
||||
|
||||
如图,可以使用partbase和其继承的接口。
|
||||
|
||||

|
||||
|
||||
例如下面这个接口。
|
||||
|
||||

|
||||
|
||||
可以在进行如下简单设置后直接使用。
|
||||
|
||||

|
||||
|
||||
## 调用预设对象接口
|
||||
|
||||
与调用零件接口非常类似。
|
||||
|
||||

|
||||
|
||||
适用于下面的所有分类下的接口。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
注意,这些接口往往不是通过零件自身调用的,调用对象一般不能留空,例如。
|
||||
|
||||
这个是玩家对象的接口,只能由玩家预设(继承自玩家对象)来调用。
|
||||
|
||||

|
||||
|
||||
## 调用预设管理接口
|
||||
|
||||
与上面的节点类似,适用于<a href="../../../../mcdocs/3-PresetAPI/预设管理/PresetApi.html" rel="noopenner"> PresetApi(预设管理接口) </a>的直接调用。
|
||||
|
||||

|
||||
|
||||
## SDK组件接口
|
||||
|
||||
与上面的节点类似,分为服务端和客户端两种不同的接口。
|
||||
|
||||

|
||||
|
||||
适用于Mod API的接口的调用。
|
||||
|
||||

|
||||
|
||||
25
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/90-使用变长参数.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# 使用变长参数
|
||||
|
||||
变长参数是Python的一种函数的参数用法,现阶段的逻辑编辑器没有自动支持,但是需要的时候你仍然可以自主添加。
|
||||
|
||||
目前的内置接口里,涉及到变长参数的有下面这些
|
||||
|
||||
- AddRepeatedTimer(添加重复定时器)
|
||||
- AddTimer(添加定时器)
|
||||
- LogDebug(调试日志)
|
||||
- LogInfo(消息日志)
|
||||
- LogError(错误日志)
|
||||
|
||||
不同节点的变长参数的作用不同,我们以“添加重复定时器为例”。下图是其在技术手册中的<a href="../../../../mcdocs/3-PresetAPI/预设对象/通用/SDK接口封装SdkInterface.html#addrepeatedtimer" rel="noopenner"> 文档 </a>。
|
||||
|
||||
在文档的参数表格中可以看到,这个节点最后包括一个变长参数和一个字典变长参数。
|
||||
|
||||

|
||||
|
||||
在逻辑编辑器中添加这个节点,点击节点,可以在节点的属性面板中看到它的输入参数(一般情况下,对于内置节点来说这个是无需改动的)。
|
||||
|
||||

|
||||
|
||||
我们按照技术手册的文档为这个函数手动增加两个参数,就可以使用变长参数了,如下图。对于定时器来说,你可以给变长参数传递触发函数所需要的参数,是一种比较常见的用法。
|
||||
|
||||

|
||||
@@ -0,0 +1,51 @@
|
||||
# 将旧版逻辑编辑器作品到新版
|
||||
|
||||
## 打开ets文件
|
||||
|
||||
新建新版作品和旧版作品升级的方法请见[创建新版作品](../../14-预设玩法编程/9-第一个预设Mod/0-创建新版作品.md)。
|
||||
|
||||
对于逻辑文件来说,旧版编辑器使用的是.ets文件,而新版使用的.bp文件。
|
||||
|
||||
新版逻辑编辑器的改动非常大,无法正常支持ets文件,你只能在旧版编辑器里打开,并在新版编辑器中再连接一遍,对此带来的问题我们深表歉意。
|
||||
|
||||
新版编辑器虽然不支持打开ets,但是ets文件仍然是生效的,并且手机和电脑端的我的世界也将继续支持使用ets的模组。
|
||||
|
||||
如果你需要继续编辑ets,可以打开旧版编辑器,使用逻辑编辑器的打开功能,选择需要编辑的ets文件(这一步可以是任意目录,不需要是作品自身的目录)。
|
||||
|
||||

|
||||
|
||||
## 新旧逻辑文件的对比
|
||||
|
||||
新旧逻辑编辑器在形式和功能上有巨大的差异,但是底层逻辑实际是相似的。
|
||||
|
||||
下图是跑酷模板的开头,我们现在将其转换为新版的写法。
|
||||
|
||||

|
||||
|
||||
他们的对应关系可以参考下面的表格。
|
||||
|
||||
| 旧版逻辑编辑器 | 新版逻辑编辑器 |
|
||||
| ------------------------------------------ | ------------------------------------------------- |
|
||||
| 语句 | 节点 |
|
||||
| 箭头引脚(语句的突起和凹陷) | 节点的执行引脚(“In”相当于凹陷,“Out”相当于突起) |
|
||||
| 事件语句(橙色),只有突起(用于引出箭头) | 事件节点,只有“Out”引脚 |
|
||||
| 临时变量 | 变量 |
|
||||
| 宏 | 自定义接口(功能有一定区别) |
|
||||
|
||||
对于变量来说,旧版逻辑编辑器的变量只出现在语句之间,而新版有了正式的变量,并且移除了旧版的临时变量。
|
||||
|
||||
你可以看到新版逻辑编辑器的左侧有变量的管理界面,你可以在这里新建/删除/重命名变量,并且设定变量的类型和默认值。例如上图的最后一个语句(设置一个临时变量的默认值),在新版的结构中就不再需要一个单独的节点了。
|
||||
|
||||

|
||||
|
||||
新版逻辑编辑器引入了几乎所有对中国版模组开发有用的节点,并且删除了大量之前的语句,例如你可以看到,“世界创建完成时”语句被替换成了“服务端初始化”,“获取当时时间”被替换成了“当前时间戳”。
|
||||
|
||||
## 旧逻辑文件的使用
|
||||
|
||||
无论你是使用旧版逻辑文件(ets)还是新版逻辑文件(bp),你都需要用到零件。
|
||||
|
||||
除了在熟悉的世界零件里添加ets之外,你可以在任意零件的属性面板里发现逻辑文件,点击“+”即可添加一个逻辑文件的选择下拉框,在这里选择ets文件即可。
|
||||
|
||||
只把ets配在这里是不会让他在游戏内生效的,你需要将零件挂接在预设中,并且让预设最终在游戏内实例化。相关的文档可以查看这里:[在场景中实例化](../../14-预设玩法编程/9-第一个预设Mod/2-在场景中实例化.md)。
|
||||
|
||||

|
||||
1
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/debug.log
Normal file
@@ -0,0 +1 @@
|
||||
[1225/224641.228:ERROR:icu_util.cc(249)] Couldn't mmap icu data file
|
||||
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/12.png
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/13.gif
Normal file
|
After Width: | Height: | Size: 253 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/42-1.gif
Normal file
|
After Width: | Height: | Size: 903 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/42-2.gif
Normal file
|
After Width: | Height: | Size: 732 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/42-4.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/49-3.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/7-1.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/7-2.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/7-3.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/7-4.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/A2.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/A3.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/A4.png
Normal file
|
After Width: | Height: | Size: 194 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/A5.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/A6.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/B1.gif
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/B2.gif
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/B3.gif
Normal file
|
After Width: | Height: | Size: 350 KiB |
BIN
mcguide/20-玩法开发/12-可视化编程/10-新版逻辑编辑器使用说明/images/B4.gif
Normal file
|
After Width: | Height: | Size: 862 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 175 KiB |
|
After Width: | Height: | Size: 70 KiB |