
在接下来的所有指令教学中,我会使用不同颜色的字强调不同种类的内容,方便大家阅读与查看。凡例:
深蓝色 标题
橙色 技术类文字
深绿色 专有名词
红色 强调
粉色 区分数字内容
紫色 范例
我已经不记得上次大规模使用指令方块是什么时候了。当玩家需要大规模执行指令时,成千上万个指令方块会占用大量的空间,并且指令方块工作区域需要时刻被加载。并且,由于指令方块不可避免的1tick(0.05秒)的延迟,相同时间内执行多条指令的需求也成为了指令方块很大的局限性。同时,随着执行环境的不断变化,反复设置指令的执行环境也对玩家造成了不小的麻烦。而函数(function)的出现,这些头疼的问题均得到了解决。
函数可以让玩家在同一文本文档中编写和运行多个指令。上一节有讲过,函数文件的后缀是.mcfunction。
函数的编写并不需要多高深的技巧,你只需把需要执行的指令一行一行写在文件里就可以了。当然,和指令方块一样,函数中也不允许出现多人游戏指令。不过,与指令方块不同的是,函数不存在单指令字符上限限制,但是每刻可以同时执行的最大指令数(包括任何形式执行的指令)存在上限。这可以通过/gamerule maxCommandChainLength指令调节这个上限值。
写好了函数之后,接下来讨论的问题是如何执行这个函数。指令方块需要红石机关定点触发,而函数可以通过指令立即执行或延时执行。
(1)/function
格式:/function {函数资源路径}
立即执行这个函数。如果这条指令在函数中被执行,目标函数中的所有指令会和这条指令所在函数中的所有指令同时执行,这就是函数零延迟优势的体现方式。你可以加入/execute确定条件分批执行指令,减少系统判定的次数,优化性能。
(2)/schedule
格式:①/schedule function {函数资源路径} (延时) (append|replace {正在等候执行的函数})
在执行这条指令特定时间之后执行这个函数。延时的单位可以是t(游戏刻,0.05秒),s(现实中的1秒)和d(游戏内的1天,即现实中的20分钟),不写单位默认为刻。时间换算成刻之后必须为整数。比如0.65s是一个合法的延时,但是0.65不合法(换算成刻不为整数)。append表示将这个函数放在等待执行函数列表之后,replace表示将等待执行函数列表中的一个待执行函数替换成该指令你想执行的函数。
②/schedule clear {正在等候执行的函数}
将一个正在等候执行的函数从等候执行函数列表中删除,使其在时间到时不再执行。
函数中的指令会继承执行者或所在函数中的执行环境,这包括执行者、位置、坐标等。如果玩家在聊天栏输入了运行函数的指令,函数中所有指令的执行者是玩家自己。如果函数A中含有执行函数B的指令,那么函数B的执行环境会继承A。当然,你可以通过/execute与运行函数类指令结合以改变函数的执行环境。当然,无论指令的顺序如何,在函数内更改指令执行环境不会影响其他指令的执行环境,因此如果你想在同一执行环境下批量执行指令,请在函数中使用/execute … run function。
函数中的所有指令、函数中/function执行的函数中的所有指令都会同时运行。但是,这些指令依旧存在从前到后、从上到下的执行顺序虽然它们会在同一游戏刻全部执行完毕。因此,请斟酌函数中每条指令的位次,避免因顺序出错导致结果不同。
与其他内容讲解实操的小节不同的是,这一节可以说有手就行,毕竟就是打指令嘛。我会放出一个实例,在需要讲解的地方给出一些注意事项,需要各位牢记。
例:下图是MJ Project:小业起床战争数据包耗子超级加倍版v1.02中的某一函数的内容。

MJ Project:创小业 x MJ Studio数据包中某函数内容
注意:
1. 当你需要一些注解或需要储存但不想执行的指令时,你可以在文本前输入井号“#”(你可以使用shift+3组合键输入)以添加标注,标注内容不会被游戏识别。这里在第一行,我储存了起床战争游戏内商店展出物品的生成指令。
2. 指令前不可以输入斜线符号“/”,否则函数会报错。
3. 请时刻牢记定向自该函数指令的执行环境,这样就可以使用@s限制指令的执行者。
4. 对于需要坐标的指令,请随时使用/execute at …确定指令的执行坐标,否则很有可能不会正确执行。
这一节内容很有可能是第三章讲技术性文件中最简单的一节,因此我并没有使用过多的篇幅讲述函数,如果可以熟练使用指令,这一节应该很快就可以掌握。不过,随着探索的深入,各位可能会遇到不断的穷举,为此头痛不已却毫无头绪。相信下一节内容会给大家一个满意的答案。
下一篇:第三章 进入技术世界 3.4 整理分类狂魔——标签