Files
netease-modsdk-wiki/docs/mconline/60-我的世界创造营教程/玩法组件基础教程/6-独立完成一个作品/2-逻辑编辑器基础.md
boybook 760c2dd9ad 2.6
2025-12-01 20:59:16 +08:00

173 lines
5.9 KiB
Markdown
Raw Blame History

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