|
本帖最后由 Msure 于 2018-6-24 15:38 编辑
感谢@Argon_gas的帖子,感觉论坛里很少有说function的,所以这篇帖子将对function进行简单的介绍。
1 什么是function?有什么用?
是一个允许玩家利用扩展名为.mcfunction的文本文档编写和运行多行命令的功能。
简单的来说,只要写一个扩展名为.mcfunction的文本文档,在里面写上一条条的命令(和命令方块命令相同),即可在游戏中执行。
利用function可以执行大量命令(省的你摆命令方块)以及在1gt内重复执行某命令n次(递归操作)
执行大量命令的情况:需要对游戏中的情况进行成百上千大量的穷举。
重复执行某命令n次:一些特殊操作。
为了让大家还有兴趣看完这枯燥无味的帖子......发两个利用function做的入门小玩意,大概能激起一部分人看完的决心......
2 如何食用function(1.12——1.12.2)
2.1 创建一个function
首先打开游戏存档目录,在存档目录下打开data即可找到名为functions的文件夹。打开functions文件夹,在里面再新建一个名字随便的文件夹,如我新建一个文件夹叫sure,这个sure的文件夹即为命名空间。
之后,我在sure文件夹里新建一个记事本,命名为hello,并把后缀txt改成mcfunction。注意,此时该记事本文件应该已经变成了hello.mcfunction而不是hello.txt(需要在选项里把显示后缀名打开才能更改)
创建完之后,需要用notepad++打开这个hello.function(右键,打开方式),之后在里面输入以下指令:(注意前面没有/)
- say hello
- #say hello
- say bye
复制代码 点击保存,一个最简单的function就创建好了。
2.2 单次执行function
接下来我们只要打开游戏,执行:
function中命令从上向下执行,空行会被直接忽视跳过,前面带有#的代表注释也会被忽略。即可看到聊天框输出:
[玩家] hello
[玩家] bye
function的执行格式为:
- /function <函数名称> [<if|unless> <选择器>]
复制代码 可以看到function可以用if|unless来选择执行条件。if表示满足选择器条件时执行function,unless表示不满足选择条件时执行function。
2.3 循环执行function
最简单的办法就是放到循环命令方块里了
当然一般我们可用gamerule来循环执行:- /gamerule gameLoopFunction <函数名称>
复制代码 可以在一个function中写入几个function,由此循环执行多个function
3 function的递归
递归,即为自己调用自己。简单的来说,在一个function中执行这个function本身,那么在1gt内就会一直执行下去(会卡死,所以要加条件限制)
举例:
首先创建记分板times,召唤名为times的盔甲架,设定盔甲架在记分板上为0分
在命名空间sure中创建function名为hello
输入以下指令:
- say hello
- scoreboard players add @e[name=times] times 1
- function sure:hello if @e[score_times=2]
- say bye
复制代码 保存后在游戏中执行function sure:hello
来分析一下执行情况
(第一次,0分)say hello
(第一次,0分)scoreboard players add @e[name=times] times 1
(第一次,1分)function sure:hello if @e[score_times=2] <-----满足条件,执行成功,再次执行function本身。
(第二次,1分)say hello
(第二次,1分)scoreboard players add @e[name=times] times 1
(第二次,2分)function sure:hello if @e[score_times=2] <-----满足条件,执行成功,再次执行function本身。
(第三次,2分)say hello
(第三次,2分)scoreboard players add @e[name=times] times 1
(第三次,3分)function sure:hello if @e[score_times=2] <-----不满足条件,无法执行。
(第三次,3分)say bye <-----返回之前位置
(第二次,3分)say bye <-----返回之前位置
(第一次,3分)say bye
由此可见,通过递归,在1gt内执行了三次function,并且可以通过调整分数来调整执行次数。递归中当function不满足条件时,会返回之前插入的位置继续执行下去。
4 [1.13]中的function
1.13中function被放到了数据包里,数据包除了function还有很多其他功能,这里只说function。
在地图文件目录下,打开datapacks文件,在里面再创建一个文件(只能数字.小写字母._ 命名)即为数据包名字。
在数据包里创建记事本,改名为pack.mcmeta(注意mcmeta是后缀)
还用notepad++打开,输入以下代码[sup][1][/sup]
- {
- "pack": {
- "pack_format": 1,
- "description": "name"
- }
- }
复制代码 "pack_format": 后面为任意数字,"description": 后为悬浮显示名称,点击保存。
然后再在数据包里新建一个文件夹(只能数字.小写字母._ 命名)即为命名空间。
之后在命名空间里创建functions文件夹,再在functions文件夹里创建记事本hello,改后缀名称为.mcfunction,就创建好了一个function。
执行时还按照function <命名空间>:<函数名称>即可
注意:1.13去除了/function <函数名称> [<if|unless> <选择器>]这种用法,只能/function <函数名称> 取而代之的是execute if|unless entity <选择器> run function <函数名称>
参考资料:
[1]pineapple_. 1.13数据包食用方法入门教程.
|
评分
-
查看全部评分
|