feat:上传mcguide-开发指南部份

This commit is contained in:
Othniel su
2024-12-23 10:57:59 +08:00
parent 7292166c88
commit 0dc59fa4f0
3297 changed files with 63375 additions and 0 deletions

View File

@@ -0,0 +1,92 @@
---
front: https://nie.res.netease.com/r/pic/20210727/1e450bb1-ee50-4e6c-b614-7fbd6a00b4e7.png
hard: 入门
time: 5分钟
---
# 实体预设
## 基础介绍
EntityPreset实体预设是一类绑定MC的某类实体的特殊预设通过它可以很方便的使用零件进行一些实体相关逻辑的编程。
实体预设除了预设所具有的基本属性外,额外提供一个"关联实体ID"的属性可将实体预设和某个identifier的实体绑定起来如"猪""minecraft:pig"。此时下方会自动显示所关联的实体的json文件内容但当关联的文件不在个人存档内时编辑是无效的如MC原生的资源
![image-20210709172014742](./images/image-20210709172014742.png)
注意在修改所关联实体的json文件内容后若实际表现与显示属性不符需要点击刷新所有属性按钮进行更新。或尝试重启编辑器。
![image-20210709172800619](./images/image-20210709172800619.png)
此时可从资源管理器或预设库中拖到场景内进行实例化,就可以在地图上看到具体的实体了。
![image-20210709172941828](./images/image-20210709172941828.png)
特别注意实体预设绑定实体ID后所生成的所有该ID的实体均会同时绑定一个实体预设具备预设所具有的所有属性。
当你使用新建文件向导创建实体预设的时候,会附带创建一个实体配置,你也可以先创建一个配置,再通过配置来创建与之绑定的实体预设。更多关于配置的信息请详见[配置](../../../15-自定义游戏内容/0-配置.md)。
## 设置属性
> 此部分内容在我的世界中国版2.1版本上线后才能在正式游戏环境生效。
上面介绍了实体预设的通用和实体(关联实体ID的json文件内容)两个属性栏,除此之外我们还提供了数十个无法在json文件直接进行定义和修改的实体属性如实体的重力因子和状态效果等根据功能存放在多个属性栏中如图所示
![entitysettingattr](./images/entitysettingattr.png)
> 设置实体属性的本质是`将之前在代码里调用API才能设置的属性挪到属性面板进行可视化编辑并在实体初始化时根据属性面板的设置数据调用对应的接口并生效。`比如物理这一栏的重力因子属性实际是调用实体对象EntityObject下的SetGravity接口。
实体目前具有以下几种设置属性:
在我的世界中,实体是一个范围非常广的定义,不管是掉落物,生物还是抛射物都可以称之为实体,但下面列出的某些属性,实际上只对部分类型的实体有效,例如,生命值实际上只针对生物有效,对火球、弓箭等实体设置生命值没有意义,也不会生效,请开发者在使用下列属性时,注意甄别自己所选择的实体是否支持设置该属性。
### 实体属性:同时设置实体的几种基础属性的当前值和最大值。
| 属性 | 描述 |
| ------------ | ------------------------------------------------------------ |
| 生命值 | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#sethealth" rel="noopenner">SetHealth</a>和<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setmaxhealth" rel="noopenner">SetMaxHealth</a>接口,设置实体的最大和当前生命值。 |
| 速度 | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setspeed" rel="noopenner">SetSpeed</a>和<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setmaxspeed" rel="noopenner">SetMaxSpeed</a>接口,设置实体的最大和当前速度。 |
| 攻击力 | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setdamage" rel="noopenner">SetDamage</a>和<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setmaxdamage" rel="noopenner">SetMaxDamage</a>接口,设置实体的最大和当前攻击力。 |
| 岩浆里的移速 | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setlavaspeed" rel="noopenner">SetLavaSpeed</a>和<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setmaxlavaspeed" rel="noopenner">SetMaxLavaSpeed</a>接口,设置实体在岩浆里的最大和当前移速。 |
> 注意此处的设置属性会先设置最大值再设置当前值如给自定义牛设置生命值为10则其最大生命值为10当前生命值也为10。
### 物理:设置实体物理相关属性值,如重力因子、是否可推动等
| 属性 | 描述 |
| ---------- | ------------------------------------------------------------ |
| 重力因子 | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setgravity" rel="noopenner"> SetGravity</a>接口,设置实体的初始重力因子,该值为负数。 |
| 是否可推动 | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setpushable" rel="noopenner">SetPushable</a>接口设置实体是否可被推动默认为True。 |
### 氧气:设置实体氧气相关的属性值,如氧气储备值和恢复氧气时间等
| 属性 | 描述 |
| ---------------- | ------------------------------------------------------------ |
| 氧气储备值 | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setcurrentairsupply" rel="noopenner">SetCurrentAirSupply</a>和<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setmaxairsupply" rel="noopenner">SetMaxAirSupply</a>接口,同时设置实体的氧气储备值的当前值和最大值。 |
| 恢复最大氧气时间 | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setrecovertotalairsupplytime" rel="noopenner">SetRecoverTotalAirSupplyTime</a>接口,设置实体恢复最大氧气量的时间,单位秒。 |
### 状态与物品:设置实体的初始状态效果和物品
| 属性 | 描述 |
| ------------ | ------------------------------------------------------------ |
| 添加状态效果 | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#addeffect" rel="noopenner">AddEffect</a>接口,为实体添加指定的初始的状态效果。 |
| 生物物品 | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setitem" rel="noopenner">SetItem</a>接口,为实体设置初始的物品。 |
### 行为属性设置实体的行为逻辑属性值如是否屏蔽原始AI是否免疫伤害等
| 属性 | 描述 |
| ------------ | ------------------------------------------------------------ |
| 是否免疫伤害 | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setimmunedamage" rel="noopenner">SetImmuneDamage</a>接口,设置实体是否免疫伤害,该属性存档。 |
| 保留原生AI | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setblockcontrolai" rel="noopenner">SetBlockControlAi</a>接口设置是否保留实体原生AI屏蔽后实体无法移动不受重力影响不会被推动。 |
| 是否持久化 | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setpersistence" rel="noopenner">SetPersistence</a>接口设置实体是否会在卸载区块和退出游戏时存档默认为True。 |
### 渲染设置:设置实体的渲染与显示属性,如是否渲染实体等
| 属性 | 描述 |
| ------------ | ------------------------------------------------------------ |
| 关闭实体渲染 | 等同于实体对象EntityObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/实体对象EntityObject.html#setnotrender" rel="noopenner">SetNotRender</a>接口设置是否关闭实体渲染默认为False。 |

View File

@@ -0,0 +1,91 @@
---
front: https://nie.res.netease.com/r/pic/20210727/1e450bb1-ee50-4e6c-b614-7fbd6a00b4e7.png
hard: 入门
time: 5分钟
---
# 玩家预设
## 基础介绍
PlayerPreset玩家预设是一类特殊的实体预设玩家预设与玩家实体进行绑定。
每个AddOn编辑器作品只允许创建一个玩家预设。
在预设编辑器,通过菜单栏=>创建预设=>玩家预设我们可以创建一个玩家预设。
![image-20210705160027132](./images/image-20210705160027132.png)
如果玩家预设选项已经灰化,说明你的组件内已经存在一个玩家预设。
通过玩家预设,我们可以给玩家赋予一些炫酷的功能。
> 在编辑器保存时,玩家预设的实例不会保存在预设存档中,如果需要修改,请在预设编辑器中直接修改玩家预设
## 挂接特效
我们把刚才创建的变换动画特效挂接到玩家预设身上,回到关卡编辑器,将变换动画零件的关键帧属性按下图进行修改。
![image-20210707162041367](./images/image-20210707162041367.png)
修改过后变换动画零件的效果变成了特效在前两秒扩大到原来的5倍后两秒恢复为原来的大小。
点击运行,进入游戏后,切换视角可以看到,这个特效已经挂接在玩家身上,并呈现不断缩放的效果。
![scale](./images/scale.gif)
## 设置属性
> 此部分内容在我的世界中国版2.1版本上线后才能在正式游戏环境生效。
玩家预设除了通用的属性之外,还提供了多种属性的设置,这些属性会在玩家被初始化时设置生效,如设置玩家的经验等级、饥饿度与健康值等等,根据功能存放在多个属性栏中,如图所示:
![playersettingattr](./images/playersettingattr.png)
> 设置玩家属性的本质是`将之前在代码里调用API才能设置的属性挪到属性面板进行可视化编辑并在玩家初始化时根据属性面板的设置数据调用对应的接口并生效。`比如经验等级这一分栏内的增加等级属性实际是调用预设的AddPlayerLevel接口。
玩家预设目前具有以下几种设置属性:
### 经验等级:设置玩家的等级相关属性
| 属性 | 描述 |
| ------------ | ------------------------------------------------------------ |
| 增加玩家等级 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#addlevel" rel="noopenner">AddLevel</a>接口,修改玩家等级,可为负数。|
### 饥饿与健康:设置玩家的饥饿度和健康值相关属性
| 属性 | 描述 |
| ------------ | ------------------------------------------------------------ |
| 健康临界值 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#sethealthlevel" rel="noopenner">SetHealthLevel</a>接口设置设置玩家健康临界值当饥饿值大于等于健康临界值时会自动恢复血量开启饥饿值且开启自然恢复时有效原版默认值为18 |
| 饥饿度 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#sethunger" rel="noopenner">SetHunger</a>接口,设置玩家饥饿度 |
| 饥饿临界值 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#setstarvelevel" rel="noopenner">SetStarveLevel</a>接口设置玩家饥饿临界值当饥饿值小于饥饿临界值时会自动扣除血量开启饥饿值且开启饥饿掉血时有效。原版默认值为1 |
| 开启饥饿掉血 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#setnaturalstarve" rel="noopenner">SetNaturalStarve</a>接口,设置是否开启玩家饥饿掉血,当饥饿值小于饥饿临界值时会自动扣除血量,开启饥饿值且开启饥饿掉血时有效.原版默认开启 |
| 饥饿掉血速度 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#setstarvetick" rel="noopenner">SetStarveTick</a>接口,设置玩家饥饿掉血速度,当饥饿值小于饥饿临界值时会自动扣除血量,开启饥饿值且开启饥饿掉血时有效 |
| 开启自然恢复 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#setnaturalregen" rel="noopenner">SetNaturalRegen</a>接口,设置是否开启玩家自然恢复 |
| 自然恢复速度 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#sethealthtick" rel="noopenner">SetHealthTick</a>接口,设置玩家自然恢复速度 |
| 最大消耗度 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#setmaxexhaustionvalue" rel="noopenner">SetMaxExhaustionValue</a>接口,设置玩家最大消耗度(maxExhaustion) |
### 运动:设置玩家运动相关的属性
| 属性 | 描述 |
| ------------ | ------------------------------------------------------------ |
| 最大台阶高度 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#setstepheight" rel="noopenner">SetStepHeight</a>接口,设置玩家前进非跳跃状态下能上的最大台阶高度, 默认值为0.56251的话表示能上一个台阶。 |
| 玩家飞行状态 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#changeflystate" rel="noopenner">ChangeFlyState</a>接口,勾选则给予飞行能力并进入飞行状态,不勾选则进入非飞行状态。 |
| 是否可跳跃 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#setjumpable" rel="noopenner">SetJumpable</a>接口,设置玩家是否可跳跃 |
| 是否可移动 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#setmovable" rel="noopenner">SetMovable</a>接口,设置玩家是否可移动 |
### 行为设置:设置玩家行为逻辑相关的属性
| 属性 | 描述 |
| -------------- | ------------------------------------------------------------ |
| 死亡不掉落物品 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#enablekeepinventory" rel="noopenner">EnableKeepInventory</a>接口,设置玩家死亡不掉落物品 |
| 拾取物品范围 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#setpickuparea" rel="noopenner">SetPickUpArea</a>接口,设置玩家的拾取物品范围 |
### 渲染设置
| 属性 | 描述 |
| -------------- | ------------------------------------------------------------ |
| 原版自定义皮肤 | 等同于玩家对象PlayerObject下的<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/玩家对象PlayerObject.html#setskin" rel="noopenner">SetSkin</a>接口,更换玩家原版模型的自定义皮肤,会覆盖原有皮肤,但会被骨骼模型覆盖。 |

View File

@@ -0,0 +1,26 @@
---
front: https://nie.res.netease.com/r/pic/20210727/1e450bb1-ee50-4e6c-b614-7fbd6a00b4e7.png
hard: 入门
time: 5分钟
---
# 方块预设
BlockPreset方块预设可与某个位置的方块绑定起来然后通过方块预设进行一些与方块相关的编程如利用预设的生命周期在特定时刻摧毁指定位置的方块等一般需要配合一个合适的零件实现。
在编辑器中新建方块预设,选中该预设文件对其进行编辑时,除了预设的公共属性外,可额外指定方块预设所绑定的方块的类型,支持原生的方块类型与存档内的自定义方块两类。与实体预设不同的是:若方块预设选择"泥土"进行绑定,也**只会**绑定到使用此方块预设生成的那些泥土方块上,而**不会**绑定到直接生成或已存在地图上的那些泥土方块上。
![image-20210707174815752](./images/image-20210707174815752.png)
注意:如果自定义方块内容有更新,需要在自定义方块属性中点击刷新所有属性。对自定义方块的编辑可参考[配置](../../../15-自定义游戏内容/0-配置.md)。
![image-20210707175538979](./images/image-20210707175538979.png)
设置好方块预设的属性后,即可将方块预设拖拽至场景中达到在指定位置放置特定方块的目的了。这样一来,在启动开发包进行测试时,就会发现对应的位置放置了一个指定的方块。
![image-20210707175917988](./images/image-20210707175917988.png)
如果需要添加一些自定义的逻辑,可制作零件,或使用编辑器内置的一些零件,将其挂接到方块预设预设上即可。
![image-20210714103404594](./images/image-20210714103404594.png)

View File

@@ -0,0 +1,38 @@
---
front: https://nie.res.netease.com/r/pic/20210727/1e450bb1-ee50-4e6c-b614-7fbd6a00b4e7.png
hard: 入门
time: 5分钟
---
# 特效预设
EffectPreset特效预设是一类绑定特效资源的预设目的是给特效赋予特定的功能而非制作特效。
有关特效制作的相关知识,请参阅[特效编辑器](../../../../16-美术/9-特效/00-特效编辑器简介.md)的相关文档。
我们提供了内置特效预设,它无需创建既可使用,通过菜单栏=>添加预设=>特效预设进行添加。
![image-20210713180249148](./images/image-20210713180249148.png)
特效预设提供特效文件和自动播放属性,你需要通过特效编辑器创建一个粒子/序列帧特效,设置特效文件后方能预览。
![image-20210705150419306](./images/image-20210705150419306.png)
如果不勾选自动播放属性,则需要通过零件代码在合适的时机调用播放/停止接口进行手动控制。
你也可以通过菜单栏=>创建预设=>特效预设来创建自己的自定义特效预设。
这里我们选择官方制作好的一个变换动画特效模板来展现自定义特效预设可以实现什么样的效果。
通过菜单栏=>创建预设=>模板预设=>变换动画特效我们可以添加这个模板预设。
![image-20210708160109528](./images/image-20210708160109528.png)
创建好的特效预设可以很方便的从资源管理器或预设库中拖到场景内进行实例化,通过预览,我们可以把特效拖到我们希望放置的位置上。
![image-20210708160408781](./images/image-20210708160408781.png)
点击运行,进入开发包后,我们可以看到这些变换动画特效已经在世界里动了起来。
![effect](./images/effect.gif)

View File

@@ -0,0 +1,50 @@
---
front: https://nie.res.netease.com/r/pic/20210727/1e450bb1-ee50-4e6c-b614-7fbd6a00b4e7.png
hard: 入门
time: 5分钟
---
# 界面预设
UIPreset界面预设是一类绑定UI资源的预设目的是给UI赋予预设的属性如能使UI随着预设的出现而出现、销毁而销毁等。和使用modsdk接口创建UI一样使用界面预设需要一个UI编辑器制作的UIJson文件和一个继承自ScreenNode的脚本文件。
有关UI制作的相关知识请参阅[界面编辑器](../../../../18-界面与交互/1-界面编辑器使用说明.md)的相关文档。
在预设编辑器,通过菜单栏=>创建预设=>界面预设我们可以创建一个界面预设。
![image_20210805195951](./images/image_20210805195951.png)
在编辑器中新建界面预设选中该预设文件对其进行编辑时界面预设除了特有的可编辑属性外公共属性类似空预设。界面预设提供相当多的属性编辑它们共同决定了界面预设绑定的UI最终展示的属性。
首先需要设置界面预设绑定的UI画布。该设置需要选择想打开的UIJson文件以及该文件中的画布名称。
![image_20210805202301](./images/image_20210805202301.png)
第二步需要设置界面预设所绑定的继承自ScreenNode的脚本文件以及脚本类名使用新建文件向导创建的ScreenNode类其脚本类名默认和脚本文件名相同。
![image_20210806100252](./images/image_20210806100252.png)
这两步设置完成后该界面预设就能够成功创建出UI界面。若没有成功创建请检查界面文件或ScreenNode脚本文件是否有损坏。
后续的设置定义了所打开UI的属性。
![image_20210806101021](./images/image_20210806101021.png)
![image_20210806102954](./images/image_20210806102954.png)
![image_20210806103002](./images/image_20210806103002.png)
| 属性 | 说明 |
| :--- | :--- |
| 当前命名空间 | 当前作品的命名空间,不可编辑 |
| UI名称 | 在当前命名空间中需唯一 |
| 自动激活 | 在界面预设创建完成后是否自动创建UI若勾选则自动创建反之则不会自动创建。该设置在预设编辑器内不会生效界面会被自动激活 |
| 显示方式 | 创建UI的显示方式有CreateUI和PushScreen两种方式。若选择PushScreen打开UI则后续属性不可设置也不会生效 |
| 绑定父预设实体 | 是否绑定预设实体当父预设为生物预设或玩家预设等有实体的预设时勾选该属性UI会被绑定到该实体上。当勾选后可设置绑定UI的偏移和自动缩放属性但HUD属性不可设置 |
| HUD |该界面是否允许游戏操作。勾选为允许,不勾选则屏蔽游戏操作 |
| 绑定UI偏移 | 修改与绑定实体之间的偏移量 |
| 绑定UI自动缩放 | 设置已绑定实体的UI是否根据绑定实体与本地玩家间的距离动态缩放 |
| 编辑器内预览 | 在编辑器内设置控制界面预设所绑定UI的显示隐藏。该属性在非编辑器平台无效。 |
设置好属性后,将该界面预设拖拽至场景中,界面就能显示出来了。
![image_20210806152438](./images/image_20210806152438.png)

View File

@@ -0,0 +1,92 @@
---
front: https://nie.res.netease.com/r/pic/20210727/1e450bb1-ee50-4e6c-b614-7fbd6a00b4e7.png
hard: 入门
time: 5分钟
---
# 文字面板预设
> 目前仅在开发测试中生效正式服预计在2.2版本上线,请开发者合理安排开发节奏。
## 基础介绍
TextBoardPreset文字面板预设是一类绑定**文字面板**的特殊预设,目的是能够快速创建、编辑和使用文字面板。
> 对于文字面板的概念,开发者可以参阅为[文字面板的定义](../../../../20-玩法开发/10-基本概念/1-我的世界基础概念.md#文字面板)以及<a href="../../../../../mcdocs/3-PresetAPI/预设对象/预设/文字面板对象TextboardObject.html" rel="noopenner"> 文字面板预设相关接口 </a>
## 创建与添加
我们分别提供了内置文字面板预设和可供创建的普通文字面板预设。
### 添加内置文字面板预设
内置文字面板预设无需创建,即可使用,通过菜单栏=>添加预设=>文字面板预设(来自内置预设)进行添加,如下图所示。
![添加内置文字面板预设](./images/addtextboard.png)
### 创建普通文字面板预设
普通文字面板预设不同于内置的预设,开发者需要通过新建文件向导=→预设分页=→找到文字面板预设=→创建,如下图所示
![创建](./images/createtextboard.png)
## 文字面板属性
文字面板预设除了预设所具有的基本属性外,额外提供了文字面板特有的属性,如下图所示
![面板属性](./images/textboardattr.png)
| 属性 | 说明 |
| :--- | :--- |
| 文本内容| 文字面板上所显示的文字内容,支持[样式代码](https://minecraft-zh.gamepedia.com/%E6%A0%B7%E5%BC%8F%E4%BB%A3%E7%A0%81)|
|始终面向相机| 默认开启,勾选后文字面板会随着相机移动而改变朝向,始终保持正面朝向相机 |
| 深度测试 | 默认开启,勾选后文字面板会按照正常的前后顺序进行遮挡或显示 |
| 文本颜色 | 文字面板上文本内容的颜色 |
| 文本透明度 | 文字面板上文本内容的透明度,范围[0,1],值越小越透明。 |
| 背景颜色 | 文字面板自身的颜色。 |
| 背景透明度 | 文字面板自身的透明度,范围[0,1],值越小越透明。 |
## 挂接实体与玩家
文字面板预设既可以直接放置到世界的任意坐标位置,也可以绑定到实体或者玩家的相对位置,我们只需要将文字面板预设挂接到实体或玩家预设下,相比未挂接的情况,我可以看到实体和玩家预设下的文字面板预设多出了一栏坐标变换属性,此时调整这里的属性就是调整相对于父级预设的相对位置,如下图所示。
![挂接关系](./images/textboardattached.png)
## 操作示例
这里我们做一个基础的案例演示:
功能需求:
1. 在世界坐标0650放置一个文字面板内容为“你好我的世界”
2. 为一个牛的实体预设挂接一个文字面板,显示内容“我是一头牛”。
实现步骤:
1. 首先对于第一个功能我们直接在关卡编辑器将预设库中内置的文字面板预设拖动到场景舞台中并修改其坐标为0650如下图所示
![拖动内置预设](./images/textboard_1.gif)
2. 对于第二个功能,我们先分别创建一个使用了牛的模板的实体预设
![创建实体预设](./images/textboard_2.gif)
3. 再创建一个文字面板预设,并将其挂接到实体预设下
![挂接](./images/textboard_3.gif)
4. 调整位置和属性(位置、旋转、缩放可直接使用拖柄调整)
![调整属性](./images/textboard_4.gif)
5. 在关卡编辑器内将该实体预设拖动到场景舞台上
![拖动到场景](./images/textboard_5.gif)
6. 运行测试,看到最终效果如下图
![最终效果](./images/textboard-6.png)
7. 如果我们进一步调整预设的面板属性,并充分利用[样式代码](https://minecraft-zh.gamepedia.com/%E6%A0%B7%E5%BC%8F%E4%BB%A3%E7%A0%81),就能创造出更丰富的效果。
![高级效果](./images/textboard-7.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 908 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 939 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 419 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -0,0 +1,27 @@
---
front: https://nie.res.netease.com/r/pic/20210727/76bfa7be-0be4-4e27-91a3-b5268695f359.png
hard: 入门
time: 20分钟
---
# 触发器
TriggerPart触发器零件包含一个长方体的区域可以使用触发器零件对进出区域的实体进行检测。
![image-20210710181419000](./images/parts001.png)
点击触发器,可以在他的属性面板中看到以下属性:
- 区域,用于指定触发器的区域
- 维度:用于指定这个区域在哪个维度
- 监听,影响触发器的事件发送
![image-20210710181656492](./images/parts002.png)
点击区域页签旁边的定位按钮,可以将触发器的区域显示出来(如下图),之后可以通过挪动坐标系整体移动区域的位置,或者使用鼠标对触发器区域的每一个面进行拖拽。
> 区域的坐标是相对于触发器的坐标,拖动触发器同样可以改变区域的整体位置。
![parts003](./images/parts003.gif)
>如果需要在游戏中使用脚本调用此零件,可以参考<a href="../../../../../mcdocs/3-PresetAPI/预设对象/零件/触发器零件TriggerPart.html" rel="noopenner"> 触发器零件的API接口文档 </a>

View File

@@ -0,0 +1,23 @@
---
front: https://nie.res.netease.com/r/pic/20210727/76bfa7be-0be4-4e27-91a3-b5268695f359.png
hard: 入门
time: 20分钟
---
# 玩家基础属性
PlayerBasicPart玩家基础属性零件是一种只能挂接到玩家预设下的内置零件。
![image-20210708144908833](./images/image-20210708144908833.png)
通过挂接玩家基础属性零件,我们能够对所有玩家的基础属性进行相应的修改。
![image-20210708150124638](./images/image-20210708150124638.png)
点击运行进入游戏我们可以看到自身的血量上限有40可以透视到其他玩家的名字。
![image-20210708150107248](./images/image-20210708150107248.png)
>如果需要在游戏中使用脚本调用此零件,可以参考<a href="../../../../../mcdocs/3-PresetAPI/预设对象/零件/玩家基础属性零件PlayerBasicPart.html" rel="noopenner"> 玩家基础属性零件的API接口文档 </a>

View File

@@ -0,0 +1,18 @@
---
front: https://nie.res.netease.com/r/pic/20210727/76bfa7be-0be4-4e27-91a3-b5268695f359.png
hard: 入门
time: 20分钟
---
# 世界属性零件
使用时挂在空预设下即可。并且尽量保证这个预设在场景中有且仅有一个实例。
![parts004](./images/parts004.png)
世界选项与旧版关卡编辑器的世界属性组件相同。
![parts005](./images/parts005.png)
>如果需要在游戏中使用脚本调用此零件,可以参考<a href="../../../../../mcdocs/3-PresetAPI/预设对象/零件/世界属性零件WorldPart.html" rel="noopenner"> 世界属性零件的API接口文档 </a>

View File

@@ -0,0 +1,52 @@
---
front: https://nie.res.netease.com/r/pic/20210727/76bfa7be-0be4-4e27-91a3-b5268695f359.png
hard: 入门
time: 20分钟
---
# 相机轨迹零件
相机轨迹零件CameraTrackPart是一个用于制作相机移动和旋转轨迹动画的零件。
为了便于查看效果,这里我们添加一个货摊素材作为参照物,如下图所示。
![parts006](./images/parts006.png)
点击相机轨迹零件,我们可以在属性面板看到其有如下属性:
![parts006](./images/parts007.png)
这里重点解释一下相机轨迹这部分属性:
1. 预览路径:用于控制是否开启预览路径,预览路径就是用线条和箭头在预设场景中显示相机动画的轨迹路线,即上面示意图中的部分。
2. 播放:勾选则在预设场景中播放当前相机轨迹动画。
3. 轨迹:即相机轨迹动画中的每个轨迹点的信息,可以理解为关键帧动画中的某一帧,代表相机在某个时间点须将自身的位置旋转等信息变换到这个轨迹点所代表的状态上。相机轨迹零件的作用就是让玩家能够自由编辑相机的轨迹点信息,从而构成相机动画。可以通过轨迹右侧的"+"按钮新增轨迹点,每个轨迹点的属性如下:
>偏移:该轨迹点相对于整个相机轨迹零件的位置偏移量
>
>旋转:该轨迹点摄像机相对于正北方向的旋转弧度(上下弧度,左右弧度)
>
>Pitch俯仰角顺向控制上下方向的顺逆
>
>Yaw偏航角顺向控制左右方向的顺逆
>
>时间:上一个轨迹点到当前轨迹点所需时间,越长,相机变换的速度越缓慢
4. 轨迹点操作方式:
![parts009](./images/parts009.png)
1. 轨迹点顶部按钮,可以快捷执行删除轨迹点、上移轨迹点、下移轨迹点、上方新建轨迹点四种操作。
2. 轨迹点的偏移和旋转属性右侧提供了记录当前摄像头信息和定位的快捷操作按钮
>记录当前摄像头信息:将预设场景界面的摄像头信息记录在当前轨迹点,当前支持记录位置和旋转两种信息。
>
>定位:在预设场景展示该轨迹点的坐标,并提供坐标轴供玩家进行可视化操作来调整轨迹点的位置信息。
充分熟悉上述操作方式后,我们能够更快速和便捷地进行相机轨迹动画的创作,并随时进行路径的预览和播放,如下图所示
![cameratrack](./images/cameratrack.gif)
>如果需要在游戏中使用脚本调用此零件,可以参考<a href="../../../../../mcdocs/3-PresetAPI/预设对象/零件/相机轨迹CameraTrackPart.html" rel="noopenner"> 相机轨迹零件的API接口文档 </a>

View File

@@ -0,0 +1,40 @@
---
front: https://nie.res.netease.com/r/pic/20210727/76bfa7be-0be4-4e27-91a3-b5268695f359.png
hard: 入门
time: 20分钟
---
# 实体零件
## 实体组合
实体零件EntiyBasePart用于在预设下管理多个实体预设。
在[预设组装的挂接规则](../../../14-预设玩法编程/11-深入理解预设/1-组装预设.md)中,我们知道空预设下是无法挂载实体预设的,为了让开发者更便捷地管理多个实体,我们提供了实体零件。使用时只需在空预设下挂载此零件,再从属性面板选择对应的实体类型,就能够间接地达成预设下挂载实体的目标。实体零件属性的如下图所示:
![custommonster](./images/custommonster.png)
- 自动创建是否在零件初始化时自动创建关联实体ID如果不勾选则需要手动调用零件的API创建关联实体ID可以参考<a href="../../../../../mcdocs/3-PresetAPI/预设对象/零件/实体零件EntityBasePart.html" rel="noopenner"> 实体零件API接口文档 </a>。
- 实体类型:实体零件所绑定的实体类型,这里支持原版实体和未绑定预设的实体配置。
>注意:实体类型不支持实体预设
这里举一个实用例子,对于含有刷怪事件的玩法,开发者可以将每波刷出的怪物制作成一个怪物阵型,从而对每波怪物进行统一的管理,这里就需要用到实体零件,
通过复制或新建,在预设下创建多个该零件,便能构建出一个怪物阵型,如下图所示:
![monsterFormation](./images/monsterFormation.png)
## 注意事项
- 实体零件**只能挂接在空预设**下
- 实体类型属性,**不能选择已经有对应实体预设的类型**,否则创建出来的是实体预设,不受实体零件管理
- 实体零件创建出来的实体,**不会保存到地图**中,在预设卸载,保存退出等时机会自动清除相关实体,在下次预设加载时再重新创建
- 注意避免组合大量实体零件构建怪物阵型,这可能造成加载时卡顿,尤其在低配手机上
- 实体零件进行缩放时,是**xyz轴同步缩放**但它的父节点可以设置xyz轴分别为不同缩放以**x轴的最终缩放**为准,尽量避免实体零件的父节点的缩放不一致
- 实体零件进行旋转时,**只支持xy轴旋转**且只在实体生成时有效此后由怪物AI控制如果前面把父节点的缩放设为不一致旋转实体可能导致x轴的缩放系数发生变化导致实体缩放突变。
>如果需要在游戏中使用脚本调用此零件,可以参考<a href="../../../../../mcdocs/3-PresetAPI/预设对象/零件/实体零件EntityBasePart.html" rel="noopenner"> 实体零件的API接口文档 </a>

View File

@@ -0,0 +1,33 @@
---
front: https://nie.res.netease.com/r/pic/20210727/76bfa7be-0be4-4e27-91a3-b5268695f359.png
hard: 入门
time: 20分钟
---
# 导航路径零件
导航路径零件NavPointsPart用于创建一条可视化的路径并进行路径点的可视化添加和编辑点击该零件我们在属性面板可以看到其拥有以下属性
![parts010](./images/parts010.png)
这里着重讲一下巡逻路径属性,巡逻路径的本质就是一组有顺序的位置坐标数据。巡逻路径有两个属性:
1. 预览路径:用于控制是否开启预览路径,预览路径就是用线段和箭头将所有巡逻点连接起来,让玩家在编辑路径时能够直观地看到每个点之间的位置和顺序关系。
2. 路径:即巡逻路径上的每个巡逻点的信息,通过右侧的""按钮可以新建巡逻点,巡逻点下包含该点的位置坐标。
3. 路径操作方式每个巡逻点上方的菜单下图中A框可以进行巡逻点的删除、上移、下移和上方新建四种快捷操作。右侧的记录摄像机位置下图中B框和定位按钮下图中C框可以让你更为便捷地进行路径点的可视化选取和移动。
![parts011](./images/parts011.png)
熟练上述操作后能够帮助你快速搭建导航路径,如下图所示:
![navpointssample](./images/navpointssample.gif)
这里举一个运用导航路径零件的例子:在塔防游戏中,我们希望怪物出生后按照一定的路径进行移动巡逻,比如从起始点开始,走向第二个巡逻点,再走向第三个巡逻点,以此类推,形成一条巡逻路径。那么如何快速进行路径的可视化编辑呢?
为了达到这个效果,我们可以在编辑器内使用导航路径零件,提前构造好巡逻路径点,然后在脚本中使用本零件的接口(<a href="../../../../../mcdocs/3-PresetAPI/预设对象/零件/导航路径零件NavPointsPart.html" rel="noopenner"> GetNavigationPoints </a>)快速获得所有巡逻点的数据,再调用寻路接口(<a href="../../../../../mcdocs/1-ModAPI/接口/实体/行为.html" rel="noopenner"> SetMoveSetting </a>)让怪物依次在各个点之间移动,以此达到怪物移动巡逻的效果。
>这里只是一个简单使用案例,导航路径零件主要帮助开发者可视化编辑路径/位置数据,具体使用还需要开发者根据实际需要灵活运用哦~
关于导航路径零件的接口,可以参考<a href="../../../../../mcdocs/3-PresetAPI/预设对象/零件/导航路径零件NavPointsPart.html" rel="noopenner"> 导航路径零件的API接口文档 </a>

View File

@@ -0,0 +1,78 @@
---
front: https://nie.res.netease.com/r/pic/20210727/76bfa7be-0be4-4e27-91a3-b5268695f359.png
hard: 入门
time: 20分钟
---
# 后处理零件
后处理零件PostProcessPart用于快速设置并在游戏中使用渐晕、镜头污渍、模糊等后处理效果。
以往开发者想要使用后处理效果,需要手动在零件代码中调用后处理相关的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/索引.html" rel="noopenner"> ModAPI</a>接口步骤繁琐且需要先了解python和SDK框架对新开发者不够友好此次将后处理效果封装成一个零件正是为了帮助不会代码的开发者用上后处理的效果让自己开发的组件达到更高的品质。
> 后处理零件只能挂载在已经勾选预加载的空预设上。
点开零件属性,我们可以看到后处理零件拥有以下属性。
![postprocesspart-1](./images/postprocesspart-1.png)
接下来我们逐一介绍后处理零件的几种效果属性。
### 渐晕:效果如下图
![postprocesspart](./images/postprocesspart-2.png)
| 属性 | 描述 |
| ------------ | ------------------------------------------------------------ |
| 开启屏幕渐晕 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/渐晕.html#setenablevignette" rel="noopenner">SetEnableVignette</a>接口设置是否开启屏幕渐晕Vignette效果开启后玩家屏幕周围将出现渐晕。 |
| 渐晕中心位置 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/渐晕.html#setvignettecenter" rel="noopenner">SetVignetteCenter</a>接口设置渐晕Vignette的渐晕中心位置可改变屏幕渐晕的位置。 |
| 渐晕颜色 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/渐晕.html#setvignettergb" rel="noopenner">SetVignetteRGB</a>接口设置渐晕Vignette的渐晕颜色可改变屏幕渐晕的颜色。 |
| 渐晕半径 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/渐晕.html#setvignetteradius" rel="noopenner">SetVignetteRadius</a>接口设置渐晕Vignette的渐晕半径半径越大渐晕越小玩家的视野范围越大。 |
| 渐晕模糊系数 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/渐晕.html#setvignettesmoothness" rel="noopenner">SetVignetteSmoothness</a>接口设置渐晕Vignette的渐晕模糊系数模糊系数越大则渐晕边缘越模糊模糊的范围也越大。 |
### 模糊:效果如下图
![postprocesspart](./images/postprocesspart-3.png)
| 属性 | 描述 |
| ------------ | ------------------------------------------------------------ |
| 开启高斯模糊 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/模糊.html#setenablegaussianblur" rel="noopenner">SetEnableGaussianBlur</a>接口,设置是否开启高斯模糊效果,开启后玩家屏幕周围被模糊。 |
| 模糊半径 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/模糊.html#setgaussianblurradius" rel="noopenner">SetGaussianBlurRadius</a>接口,设置高斯模糊效果的模糊半径,半径越大,模糊程度越大,反之则模糊程度越小。 |
### 色彩校正:效果如下图
![postprocesspart](./images/postprocesspart-4.png)
| 属性 | 描述 |
| ---------------- | ------------------------------------------------------------ |
| 开启色彩校正 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/色彩.html#setenablecoloradjustment" rel="noopenner">SetEnableColorAdjustment</a>接口,设置是否开启色彩校正效果,开启后可进行屏幕色彩调整 。|
| 色彩亮度 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/色彩.html#setcoloradjustmentbrightness" rel="noopenner">SetColorAdjustmentBrightness</a>接口,调整屏幕色彩亮度,亮度值越大,屏幕越亮,反之则越暗。|
| 色彩对比度 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/色彩.html#setcoloradjustmentcontrast" rel="noopenner">SetColorAdjustmentContrast</a>接口,调整屏幕色彩对比度,屏幕对比度值越大,色彩差异则越明显,反之则色彩差异越小。|
| 色彩饱和度 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/色彩.html#setcoloradjustmentsaturation" rel="noopenner">SetColorAdjustmentSaturation</a>接口,调整屏幕色彩饱和度,屏幕饱和度值越大,色彩则越明显,反之则越灰暗。|
| 色调 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/色彩.html#setcoloradjustmenttint" rel="noopenner">SetColorAdjustmentTint</a>接口,调整屏幕色彩的色调,根据输入的色调和强度来调整屏幕色彩,当强度越大时,屏幕整体颜色越偏向输入的色调。|
### 景深效果:效果如下图
![postprocesspart](./images/postprocesspart-5.png)
| 属性 | 描述 |
| ---------------- | ------------------------------------------------------------ |
| 开启景深效果 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/镜头效果.html#setenabledepthoffield" rel="noopenner">SetEnableDepthOfField</a>接口,设置是否开启景深效果,开启后屏幕出现景深效果,根据焦点距离呈现远处模糊近处清晰或者近处模糊远处清晰的效果。 |
| 模糊半径 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/镜头效果.html#setdepthoffieldblurradius" rel="noopenner">SetDepthOfFieldBlurRadius</a>接口,调整景深效果模糊半径,模糊半径越大,模糊程度越大,反之则越小。 |
| 远景模糊大小 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/镜头效果.html#setdepthoffieldfarblurscale" rel="noopenner">SetDepthOfFieldFarBlurScale</a>接口,调整景深效果远景模糊大小,远景模糊大小越大,远景的模糊程度越大,反之则越小。注意,远景模糊程度的调节依赖于焦点距离,如果焦点处于较远的距离,那么此时远景处于较清晰的状态,模糊程度大小调节不会很明显。 |
| 近景模糊大小 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/镜头效果.html#setdepthoffieldnearblurscale" rel="noopenner">SetDepthOfFieldNearBlurScale</a>接口,调整景深效果近景模糊大小,近景模糊大小越大,近景的模糊程度越大,反之则越小。注意,近景模糊程度的调节依赖于焦点距离,如果焦点处于较近的距离,那么此时近景处于较清晰的状态,模糊程度大小调节不会很明显。 |
| 屏幕中心聚焦模式 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/镜头效果.html#setdepthoffieldusecenterfocus" rel="noopenner">SetDepthOfFieldUseCenterFocus</a>接口,设置景深效果是否开启屏幕中心聚焦模式,开启后聚焦距离将被自动设置为屏幕中心所对应的物体所在的距离。在第一人称视角下,聚焦距离将被自动设置为屏幕准心所对应的物体与相机的距离,即自动聚焦准心所对应的物体。在第三人称视角下,由于屏幕中心总是对应着玩家,因此聚焦距离将被自动设置为玩家与相机的距离,即自动聚焦在玩家自己。 |
| 焦点距离 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/镜头效果.html#setdepthoffieldfocusdistance" rel="noopenner">SetDepthOfFieldFocusDistance</a>接口,调整景深效果焦点距离,距离越小,则远处模糊,近处清晰;距离越大,则远处清晰,近处模糊。该距离为实际距离,即以玩家相机为起点的世界坐标距离。 |
### 镜头污迹:效果如下图
![postprocesspart-6](./images/postprocesspart-6.png)
| 属性 | 描述 |
| ------------ | ------------------------------------------------------------ |
| 镜头污迹效果 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/镜头效果.html#setenablelensstain" rel="noopenner">SetEnableLensStain</a>接口,设置是否开启镜头污迹效果,开启后镜头出现污迹效果,可改变使用的污迹贴图及污迹颜色。 |
| 镜头污迹强度 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/镜头效果.html#setlensstainintensity" rel="noopenner">SetLensStainIntensity</a>接口,调整镜头污迹强度,强度越大,污迹越明显,反之则越透明。 |
| 镜头污迹贴图 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/镜头效果.html#setlensstaintexture" rel="noopenner">SetLensStainTexture</a>接口,开启镜头污迹效果后,污迹效果使用的为系统默认贴图。该接口可改变镜头污迹所使用的贴图。注意贴图最好使用透明背景,否则屏幕将被贴图覆盖。 |
| 镜头污迹颜色 | 等同于调用ModAPI下的<a href="../../../../../mcdocs/1-ModAPI/接口/后处理/镜头效果.html#setlensstaincolor" rel="noopenner">SetLensStainColor</a>接口,调整镜头污迹颜色,根据输入的颜色和强度来调整污迹色彩,当强度越大时,污迹颜色越偏向输入的颜色。 |

View File

@@ -0,0 +1,39 @@
---
front: https://nie.res.netease.com/r/pic/20210727/76bfa7be-0be4-4e27-91a3-b5268695f359.png
hard: 入门
time: 20分钟
---
# 天空盒零件
天空盒零件SkyBoxPart用于快速设置天空颜色、贴图、雾效颜色、范围、星星、太阳、月亮等天空相关的表现参数如下图所示。
![图片](./images/skybox1.gif)
## 属性
天空盒零件具有下图中的属性所有属性均对应了ModSDK中的相关接口详情参考<a href="../../../../../mcdocs/1-ModAPI/接口/世界/渲染.html#setambientbrightness" rel="noopenner">SetEnableVignette</a>
![图片](./images/skyboxconfig.png)
## 使用
1. 在新建文件向导创建天空盒零件
![图片](./images/skybox.png)
2. 创建一个预设并将零件挂接到预设下,调整对应属性
![图片](./images/skybox11.png)
3. 将预设拖到场景舞台生成实例,即可生效
![图片](./images/skybox1.gif)
4. 编辑实例下的属性也可实时调整对应效果。
![图片](./images/skybox12.png)
5. 运行测试查看效果
![图片](./images/skybox13.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 708 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@@ -0,0 +1,35 @@
---
front: https://mc.res.netease.com/pc/zt/20201109161633/mc-dev/assets/img/preset002.1e5e0e6f.png
hard: 入门
time: 10分钟
---
# 理解预设概念
## 什么是预设?
- 预设Preset就是预先设定的意思即开发者们可以将方块、素材、实体、特效以及玩法逻辑拼装成一个预设。
- 预设作为文件被保存在行为包的Presets目录中如下图在资源管理器的常用目录中可以找到Preset文件夹当然你也可以在精简模式直接打开预设文件夹。
![new004](./images/new004.png)
- 在使用时,一个预设作为一个整体被放置在游戏中,被放置到游戏中的预设被称为实例。
- 预设的后缀是.preset如果你对预设到底是什么感兴趣可以使用文本编辑器打开预设文件查看它的结构。
> 关于预设架构的使用示例,请查看[第一个预设Mod](../9-第一个预设Mod/0-创建新版作品.md)。
## 预设能做什么?
- 当我们制作游戏时,游戏世界中的每个元素并不是都各具特色,独一无二的,相反,在很多情况下我们需要复用很多游戏资源和玩法逻辑,这时候我们如果能将资源或逻辑集成到一个预设中,就能在需要复用时,在游戏世界中快速地创造这类资源或逻辑的实例。
- 预设是各类游戏引擎经常使用的概念,主要目的是为了将构成游戏元素的资源和代码逻辑组装成一个可复用的文件,提高游戏制作效率。
举个例子:当我们需要制作一个塔防游戏时,需要制作许多种类的怪物,并且在不同时间和地点将不同组合的怪物生成到地图中,并让怪物沿着固定的路径向玩家的大本营进攻。
将这个玩法逻辑梳理下,实际上我们可以复用的资源和逻辑代码有:
1. 许多种类的怪物(实体预设)
2. 指定时间指定地点刷新指定怪物的逻辑(刷怪点零件)
3. 怪物沿着固定路径向大本营进攻的逻辑(怪物巡逻零件)
那么在我们真正去搭建游戏关卡时,只需要将上述的实体和零件代码组装成刷怪点预设和带有巡逻和进攻逻辑的实体预设,就能够快速制造出大量满足塔防玩法的刷怪点和具有进攻大本营逻辑的怪物了。

View File

@@ -0,0 +1,85 @@
---
front: https://mc.res.netease.com/pc/zt/20201109161633/mc-dev/assets/img/preset002.1e5e0e6f.png
hard: 入门
time: 20分钟
---
# 预设编辑器
## 一、 启动方式
打开预设编辑器的方式有两种:
- 通过顶部的编辑器切换页签进行切换
- 在资源管理器中双击任意预设文件xxx.preset
## 二、 界面构成
预设编辑器主要用于预设的拼装,预览和属性编辑。如下图所示:
- 层级面板:用于显示预设的父子结构关系。
- 预览窗:用于预设的预览,以及对每个对象进行坐标变换的拖拽调整。
- 属性面板:用于显示当前选中的层级条目的属性以及对其进行修改。
- 资源管理器:通用面板,用于管理作品中的所有文件及目录。
![preset001](./images/preset001.png)
> 注意:预设编辑器是对某一个预设的编辑,不能同时编辑多个预设。
## 三、 层级面板
- 层级面板用于显示当前正在编辑的预设的层级结构,通过树形图的方式显示他们的父子关系,如下图所示。
![image-20210712192542842](./images/preset003.png)
- 层级面板支持搜索,如下图。与关卡编辑器的舞台一样,搜索结果也会显示与它相关的树形结构。
![image-20210712193004090](./images/preset004.png)
- 层级面板,在根节点上右键,弹出如下菜单:
- 在资源管理器中定位:在编辑器内置的资源管理器打开这个预设的路径
- 添加素材:给预设添加素材,二级菜单为可添加的素材
- 添加零件:给预设添加零件,二级菜单为可以添加的零件
- 添加预设:给预设添加子预设,二级菜单为可以添加的预设
![image-20210712195437292](./images/preset007.png)
- 在除了根节点之外的条目上右键,弹出如下菜单:
- 复制:复制这个条目
- 粘贴:在层级中粘贴这个条目
- 创建副本:在层级中创建这个条目的副本
- 重命名:对这个条目进行重命名
- 删除:删除这个条目
- 在资源管理器中定位:资源管理器打开这个条目对应的路径,并选中预设
- 打开目录在windows的资源管理器中打开这个条目对应的文件夹
![image-20210712195358870](./images/preset008.png)
> 当前不能改动子预设的层级
## 四、 预览窗
- 预设编辑器的预览窗里,除了天空之外只会渲染当前正在编辑的预设。
- 你可以在预览窗中对预设条目的坐标变换进行操作。参考[关卡编辑器](../../11-组装简单玩法/0-关卡编辑器.md#三、预览窗)的预览窗。两个编辑器的预览窗的坐标变换操作基本相同。
![image-20210712191544186](./images/preset002.png)
> 注意当你在进入预览窗时实际上会被传送至当前作品的出生点。预览窗内仍然是我的世界同样存在256的高度限制这意味着你无法控制相机抵达过高或者过低的位置。
## 五、属性面板
- 属性面板用于查看和修改当前选中的层级条目的属性,如修改预设属性、零件属性等,如图所示。
![](./images/config_panel.png)
## 六、资源管理器
- 资源管理面板用于存储和显示当前作品中的所有文件可以通过精简模式的预设和零件快速寻找需要的文件资源也可以通过完整模式直接找到预设Presets和零件Parts文件夹。
![](./images/resource_panel.png)
![](./images/resource_panel_1.png)
## 七、 顶部工具栏功能
- 撤销:移除上一次操作造成的影响,目前支持无限次的撤销,当切换编辑器后,不再记录之前的操作。
- 重做:重新进行上一次撤销的操作。
- 添加预设:给预设添加子预设,弹出菜单为可以添加的预设
- 添加零件:给预设添加零件,弹出菜单为可以添加的零件
- 添加素材:给预设添加素材,弹出菜单为当前可以添加的素材
- 创建预设:弹出新建文件向导,并切换到预设分页,参考[新建文件](../../../15-资源管理/4-新建文件.md)。
- 创建零件:弹出新建文件向导,并切换到零件分页,参考[新建文件](../../../15-资源管理/4-新建文件.md)。
- 文件位置:资源管理器打开这个条目对应的路径,并选中当前正在编辑的预设。
- 反馈当在编辑器遇到闪退、报错等bug时可随时通过反馈按钮前往开发者反馈页面向我们反馈。
- 保存:保存当前预设文件。
- 备份:在启动器的作品库中生成一份当前作品的拷贝。
- 运行:保存所有编辑器的内容,并进行开发测试。
![image-20210712193244943](./images/preset005.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@@ -0,0 +1,4 @@
# 中国版开发工具简介
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=618a2b2875882ab495541ed1" height="600" width="800" allow="fullscreen" />

View File

@@ -0,0 +1,4 @@
# 放置和调整建筑
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=618a2ca9b8a81f8fa07f09c5" height="600" width="800" allow="fullscreen" />

View File

@@ -0,0 +1,3 @@
# 制作自定义发光方块
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=618a2e51b8a81f8fa07f09db" height="600" width="800" allow="fullscreen" />

View File

@@ -0,0 +1,3 @@
# 带特效的自定义生物
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=618a2f56b647e504b5250ce6" height="600" width="800" allow="fullscreen" />

View File

@@ -0,0 +1,4 @@
# 给自定义生物增加特性
<iframe src="https://cc.163.com/act/m/daily/iframeplayer/?id=618a315bb647e504b5250cf2" height="600" width="800" allow="fullscreen" />

View File

@@ -0,0 +1,88 @@
# 基础架构
在上一个课程我们已经学习了预设和零件的一些简单用法,并轻松制作出了一个炫酷的功能玩法。
这个课程将逐步为你介绍一些更深入的知识,包括预设系统的构成、各种内置预设以及如何使用预设编辑器组装各种炫酷的预设等。
## 构成
预设系统的基础数据结构体系如下图:
![image-PresetFramework20220209](./images/image-PresetFramework20220209.png)
前两层是基础数据类型从第三层开始着重介绍PresetBase、PartBase、BoxData是组装自定义预设/零件的基础结构,
EntityObject、PlayerObject、EffectObject是对SdkInterfaceSDK接口封装基类的另一层封装构建对不同种类预设对象的抽象以接口的形式对外直接提供组件操作
XXXPreset相关都是一些内置预设是预设体系与我的世界游戏元素的结合。
预设系统的目标是进一步降低我的世界开发者的使用门槛,通过简单的组装,修改自定义预设,更方便的架设自己的新世界。
## 基础数据类型
- **GameObject**
GameObject游戏对象是所有预设对象的基类实现了序列化存档读取等功能。
- **SdkInterface**
SdkInterfaceSDK接口封装基类是对SDK接口封装的基类将组件的操作以方法的形式暴露出来外界直接调用即可不必再走先创建对应组件再调用组件相关方法的步骤。
- **TransformObject**
TransformObject变换对象是拥有坐标变换属性的的游戏对象基类包括位置变换、旋转变换、缩放变换等是拥有确定位置信息数据的一类对象。
- **PresetBase**
PresetBase预设基类是所有预设的基类。预设是一类可以被直接放置在场景中的TransformObject变换对象并且预设下可以挂接其他TransformObject可以通过这种方式对游戏逻辑进行简单的封装。
在编辑器中放置预设时,会生成预设的虚拟实例,在游戏中生成预设,会生成真实实例。
它也可以直接理解为空预设,实现了挂接子节点,属性修改,实例化,加载卸载与驱动自定义零件逻辑等功能。
- **PartBase**
PartBase零件基类是所有自定义零件的基类。将零件挂接在预设下可以为预设赋予特定的逻辑和功能。
设计零件的初衷是为预设提供一些即插即用的代码型功能组件。
通过良好的设计,预设系统的大部分功能都可以通过自定义零件实现。
零件本身放进MOD里并不会生效必须挂接到某个预设身上并让这个预设在游戏中实例化才能生效。
- **BoxData**
BoxData素材数据与素材类似可以挂接在预设下使用。
素材在编辑器中不会实际生成,而是虚拟实例化,可以重叠放置。
在虚拟实例化状态,素材的变换可以任意调整并进行预览。
只要运行一次,素材就会真实实例化,永久变成地图的一部分。
真实实例化后素材不会因预设卸载或调用坐标变换相关API而发生变化也不会因重启地图而重新加载直至销毁。
销毁素材时,会尝试将素材数据内未发生过变化的方块替换为空气,部分特殊方块可能无法清除。
- **EntityObject**
EntityObject实体对象是对实体公共SDK组件使用的封装为外层实体预设提供了面向实体对象的组件操作方式将底层SDK接口另外做了一层封装向开发者提供更加便捷的SDK组件调用方式
开发者无需再走先创建对应组件再调用组件方法的流程,可直接调用对外提供的组件方法,提高了开发者的开发效率。
- **PlayerObject**
PlayerObject玩家对象是对玩家相关SDK组件使用的封装为外层玩家实体预设提供了面向玩家对象相关的组件操作方法与实体对象的差异在于其只封装了与玩家对象相关的sdk方法。
- **EffectObject**
EffectPreset特效预设是一类绑定特效资源的预设设计思路与上述所述实体对象设计思路一致为外层特效实体预设提供了面向特效对象相关的组件操作方法。

View File

@@ -0,0 +1,115 @@
# 预设组装
前面我们已经系统学习了预设系统的基础数据类型和各种内置预设,但它们能实现的功能效果仍旧非常有限。
这一小节将介绍如何利用预设编辑器来组装自己的自定义预设,并以变换动画特效与高级分裂牛为例来阐述制作过程。
## **挂接规则**
在前面的课程里,我们知道可以很方便的把预设、零件、素材挂到另一个预设底下,将它们组装到一起实现特定的功能。
但并非意味着万物皆可挂接,在组装自定义预设前,我们需要明确一下预设,零件,素材等各种游戏对象的挂接规则。
下表是挂接关系表,第一列表示父节点,第一行表示子节点,√表示可以挂接,无内容表示不能挂接
| | 空预设 | 所有内置预设 | 零件 | 素材 | 实体预设 | 特效预设 | 玩家预设 | 方块预设 | 界面预设 | 文字面板预设 |
| ------------ | ------ | ------------ | ---- | ---- | -------- | -------- | -------- | -------- | -------- | ------------ |
| 空预设 | √ | √ | √ | √ | | √ | | √ | √ | √ |
| 所有内置预设 | | | | | | | | | | |
| 零件 | | | | | | | | | | |
| 素材 | | | | | | | | | | |
| 实体预设 | | √ | √ | | | √ | | | √ | √ |
| 特效预设 | | √ | √ | | | √ | | | √ | √ |
| 玩家预设 | | √ | √ | | | √ | | | √ | √ |
| 方块预设 | | √ | √ | | | √ | | | √ | √ |
| 界面预设 | √ | √ | √ | | | √ | | | √ | √ |
| 文字面板预设 | | √ | √ | | | √ | | | √ | √ |
- 实体预设,玩家预设不能挂在其他预设下
- 零件、素材不可以单独存在
- 下面不可挂接任何东西
- 零件可以挂在任意预设下(内置预设除外)
- 素材可以挂在空预设下
- 所有内置预设(包括内置空预设、内置特效预设和内置文字面板预设)下无法挂接任何东西
- 这是由于当前不支持调整子预设的挂接关系
- 无法将预设挂接到自己或任意自己引用的预设底下(不能循环挂接)
- 内置预设的原理不同,不存在循环挂接的问题
## 模板预设
在创建预设菜单下,我们提供了一些制作好的模板预设,通过学习这些模板预设可以很好的理解预设的组装流程。
- **变换动画特效**
一个特效预设,挂接了一个变换动画零件
该特效会循环播放并循环上下移动
该零件自定义了持续时间,循环,关键帧等属性,通过修改这些属性,可以实现多种多样的变换动画
- **分裂猪**
一个生物预设,挂接了一个受伤分裂零件
当它受伤时会分裂出一个同样的生物,但不包括死亡
受伤分裂零件自定义了一个循环分裂属性,勾选该属性,则分裂出来的生物也具有受伤分裂特性
## 组装变换动画特效
前面我们已经使用过这个酷炫的特效了,它的制作过程非常简单,本质只是在特效预设上挂了一个功能型零件。
- 首先我们在预设编辑器,通过菜单栏=>创建预设=>特效预设来创建一个新的特效预设。
![image-20210705150946074](./images/image-20210705150946074.png)
- 将特效预设的特效文件设为sfxFromEditor.json此时已经可以预览到这个特效
如果你没有看到sfxFromEditor这个特效可以通过创建预设=>模板预设=>变换动画特效来先创建出这个特效,这个过程会把它依赖的的特效等各种资源拷贝到你的组件里,你也可以选择自己已有的任意特效来进行后续的制作。
- 通过菜单栏=>创建零件=>模板零件我们可以很方便地添加一些现成的模板零件,它可以帮助我们学习零件的开发。
![image-20210706164651616](./images/image-20210706164651616.png)
- 从模板零件中选取TransformAnimationPart进行创建创建完成后资源管理器会自动跳转到该零件的目录内。
- 接着将TransformAnimationPart变换动画零件挂接到我们的特效预设底下它就变成了变换动画特效。
## 组装高级分裂牛
前面我们已经使用过分裂猪这个预设,现在我们尝试制作一个分裂牛,并和刚才制作的变换动画特效结合起来。
- 首先通过菜单栏=>创建预设=>模板预设=>分裂猪来创建一个新的生物
![image-20210709224101462](./images/image-20210709224101462.png)
- 在属性面板上,将其名称改为**带特效的分裂牛**,设置整体模板为牛,并依次点击**应用**和**刷新所有属性**按钮使之生效
![image-20210709224420644](./images/image-20210709224420644.png)
- 将变换动画特效挂接到这个分裂牛预设上并将其属性中的关键帧1改为下图所示
![image-20210709224801192](./images/image-20210709224801192.png)
- 切换到关卡编辑器,放置几个分裂牛到场景中,并控制角色移动到分裂牛附近
![image-20210709225122693](./images/image-20210709225122693.png)
- 点击保存,然后运行,现在可以看到这个带特效的分裂牛了,尝试去攻击它吧
![cow_effect](./images/cow_effect.gif)

View File

@@ -0,0 +1,147 @@
# 实例与属性
前面我们已经学习了如何组装自己的自定义预设,来实现一些炫酷的功能玩法。
这一小节我们将介绍如何修改舞台内的自定义预设/零件属性,来给这些实例赋予不同的功能效果,这有助于指导我们进行后续的零件开发。
## 预设存档
当我们把预设拖进关卡编辑器时,会生成一个预设的虚拟实例,显示在舞台中。
新版关卡编辑器的保存默认只保存预设存档,也就是舞台上显示的所有预设实例,而非整个地图。
预设存档文件位于存档目录的presets.json。
![image-20210708164630959](./images/image-20210708164630959.png)
实体预设需要保存到地图中才能生效,当你添加/删除了实体预设时,新版关卡编辑器的保存会触发地图的保存。
**特别注意**
如果单独把预设存档拷贝到了另一个地图,这个存档里的实体预设会无法加载,需要重新用编辑器打开这个地图保存一次。
## 预设实例
预设的实例化分为虚拟实例化与真实实例化。在编辑器内放置的预设属于虚拟实例,在开发测试运行时,预设才会真实实例化。
虚拟实例可以进行重叠放置,不会因方块重叠而丢失数据,可以通过坐标变换属性/坐标轴拖柄任意调整它的位置,旋转与缩放。
![image-20210708174313373](./images/image-20210708174313373.png)
**特别注意**
素材一经真实实例化就会存入地图存档,**坐标变换的相关API都不再生效**。
## 修改实例属性
预设放置到舞台中之后,我们可以对预设及其子节点的属性进行编辑,让同种预设的不同实例展现不同的效果。
前面我们创建了一个变换动画特效它的零件默认属性设置的是4s内循环上下移动接下来我们通过属性修改来制作一些不同类型的变换特效。
在场景中放置3个变换动画特效分别命名为移动旋转缩放。
![image-20210708194748169](./images/image-20210708194748169.png)
将旋转的简易变换动画零件的属性按下图修改:
![image-20210708194845045](./images/image-20210708194845045.png)
将缩放的简易变换动画零件的属性按下图修改:
![image-20210708194920975](./images/image-20210708194920975.png)
点击保存然后运行可以看到3个特效分别播放着不同的变换动画。
![move_rotate_scale](./images/move_rotate_scale.gif)
## 修改本体属性
预设实例的修改只会影响单个实例,如果希望将修改同时应用于所有实例,需要修改预设本体。
在预设实例上右键,可以定位该实例的本体所在资源管理器路径。
![image-20210708200628881](./images/image-20210708200628881.png)
双击预设本体,即可打开预设本体进行编辑。
对预设本体的修改,先会应用到所有实例上,然后实例再应用实例上的修改。
这里我们将零件的名称进行了修改并将关键帧1的缩放改为了(3.0, 3.0, 3.0)
![image-20210708201820063](./images/image-20210708201820063.png)
回到关卡编辑器后发现3个动效的子节点名称都被修改了且原来未改动过关键帧1的《移动》预设的关键帧1已经应用了本体的缩放修改。
![image-20210708202216756](./images/image-20210708202216756.png)
## 常加载
**常加载**属性表示该预设在加载完成后,即使所在的区块被卸载,它也不会被卸载。
它只能应用于基于空预设组装的预设,不适用与实体预设,特效预设等。
它的主要用途是使一些全局预设移除随区块加载和卸载的特性,避免它卸载后导致逻辑问题。
它常常与预加载一同使用。
**特别注意**
常加载预设不被卸载并不意味着它关联的方块或地图元素不会被卸载,只是保证它的逻辑会继续驱动。
## 预加载
**预加载**属性表示该预设将在地图初始化时,在地图出生点位置创建一个该预设的实例。
它只能应用于基于空预设组装的预设,不适用与实体预设,特效预设等。
它的主要用途是制作**类似GameManager功能的全局管理型功能预设**,帮助我们制作**不依赖于舞台的AddOn功能玩法**。
这两个新版模板都使用了预加载属性来创建预设以进行功能初始化。
![image-20210712144310664](./images/image-20210712144310664.png)
- 使用预加载属性前,需要先设定出生点,这个可以通过地图编辑器=>菜单栏=>出生点功能进行设置。
![image-20210712145200977](./images/image-20210712145200977.png)
- 创建一个空预设改名为GameManager预加载通常与常加载一并使用它不会产生坐标更新将变换更新间隔设为0
![image-20210712145415830](./images/image-20210712145415830.png)
- 创建一个空零件挂接到GameManager预设上修改零件的InitServer初始化函数为监听聊天事件
```python
def InitServer(self):
print(self.classType, "InitServer")
import mod.server.extraServerApi as serverApi
self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(), "ServerChatEvent", self, self.OnServerChatEvent)
def OnServerChatEvent(self, args):
playerId = args.get("playerId")
print("OnServerChatEvent", playerId)
import mod.server.extraServerApi as serverApi
comp = serverApi.GetEngineCompFactory().CreateMsg(playerId)
comp.NotifyOneMessage(playerId, "Hello, world", "§c")
```
- 点击运行,输入聊天指令,刚编写的零件已经生效了
![image-20210712150334414](./images/image-20210712150334414.png)
**特别注意**
- 预加载预设也可以与舞台场景内的预设协同工作,预加载预设的创建时机要早于舞台预设
- 存在多个预加载预设时其加载顺序为预设文件名xxx.preset的字母序
- 有少量事件的时机发生在预加载预设创建之前会导致无法监听到如房主的AddServerPlayerEvent

View File

@@ -0,0 +1,99 @@
# 预设生命周期
前面我们已经学习了如何使用预设的常加载与预加载等属性,但我们还不知道预设是怎么加载卸载的。
这一小节我们将介绍预设和零件的生命周期我们应该如何管理MOD里的各种预设和零件这有助于指导我们进行后续的零件开发。
## **服务端**与客户端实例
在前面学习MOD开发过程中我们已经了解到服务端和客户端属于两个不同的容器同样预设和零件的实例也分为服务端实例与客户端实例。
我们希望零件是一个轻量级的功能单位如果每个零件都需要像system那样分别编写客户端系统类和服务端系统类那样会显得非常臃肿。
因此我们支持在一个零件类里编写双端代码当使用零件提供的双端API时它会自动根据当前是客户端还是服务端返回相应的内容如GetLevelId()。
如果需要import SDK中的服务端/客户端部分需要将import代码放到函数内部且函数命名需要带有Server/Client以进行区分。
下面以玩家基础属性零件为例:
```python
def InitClient(self):
logger.info("%s InitClient %s %s", self.classType, self.GetParent().GetPlayerId(), self.showName)
import mod.client.extraClientApi as api
nameComp = self.CreateComponent(str(self.GetParent().GetPlayerId()), 'Minecraft', 'name')
nameComp.SetShowName(self.showName)
if self.GetParent().GetPlayerId() == api.GetLocalPlayerId():
gameComp = self.CreateComponent(api.GetLevelId(), 'Minecraft', 'game')
gameComp.SetNameDeeptest(not self.nameDeeptest)
self.NotifyToServer("OnLoadSuccess", {'id': self.GetParent().GetPlayerId()})
```
```python
def InitServer(self):
logger.info("%s InitServer %s", self.classType, self.GetParent().GetPlayerId())
self.ListenSelfEvent('OnLoadSuccess', self, self.OnLoadSuccess)
```
```python
def OnLoadSuccess(self, data):
logger.info("%s OnLoadSuccess %s", self.classType, self.GetParent().GetPlayerId())
import mod.server.extraServerApi as api
pComp = self.CreateComponent(data['id'], "Minecraft", "player")
pComp.SetPlayerRespawnPos(tuple(self.spawnPos))
...
```
- 零件的客户端部分负责在初始化时将父预设即玩家的ID通知服务端
- 零件的服务端部分在初始化时监听客户端事件接收到登录玩家的ID时设置该玩家的相关属性
关于零件的开发规范,详情可以查阅[零件开发规范](../12-深入理解零件/6-零件开发规范.md)。
关于双端实例的通讯与网络同步我们提供了一些内置API比如上面这个零件使用到的**NotifyToServer**与**ListenSelfEvent**,详情可以查阅[通讯与网络同步](../12-深入理解零件/3-通讯与网络同步.md)。
## 生命周期
预设系统的完整生命周期如下:
![image-20210712200101137](./images/image-20210712200101137.png)
- 总是先加载服务端实例,再加载客户端实例
- 服务端预设实例的坐标变换变更添加删除素材、零件或子预设卸载或销毁都会广播通知所有客户端预设实例进行数据同步而客户端的任何变更都不会主动向服务器同步需要显示调用请求服务端的相关API
- 零件的InitServer/InitClient在预设初始化时调用一次
- 零件的TickServer/TickClient在预设加载后每个逻辑帧调用一次
- 零件的UnloadServer/UnloadClient在预设卸载时调用一次
- 零件的DestroyServer/DestroyClient在预设销毁时调用一次
### 加载依赖
预设加载的前置条件是它的所有变换对象TransformObject依赖的区块全部加载完毕。
**特别注意**
- 不建议构建需要依赖大量区块的大型预设,预设并不是适用来保存地形,城堡类的大型素材
- 不建议设置预设的多个子节点到相距很远的位置,这也会导致预设依赖它们中间跨越的所有区块
实体预设在加载时,会与对应的实体进行绑定,因此它除了依赖区块加载,还依赖于实体的加载。
同理,玩家预设的加载依赖对应的玩家登陆。
客户端预设的加载还依赖于对应的服务端预设加载。
### 加载过程
预设加载过程分为四步:
- 根据预设文件ID获取预设文件解析预设层次结构本体
- 递归分析预设所依赖的素材,零件,子预设,实例化展开所有游戏对象,并构建游戏对象的父子关系
- 应用预设/零件存档里的实例修改部分
- 应用预设/零件层次结构的坐标变换
### 卸载与销毁
- 当预设的加载依赖不满足,且预设不具有常加载属性时,预设将被卸载。
- 在零件内主动对父预设进行销毁,不会立刻停止零件代码,父预设会继续完成当前帧所有子节点的逻辑,在当前帧的末尾完成销毁

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