一遍又一遍地输入同样的十条命令,很快就会让人厌烦。函数是一个装满命令的文本文件,只需一条 /function 就能一次性运行其中所有命令。函数还能在每个游戏刻自动运行,很多附加包就是靠这个让效果持续生效的。
如果你还不熟悉命令,请先阅读命令基础。
快捷方式:GodCraft
GodCraft 有一个函数对象,会帮你写好文件和每刻运行列表。
- 打开工坊,在你的附加包中添加一个函数。
- 每行输入一条命令。输入时会有命令和参数的提示。
- 选择运行方式:每刻运行、世界加载时运行一次,或只通过
/function运行。 - 导出。
.mcfunction文件、tick.json、清单文件和 UUID 都会自动写好。
手动制作
第 1 步:创建函数文件
函数放在**行为包(BP)**中名为 functions 的文件夹里。文件以 .mcfunction 结尾,是纯文本:任何文本编辑器都能写。
# Gives whoever runs this function a starter kit
give @s minecraft:stone_sword
give @s minecraft:bread 8
give @s minecraft:torch 16
effect @s minecraft:speed 60 0
say Your starter kit is ready!规则很简单:
- 每行一条命令。 一条命令不能拆成两行。
- 不加斜杠。 写
give,不要写/give。 - 以
#开头的行是注释。 游戏会跳过它们。用注释来说明函数的作用。 - 空行没有问题,还能让长文件更易读。
用你自己名字命名的文件夹
把文件放在 functions/myname/ 这样的文件夹里,可以避免和其他也有 starter_kit 函数的附加包冲突。
第 2 步:运行它
在启用了你的行为包并开启作弊的世界中输入:
/function myname/starter_kit名称就是 functions 文件夹内的路径,文件夹之间用 / 分隔,不带 .mcfunction 后缀。参见 /function。
在函数内部,@s 和 ~ ~ ~ 指的是运行 /function 的人和他所站的位置。所以你运行新手礼包函数时,拿到物品的是你。
嵌套文件夹
你可以把函数分到任意多层文件夹中:
BP/functions/
tick.json
myname/
starter_kit.mcfunction
tick.mcfunction
arena/
start.mcfunction
reset.mcfunction用 /function myname/arena/start 运行嵌套的函数。
函数还可以调用其他函数。这很适合把一个大任务拆成几个小部分:
# Clean up, then teleport everyone in
function myname/arena/reset
tp @a 0 80 0
title @a title Fight!不要调用自己
函数直接或通过其他函数调用自己,会形成无限循环。游戏会在运行太多命令后强行中止,所以结果不会是你想要的。
第 3 步:用 tick.json 每刻运行
Minecraft 每秒更新世界 20 次,每次更新叫作一刻。要让函数每刻运行,就把它列在 functions 文件夹下的 tick.json 中:
{
"values": [
"myname/tick"
]
}values 中的每一项是一个函数路径,写法和 /function 中的一样。接着编写每刻函数:
# Players standing on a gold block get Speed
execute as @a at @s if block ~ ~-1 ~ minecraft:gold_block run effect @s minecraft:speed 1 1 true它每秒检查每个玩家 20 次。站在金块上的玩家会获得短暂的速度效果,只要一直站着就会不断刷新。末尾的 true 用来隐藏效果粒子。
每刻函数里的 @s 是谁?
每刻函数由游戏本身运行,不是由玩家运行,所以 @s 不指向任何人。像上面的例子那样,用带 as @a 或 as @e[...] 的 /execute 为每个玩家或生物运行命令。
每刻函数要尽量轻量。每秒对每个玩家运行 20 次的东西,开销很快就会累积起来。用 type、r 或 tag 等参数缩小选择器的范围。
重新加载修改
编辑函数文件后不需要重启游戏。运行 /reload 即可加载函数和脚本的新版本。如果某个函数里有一条错误的命令,整个文件可能都无法加载,所以请查看内容日志中的错误。参见故障排查。
命令方块
命令方块在收到红石信号时运行一条命令,直接在你的世界中工作。它们非常适合地图、小游戏和测试。附加包则更适合用函数,因为函数跟着你的包走,而不是只存在于某一个世界里。
获取命令方块
创造模式物品栏里找不到命令方块。请使用:
/give @s minecraft:command_block放下后,点击或右键打开它的设置。在输入框中输入命令,不用加斜杠。
三种类型
| 类型 | 颜色 | 作用 |
|---|---|---|
| 脉冲 | 橙色 | 每次被激活时运行一次 |
| 连锁 | 绿色 | 在指向它的方块运行后立即运行 |
| 循环 | 紫色 | 被激活期间每刻运行 |
主要设置
- 方块类型:脉冲、连锁或循环。
- 条件:无条件总是运行。有条件只在它后面的方块执行成功时才运行。
- 红石:需要红石会等待按钮、拉杆或红石的信号。保持开启不需要信号就会运行。
- 延迟刻数:运行前等待这么多刻。
示例:传送按钮
- 放一个设为需要红石的脉冲命令方块,命令为:
tp @p 0 100 0 - 在上面放一个石头按钮。
- 按下按钮:最近的玩家会飞到
0 100 0。
示例:连锁
命令方块的侧面有箭头,显示它朝向哪边。放在箭头所指位置的连锁方块会接着运行。
- 循环,保持开启:
testfor @a[r=5] - 在它前面放一个连锁方块,有条件,保持开启:
effect @a[r=5] minecraft:regeneration 2 0 true
现在 5 格内的玩家都会被治疗,但只在附近有人时才生效。/testfor 找到人就算成功,而有条件的连锁方块只在成功时运行。
用函数还是命令方块?
命令方块也可以运行整个函数:在里面写 function myname/arena/start。这样逻辑保存在你的附加包中,方块只是个按钮。
下一步
- 在命令基础中学习任何命令都需要的选择器和坐标。
- 掌握 /execute,大多数函数都是围绕这条命令构建的。
- 在你的第一个自定义方块中做一个自定义方块,代替金块来踩。