同步官网文档8m_25d
This commit is contained in:
0
mconline/10-addon教程/第11章:更强大的自定义生物/README.md
Normal file
0
mconline/10-addon教程/第11章:更强大的自定义生物/README.md
Normal file
BIN
mconline/10-addon教程/第11章:更强大的自定义生物/images/1_1.png
Normal file
BIN
mconline/10-addon教程/第11章:更强大的自定义生物/images/1_1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 67 KiB |
BIN
mconline/10-addon教程/第11章:更强大的自定义生物/images/1_2.png
Normal file
BIN
mconline/10-addon教程/第11章:更强大的自定义生物/images/1_2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 74 KiB |
BIN
mconline/10-addon教程/第11章:更强大的自定义生物/images/2_1.png
Normal file
BIN
mconline/10-addon教程/第11章:更强大的自定义生物/images/2_1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 330 KiB |
BIN
mconline/10-addon教程/第11章:更强大的自定义生物/images/2_2.png
Normal file
BIN
mconline/10-addon教程/第11章:更强大的自定义生物/images/2_2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 264 KiB |
35
mconline/10-addon教程/第11章:更强大的自定义生物/课程01.行为与动画组合.md
Normal file
35
mconline/10-addon教程/第11章:更强大的自定义生物/课程01.行为与动画组合.md
Normal file
@@ -0,0 +1,35 @@
|
||||
---
|
||||
front: https://mc.res.netease.com/pc/zt/20201109161633/mc-dev/assets/img/1_1.b3d4b5ee.png
|
||||
hard: 进阶
|
||||
time: 20分钟
|
||||
---
|
||||
|
||||
# 行为与动画组合
|
||||
|
||||
|
||||
|
||||
#### 作者:境界
|
||||
|
||||
|
||||
|
||||
我们希望生物会因某种行为而发生动作上的改变,这种改变更多是暴露在外给玩家看到的。比如希望生物在攻击时会表现攻击动画,希望它们在水面上移动时会做出游泳动画。在基岩版中,使用Molang语法配合动画控制器可以做出丰富的动画组合。Molang语言是基岩版独有的一种简易的表达式语言,它主要作用于计算和获取游戏系统内的属性值,由于设计的比较底层,因此在语言优化上的优势远远大于脚本引擎。能够从游戏内获得的属性绝大多数服务于自定义实体、自定义物品、自定义方块上,这些属性又由query函数所返回,它们就像MODSDK上的接口,根据不同query函数所服务的对象,可以返回它们携带的属性。例如我想知道某只羊是否是幼体,可以在molang中读取query.is_baby函数来获得羊是否是幼体。更多的query函数表可以从Minecraft wiki上找到!
|
||||
|
||||
|
||||
|
||||
#### 行为与动画示例①
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
①羊在幼体时,它看起来头特别的大,比成年的羊还大。这是因为羊这个生物注册了一个放大头部位的动画,判断羊是幼体使用了query.is_baby函数。从羊的生物定义文件中可以看到,放大羊头的动画资源名称为baby_transform,而baby_transform的播放条件是query.is_baby必须为1,文档告知这个函数只会返回1真或者0假。在Molang中,布尔值由数字代替,不为0为真,0为假。因此,{动画: molang语法}即告知游戏,当某只羊是幼体时,则放大头部的动画会播放。这里的molang语法简写为"query.is_baby",相当于若query.is_baby不为0,则为真。
|
||||
|
||||
|
||||
|
||||
#### 行为与动画示例②
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
①猪在移动的时候,用到了walk这个动画,它被注册在了猪的定义文件里。同样使用molang语法,根据文档可以知道query.modified_move_speed会根据生物的速度返回0~1之间单位化取值,若速度慢慢地走出来,则返回1,若因为部分组件行为使用了速度调整的键对,可能不会刚好满足1,但是由于大于0的缘故,最后在上图中,每当猪移动的时候都会返回真,则播放walk动画。
|
||||
37
mconline/10-addon教程/第11章:更强大的自定义生物/课程02.控制器与生物事件.md
Normal file
37
mconline/10-addon教程/第11章:更强大的自定义生物/课程02.控制器与生物事件.md
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
front: https://mc.res.netease.com/pc/zt/20201109161633/mc-dev/assets/img/2_1.5731dfa4.png
|
||||
hard: 进阶
|
||||
time: 20分钟
|
||||
---
|
||||
|
||||
# 控制器与生物事件
|
||||
|
||||
|
||||
|
||||
#### 作者:境界
|
||||
|
||||
|
||||
|
||||
在前面的章节中,我们曾有提到动画控制器是存放在资源包的,因为它用来控制动画的状态切换。但实际上,行为包上也可以存在动画控制器,所存放的文件夹和大部分结构上的写法都没有太大的变化。但这又是用来做什么的呢?实际上,有许多开发者曾经希望,能够获得实体的状态后去执行行为包内的事件,亦或是直接从实体身上执行某段指令。由于这些内容都必须在服务端上运行,因此基岩版团队也为开发者在行为包上开放了另一种动画控制器,来根据生物的状态变化时,去执行一组指令或者触发生物的某个事件。
|
||||
|
||||
由于原版的实体都没有用到这个功能,它的格式和用途只存在于文档当中,因此寻找参考对象比较困难,以下整理了两种用途,为开发者指点迷津。
|
||||
|
||||
|
||||
|
||||
#### 行为包控制器的写法
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
① 在行为包根目录中创建animation_controllers的文件夹,控制器文件都会放在这里。
|
||||
|
||||
②根据上图可以看到与资源包类似,除了在每个状态下可以放置animations动画集合以外,还有两个新的集合,一个是“on_entry”,一个是“on_exit”,它们分别会在进入该状态下后,和离开该状态下前去执行里面的内容。内容可以填写一组指令,或者"@s 事件名称"的格式来执行一个使用了该动画控制器的实体的行为事件。
|
||||
|
||||
③在上图中,我们根据生物在发现目标的时候,给予一格10秒的1级强力状态效果,并在生物失去目标的时候,清理掉身上全部的状态效果。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
④ 在生物行为文件里,注册动画控制器,并在scripts/animate下持续执行控制器,同样的执行控制器前,也可以额外通过Molang条件判断控制器是否需要执行。
|
||||
24
mconline/10-addon教程/第11章:更强大的自定义生物/课程03.Add-on与Mod协同工作.md
Normal file
24
mconline/10-addon教程/第11章:更强大的自定义生物/课程03.Add-on与Mod协同工作.md
Normal file
@@ -0,0 +1,24 @@
|
||||
---
|
||||
front:
|
||||
hard: 进阶
|
||||
time: 5分钟
|
||||
---
|
||||
|
||||
# Add-on与Mod协同工作
|
||||
|
||||
|
||||
|
||||
#### 作者:境界
|
||||
|
||||
|
||||
|
||||
当前中国版,有多种方式使MOD与附加包协同工作。
|
||||
|
||||
①使用GetEntitiesAround,可以传入过滤器来筛选出范围内想要的实体。
|
||||
|
||||
②使用TriggerCustomEvent,可以执行某个生物行为定义的生物事件。
|
||||
|
||||
③监听EntityDefinitionsEventServerEvent事件,可以监听到游戏内的某个实体触发了某个事件。
|
||||
|
||||
④使用GetMolangValue,可以在客户端上获取某个实体的query函数值。
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
front:
|
||||
hard: 进阶
|
||||
time: 30分钟
|
||||
---
|
||||
|
||||
# 简易教程①:制作带有完整攻击动画的生物
|
||||
|
||||
|
||||
|
||||
#### 作者:境界
|
||||
|
||||
|
||||
|
||||
高级史莱姆示例包下载:下载[示例包](https://g79.gdl.netease.com/guidedemo-case11.zip)。
|
||||
|
||||
①附录的附加包内包含一只高级史莱姆生物。让生物带有一种完整攻击动画在概念中一般是指,生物的攻击会因为动画效果带有延迟性。假如史莱姆在对目标进行进攻的时候,我们不希望它在达到攻击距离时,就对目标造成伤害。我们更希望它携带一种比较好的攻击动画,在动画的某一刻再打出那道伤害。幸运的是,原版的劫掠兽携带着这样的行为,并且它也用到了这样的动画效果。因此制作带有完整攻击动画的效果就变得简单起来。
|
||||
|
||||
|
||||
|
||||
②让实体带有攻击行为前,必须至少添加一种寻路组件行为、移动组件行为,一个移动速度组件行为和一个攻击力组件行为。寻路和移动组件行为打开后,攻击行为才会有效。移动组件行为和移动速度组件行为使生物能够移动到目标身边。攻击力组件行为添加上后,生物近战才会携带伤害能力。
|
||||
|
||||
|
||||
|
||||
③在高级史莱姆行为中,我们添加了minecraft:behavior.delayed_attack,即延迟攻击组件行为。详细的属性注释已经写在了组件行为旁边。
|
||||
|
||||
|
||||
|
||||
④接着切换到资源包,打开动画控制器,可以看到高级史莱姆的动画控制器文件。里面已经包含着一个专属于高级史莱姆的攻击动画控制器,使用“molang语法”前,根据文档提示可知,延迟攻击组件行为所搭配的“query”函数叫做“query.is_delayed_attacking”,当生物做出攻击动作时,它会返回“1.0”,即真,否则在其他时间下返回“0.0”,即假。因此,攻击动画使用的循环模式为单次,并在“query.is_delayed_attacking”返回“0.0”,即攻击结束时,切换回初始状态。
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
---
|
||||
front:
|
||||
hard: 进阶
|
||||
time: 30分钟
|
||||
---
|
||||
|
||||
# 简易教程②:制作一种带有范围攻击的生物
|
||||
|
||||
|
||||
|
||||
#### 作者:境界
|
||||
|
||||
####
|
||||
|
||||
高级史莱姆示例包下载:下载[示例包](https://g79.gdl.netease.com/guidedemo-case11.zip)。
|
||||
|
||||
①再次打开附录包内的高级史莱姆行为。我们开启了一个组件组,里面包含了一个“knockback_roar”组件行为,它来自劫掠兽,是劫掠兽吼叫时产生范围伤害和击退的组件行为。非常适合用来制作范围攻击。详细的组件键对属性已经用注释写好了。我们来关注一下如何在合适的时机将这个组件组加入进高级史莱姆的活动当中。
|
||||
|
||||
|
||||
|
||||
②还记得本章前面提到的控制器与生物事件吗?我们曾经写过一个例子,是在生物发现目标时给予一种状态效果,在失去目标时取消状态效果。同样,我们也可以将这个模式进行改造,让高级史莱姆在发现目标时对周围产生一次战吼的范围攻击,并在攻击结束后开始朝玩家方向移动。因此行为包的控制器内已经写好了一个控制范围攻击触发的控制器。“query.has_target”由文档可知,当实体发现目标时返回“1.0”,即真,反之返回“0.0”,即假。因此切换到“roar”吼叫状态时,必须满足发现目标。紧接着我们在“on_entry”里执行一条指令,会触发一次全屏信息公告。接着触发在高级史莱姆行为内定义好的开始吼叫事件。当吼叫结束时,我们又通过吼叫组件的“on_roar_end”触发一次移除吼叫组件的事件,这样生物就会开始朝目标靠近,直到目标消失后,控制器切换回普通状态,就会等待下一个目标发现时,继续战吼,形成一个生动行为的闭环。
|
||||
Reference in New Issue
Block a user