*原创文章,未经允许禁止转载或摘编
目录
Part 1 - 函数机制简介
Part 2 - 函数文件内容(格式&编辑&保存)
Part 3.1 - 实装 [1.12-1.12.2] (包括使用/function直接调用函数)
Part 3.2 - 实装 [1.13+] (包括制作数据包和使用/function直接调用函数)
Part 4.1 - 自定义标签 (使用自定义标签标记函数和使用/function通过标签间接调用函数)
Part 4.2 - tick标签 & load标签
重要:一个函数文件中可以保存一堆命令,函数文件指的是物理上保存的一个文件实体,函数指的是对应函数文件中保存的命令集合。
Part 1 - 函数机制简介
说起"/function"命令,我们可以看到wiki中对它的解释:运行一个函数。
比如这样......
......_(´ཀ`」 ∠)_...
幸好,MC的函数不是这个函数!
在 Minecraft Java 1.12 中,新增了函数机制。
函数:我们将一些为实现某功能的命令集合称为一个函数。
函数文件:我们将每个函数分别保存到后缀名为".mcfunction"的文件中,每一个文件就是一个函数文件。
/function:将这些编辑好的函数文件保存到存档中指定的地方后,在游戏中打开存档,就可以使用"/function"命令来调用、执行指定的函数(文件内的命令)。
函数的优点
函数文件作为一个文本文件,其中的命令可以很容易地进行修改,转发。
函数在打开存档的时候被载入游戏。若正在游戏中,修改了文件的内容,可在游戏中使用 /reload 刷新文件,该命令 1.12+ 通用。
相较于命令方块,在执行大量命令时,函数拥有更高的流畅度,占用的资源更少。
函数文件中的单个命令长度不受命令方块字符数上限32500的限制。
函数机制增强了命令的可复用性、模块性。
函数文件内可以随意添加注释。
函数的缺点
相较于命令方块,函数文件内的命令之间没有条件制约的概念。即,无论文件内的某条命令执行成功与否,只要调用执行了该函数文件,文件内的所有命令都将被顺序执行。
注①:在每个存档中可以保存不止一个函数(文件)。
注②:Java 1.12-1.12.2 版本和 Java 1.13+ 版本,函数文件的保存位置不同,但是函数文件的内容和格式没有区别。
1.12-1.12.2 的位置:存档名称/data/function/命名空间/...
1.13+ 的位置:存档名称/datapacks/数据包名称/data/命名空间/functions/...
Part 2 - 函数文件内容(格式&编辑&保存)
① 新建一个文本文件,然后输入以下内容。
# 井号后的内容均为注释,可写可不写。
# 函数文件中的命令不允许以 / 开头。
# 每一行为一条命令,换行代表着下一条命令的开始。
# 允许空行。
# 函数中的§等特殊符号,不需要转义。
tellraw @a {"text":"§a§l【暗冥夜辰】测试文字!"}
tellraw @a {"text":"【暗冥夜辰】测试完成!","color":"light_purple","bold":true} ② 保存时必须使用不带BOM的UTF-8编码,且需将后缀名改为".mcfunction"。

图1 - Win10 记事本
这样,一个简单的函数就编辑并且保存好了。
我为其命名为 novices.mcfunction,novices就是这个函数文件对应的函数名。
注:因为函数文件是一个文本文件,所以任何可以编辑文本文件的软件都可编辑它。
Part 3.1 - 实装 [1.12-1.12.2]
① 打开存档文件夹:存档名/data/functions 。

图2 - 打开存档内的函数文件夹
② 新建一个名为 TEST (随意取名,该名称称为命名空间)的文件夹,然后将刚刚保存的函数文件放入TEST文件夹。

图3 - 将函数文件放入文件夹
③ 进入游戏,打开该存档,使用 "/function TEST:novices" 运行该函数。

图4 - 注:TEST:novices 和 test:novices 均可运行。
注:命令格式为 /function 命名空间:函数名 。

图5 - 执行结果
总结:
如果函数放置在 存档名/data/functions/命名空间/函数.mcfunction
使用 /function 命名空间:函数 运行;
如果函数放置在 存档名/data/functions/命名空间/xxx/yyy/函数.mcfunction
使用 /function 命名空间:xxx/yyy/函数 运行;
警告:必须建立类似 TEST 的文件夹作为命名空间存放函数,直接将函数放入functions文件夹是不允许的。
另外,在 1.12-1.12.2 版本中,还有一条游戏规则:
/gamerule gameLoopFunction XX:xx
该规则指定一个函数,被指定的函数将自动在每游戏刻运行一次(1秒=20游戏刻)。
若要取消已指定的函数,重新设置一个不存在的函数即可。
Part 3.2 - 实装 [1.13+]
在1.13版本后,Minecraft 将函数和资源包等自定义扩展整合为数据包统一管理,所以如果使用函数还得做个简易数据包。另外,1.13+后,可以给函数增加标签,某些情况下可以更加方便的使用函数。
本文使用 1.17 作为 1.13+ 版本的例子:
① 打开新的数据包文件夹:存档名/datapacks 。

图6 - 打开存档内的数据包文件夹
② 新建一个名为 anye (随意取名,anye 即为数据包名称)的文件夹。
③ 在 datapacks/anye 文件夹中新建一个文本文档,输入以下内容,并保存为 pack.mcmeta (该文件名不得更改)。
{
"pack":{
"pack_format":7,
"description":"函数 —— by 暗冥夜辰"
}
} "pack_format"的值根据游戏版本更改:1.13-1.14.4为4,在1.15-1.16.1为5,1.16.2-1.16.5为6,1.17此数值为7。
"description"的值可以为字符串或JSON文本。在使用 "/datapack list" 查询当前加载的数据包时,作为描述文本显示。

图7 - 描述文本
④ 在 datapacks/anye 文件夹中新建 data (该文件夹名不得更改)文件夹。
⑤ 在 datapacks/anye/data 文件夹内新建 anye (随意取名,这个anye即为命名空间,和之前的TEST性质一样,应尽量避免与别的数据包冲突,建议和数据包名称保持一致)文件夹。
⑥ 在 datapacks/anye/data/anye 文件夹内新建 functions (该文件夹名不得更改,这个文件夹可以理解为函数文件夹)文件夹。
⑦ 将之前的 novices.mcfunction 文件拖入 functions 文件夹内。
⑧ 进入游戏,输入"/function anye:novices" 命令运行。

图8 - 1.17 聊天框执行命令

图9 - 1.17 执行结果
总结:
如果函数放置在 存档名/datapacks/数据包名称/data/命名空间/functions/函数.mcfunction
使用 /function 命名空间:函数 运行;
如果函数放置在 存档名/datapacks/数据包名称/data/命名空间/functions/xxx/yyy/函数.mcfunction
使用 /function 命名空间:xxx/yyy/函数 运行。
Part 4.1 - 自定义标签
在 1.13+ 版本中,可以使用标签来标记函数,然后使用 /function #命名空间/标签名 来运行该标签下的所有函数。
我们在刚刚建立的数据包中继续新建一些文件夹和文件。
① 在 datapacks/anye/data/anye 文件夹内新建 tags (该文件夹名不得更改)文件夹。
解释:在我们数据包中的anye命名空间下新建标签文件夹。
② 在 datapacks/anye/data/anye/tags 文件夹内新建 functions (该文件夹名不得更改)文件夹。
解释:因为要标记的是函数,所以在标签文件夹下新建函数文件夹。
③ 在 functions 文件夹中新建文本文件,输入以下内容,并保存为 ftag.json (ftag即为标签名,可随意命名)。
{
"values": [
"anye:novices"
]
} "values"列表中即为指定需要运行的函数。名称和/function中调用的名称一样。
这样,我们就在anye命名空间下,新建了一个ftag的函数标签,并且标记了一个函数。
现在,使用 /function #anye:ftag 和 /function anye:novices 的效果是一样的。
需指定多个函数时的格式:
{
"values": [
"命名空间:函数1",
"命名空间:xxx/函数2",
"命名空间:xxx/yyy/函数3"
]
}
Part 4.2 - tick标签 & load 标签
在1.12-1.12.2中只能通过游戏规则设置一个函数在每个游戏刻都运行一次。
1.13+中,可以使用 tick标签 来指定多个函数在每个游戏刻都运行一次,可以使用 load标签 来指定多个函数在加载数据包后的第一个游戏刻运行一次。
因为游戏仅识别minecraft命名空间中的tick标签和load标签,所以需要在我们的数据包中新建minecraft命名空间。
① 在 datapacks/anye/data 文件夹内新建 minecraft (该文件夹名不得更改)文件夹。
② 在 datapacks/anye/data/minecraft 文件夹内新建 tags (该文件夹名不得更改)文件夹。
③ 在 datapacks/anye/data/minecraft/tags 文件夹内新建 functions (该文件夹名不得更改)文件夹。
④ 在 functions 文件夹中新建文本文件,输入以下内容,并保存为 load.json (tick.json也在此存放,内容同理)。
{
"values": [
"anye:novices"
]
}
注①:同一个函数可以被多个标签同时标记。
注②:标签文件内的函数列表如果出现了重复的函数,并不会重复执行,仅以其第一次出现时的位置为准。

图10 - 黄色部分为可变内容
*原创文章,未经允许禁止转载或摘编
欢迎加入Q群:809709841
烦请各位读者大大们来个三连,关注我看更多Minecraft的内容 ^_^~~~
谢谢阅读!!
关注点赞哟!!!(ˉ▽ ̄~) ~~