首页 | 舌尖美味 | 生活常识 | 游戏攻略 | 儿童教育 | 文化历史 | 运动户外 | 网络技术 | 数码科技 | 玩车行家 | 健康养生 | 时尚美容 | 影视娱乐 | 职场理财 | 星座解梦 | 热点资讯 | 情感生活
  关键字:
 网站首页 > 游戏攻略 > 我的世界1.12版函数命令系统教学详解 函数命令系统教程

我的世界1.12版函数命令系统教学详解 函数命令系统教程


  我的世界1.12版本新增了函数命令这一内容,很多玩家觉得非常复杂,也有玩家发现这个命令可以完全脱离命令方块而存在,今天小编就为大家带来我的世界1.12版函数命令系统教学详解,感兴趣的盆友们快来看看吧!

  1.12版函数命令系统教学详解

  1.9的更新为我们带来了三色命令方块,让命令方块脱离了红石成为独立的体系,我们因此可以更好实现一些想法;时隔3个版本,MOJANG再次为我们带来惊人的变革。

  1.12中,函数与进度系统的出现,让命令脱离命令方块——这句曾经说过的玩笑般的预言,正式成为可能。

我的世界1.12版函数命令系统教学详解 函数命令系统教程

  函数系统的构成

  函数系统的由来

  函数(function)系统,是 MC 1.12 Pre-1 版本中新增的一个功能,它将原来进度系统中返回指令的部分单独提取出来,做成了现在的函数系统。

  函数系统的形式

  函数系统由命名空间和函数文件组成,这些文件保存在存档目录/data/functions/下。functions目录下的文件夹,称为命名空间,各个命名空间下存放不同的函数文件。实际上,命名空间就是方便我们编写者分类并管理各种函数文件。

  函数文件是以.mcfunction为后缀名的文本文件,建议采用utf-8无BOM编码以防显示错乱。简单来讲,一个函数等价于一个多行命令方块,函数文件里面每一行写一条指令,当执行这个函数时,里面的指令会按行依次执行。如果在一个函数中调用其它函数,那么在同一游戏刻,被调用的函数中所有指令先执行完,再继续当前函数中后续的指令,就像插队一样,我们在后面对比命令方块时还会说到这个。

  请注意:在 1.12 Pre-3 版本中存在一个严重漏洞,即命令执行体不能正确地通过execute传递到被调用的函数中去,这个漏洞有望在后续版本以及正式版修复。

  以下是本文用到的一个函数系统的目录,带有"+"的表示为目录

  + functions

  + say

  hi.mcfunction

  bye.mcfunction

  Text1.mcfunction

  text2.mcfunction

  + system

  + process

  _process.mcfunction

  _main.mcfunction

  player_tick.mcfunction

  如何调用函数

  在 1.12 中,MOJANG新增了function指令和一条名为gameLoopFunction的游戏规则来辅助我们使用函数系统。function指令的格式如下:

  function <命名空间:函数名>

  function <命名空间:函数名> <选择器>

  这两条都是可行的。其中,if|unless是在1.12 pre-4加入的功能,后面我会解释到这个。我们先来说说第一种形式。例如上面的目录中,要调用system这个命名空间下的_main文件,就是输入这样的指令:

  function system:_main

  现在,我们来看一个例子例如say命名空间下的Text1.mcfunction和text2.mcfunction,里面分别写上这些内容

  Text1.mcfunction

  #这是一个范例,在function文件中可以用#来注释行。请注意,不能够使用//来注释!

  say 1

  function say:text2

  say 2

  text2.mcfunction

  say 3

  say 4

  当我在系统后台输入function say:text1时,聊天框会出现这些内容:

  [server] 1

  [server] 3

  [server] 4

  [server] 2

  也就是说,执行function指令的人,会把函数里面的指令依次执行——我在系统后台输入function指令,就是系统在执行,我自己输入function指令,就是我本人在执行。大家可能注意到了,函数中支持使用#进行注释(旧版本支持//注释,当前版本已经不再支持),也就是说被注释行不会作为指令而执行,这一点有多方便相比不比我再说了。同时需要大家注意:函数中所有指令不能够以/开头。例如,你可以这样写:

  say @s

  但是不能这样写:

  /say @s

  最后有一点需要注意的是,在function指令中调用函数时,不区分大小写。例如前面say命名空间下的Text1.mcfunction,我在调用的时候写的是say:text1

  然后是第二种形式,也就是带有if|unless的。我简单举两个例子,大家就知道是什么意思了。

  say:tellraw.mcfunction

  scoreboard objectives add timer dummy 计时器

  scoreboard players add @s timer 1

  function random:title if @s[score_timer_min=1200]

  scoreboard players reset @s[score_timer_min=1200] timer

  random:title.mcfunction

  summon area_effect_cloud ~ ~ ~ {Tags:["rnd_title","rnd_title1"]}

  summon area_effect_cloud ~ ~ ~ {Tags:["rnd_title","rnd_title2"]}

  summon area_effect_cloud ~ ~ ~ {Tags:["rnd_title","rnd_title3"]}

  summon area_effect_cloud ~ ~ ~ {Tags:["rnd_title","rnd_title4"]}

  summon area_effect_cloud ~ ~ ~ {Tags:["rnd_title","rnd_title5"]}

  entitydata @r[r=0,type=area_effect_cloud,tag=rnd_title] {CustomName:"rnd_title"}

  execute @e[name=rnd_title,tag=rnd_title1] ~ ~ ~ tellraw @a[r=0,c=1] ["1"]

  execute @e[name=rnd_title,tag=rnd_title2] ~ ~ ~ tellraw @a[r=0,c=1] ["2"]

  execute @e[name=rnd_title,tag=rnd_title3] ~ ~ ~ tellraw @a[r=0,c=1] ["3"]

  execute @e[name=rnd_title,tag=rnd_title4] ~ ~ ~ tellraw @a[r=0,c=1] ["4"]

  execute @e[name=rnd_title,tag=rnd_title5] ~ ~ ~ tellraw @a[r=0,c=1] ["5"]

  将say:tellraw放到主进程中

  execute @a ~ ~ ~ function say:tellraw

  则每位玩家每分钟将会看到1~5中随机一个数字出现在聊天框。也就是说,只有计时器分数满1200的人会执行后面的随机部分。那么很显然,带有if的意思就是,如果能找到后面的选择器,就执行这个函数,否则不执行。相当于testfor。

  那么unless的意思也就很明显了:在找不到后面的选择器的时候,执行这个函数,相当于testfor+非门。

  gameLoopFunction

  讲完调用,就该讲讲高频了。玩命令方块的人都知道高频是实现许多功能的前提。在函数系统中,MOJANG 为我们提供了一条名为gameLoopFunction的游戏规则来实现高频。它的格式是

  gamerule gameLoopFunction <命名空间:函数>

  也就是说,你可以指定一个函数来高频执行,这个高频是20Hz的,也就是每一个游戏刻都会执行一遍。新建的存档如果没有执行过这条指令,而是用gamerule gameLoopFunction来查询的话,得到的返回值是-

  为了方便,我们将这个规则简称为glf。在旧版本中,glf指定的函数,由系统(server)作为执行体;而在新的版本中,MOJANG 引入了虚拟执行体,例如将 say:text2 指定为glf时,每一个游戏刻得到的结果是这样的

  [say:text2] 3

  [say:text2] 4

  也就是说,系统不再作为执行体,而是由虚拟的执行体代为执行。

  关于 glf 多说两句。使用 glf 去高频执行一个函数,和使用 RCB(循环型命令方块,紫色那种)去执行,是不一样的。区别主要在于其更新顺序先后。一般而言不会造成严重影响,但是在某些情况会不一样。比如,使用 CB 能检测到生物的{HurtTime:10s}这个 NBT,而使用 glf 执行函数只能检测到的是{HurtTime:9s},检测不到10,这是因为关于函数的更新,都放在了生物更新之后,而 CB 的更新则是在生物更新之前。详情可以看这里。按照 Searge 的说法,函数并不是命令方块的完全替代。这个说法,大家就见仁见智了。对我个人而言这个影响不大。

  以上是函数系统的相关构成,以及如何调用函数。接下来我们来了解一下函数系统的模块分类。

  函数系统的模块调用

  对于一个完整的命令系统而言,模块一般可以分为三类:对执行顺序先后有要求的高频模块、对执行顺序先后无要求的高频模块、非高频模块。在函数系统中,我们同样可以将模块分成这三类。为了方便后续讲解。我们作这样的设定:

  将 system:_main设为 glf ,并称之为主进程或者主时钟

  对于上面讲到的三类模块,我们通过三种不同的方式去调用。

  对执行顺序先后有要求的高频模块,在主进程中按照需要的顺序排列好来调用。对执行顺序先后没有要求的高频模块,在主进程中可以比较随意放置位置,但是一般不会考虑优先执行。特别地,如果这个模块是针对每一个玩家独立执行的,可以使用进度系统中的"tick"触发器来调用,而不需要放在主进程中。仅在特定情况下触发的非高频模块,在主进程中调用,但是辅以execute、scoreboard和选择器参数去控制其在合适的时候被调用,这里的选择器,包括了在1.12 pre-4中新增的if/unless的部分。

  非高频模块在特定条件下激活,也在很大程度上减少了模块中大量重复出现execute的现象,并完全杜绝了超长的Conditional链,因为function中并不直接支持Conditional。不直接支持,说明可以间接支持,对吧。我们来看一个例子。

  假设有红蓝两队,在开始前考虑到互殴问题不进行分队,而是采用挂tag的方式。

  红队以tag=redTeam为标记,蓝队则以tag=blueTeam为标记,准备观战的玩家以tag=specTeam为标记

  当玩家站在相应区域(红蓝两队的所有玩家还需要选择了职业)添加Ready的标记,视为准备就绪。

  如果玩家不在相应区域时就移除Ready的标记。

  选择了职业的玩家,其记分板项selectClass数值大于等于1

  全部玩家准备就绪后,游戏进入倒计时,倒计时结束时游戏开始

  倒计时未结束,有玩家脱离准备就绪的状态,则倒计时中断

  条件比较多,我们先来看看怎么写这个模块,再进行分析。在这里,我们准备了一个名为gameStat的aec实体作为标记,所有游戏进程会以tag或者score的形式挂载到该实体上。请看指令部分

  execute @p[tag=redTeam,score_selectClass_min=1] ~ ~ ~ execute @p[tag=blueTeam,score_selectClass_min=1] ~ ~ ~ scoreboard players tag @e[type=area_effect_cloud,name=gameStat,tag=notGaming] add allReady

  execute @p[tag=!Ready,m=2] ~ ~ ~ scoreboard players tag @e[name=gameStat,type=area_effect_cloud,tag=notGaming] remove allReady

  execute @p[tag=!Ready,m=2] ~ ~ ~ execute @e[name=gameStat,type=area_effect_cloud,tag=notGaming] ~ ~ ~ execute @s[tag=!allReady,score_waitTime_min=1] ~ ~ ~ title @a clear

  execute @p[tag=!Ready,m=2] ~ ~ ~ execute @e[name=gameStat,type=area_effect_cloud,tag=notGaming] ~ ~ ~ execute @s[tag=!allReady,score_waitTime_min=1] ~ ~ ~ title @a reset

  execute @p[tag=!Ready,m=2] ~ ~ ~ execute @e[name=gameStat,type=area_effect_cloud,tag=notGaming] ~ ~ ~ scoreboard players reset @s[tag=!allReady] waitTime

  scoreboard players add @e[name=gameStat,tag=allReady] waitTime 1

  execute @e[name=gameStat,score_waitTime=1,score_waitTime_min=1] ~ ~ ~ title @a times 10 140 10

  execute @e[name=gameStat,score_waitTime=1,score_waitTime_min=1] ~ ~ ~ title @a subtitle [{"color":"aqua","text":"请玩家站在准备区域不要离开"}]

  execute @e[name=gameStat,score_waitTime=1,score_waitTime_min=1] ~ ~ ~ title @a title [{"color":"yellow","text":"游戏即将开始"}]

  execute @e[name=gameStat,score_waitTime=40,score_waitTime_min=40] ~ ~ ~ title @a subtitle [{"color":"aqua","text":"3"}]

  execute @e[name=gameStat,score_waitTime=40,score_waitTime_min=40] ~ ~ ~ execute @a ~ ~ ~ playsound block.note.pling voice @p ~ ~ ~ 1 0

  execute @e[name=gameStat,score_waitTime=60,score_waitTime_min=60] ~ ~ ~ title @a subtitle [{"color":"aqua","text":"2"}]

  execute @e[name=gameStat,score_waitTime=60,score_waitTime_min=60] ~ ~ ~ execute @a ~ ~ ~ playsound block.note.pling voice @p ~ ~ ~ 1 0

  execute @e[name=gameStat,score_waitTime=80,score_waitTime_min=80] ~ ~ ~ title @a subtitle [{"color":"aqua","text":"1"}]

  execute @e[name=gameStat,score_waitTime=80,score_waitTime_min=80] ~ ~ ~ execute @a ~ ~ ~ playsound block.note.pling voice @p ~ ~ ~ 1 0

  execute @e[name=gameStat,score_waitTime_min=100] ~ ~ ~ title @a times 10 30 10

  execute @e[name=gameStat,score_waitTime_min=100] ~ ~ ~ title @a title [{"color":"gold","text":"游戏开始"}]

  scoreboard players set @e[name=gameStat,type=area_effect_cloud,score_waitTime_min=100] gameStat 1

  scoreboard players reset @e[name=gameStat,score_gameStat_min=1,score_gameStat=1] waitTime

  scoreboard players tag @e[name=gameStat,score_gameStat_min=1,score_gameStat=1] remove allReady

  execute @e[type=area_effect_cloud,name=gameStat,score_gameStat_min=1,score_gameStat=1] ~ ~ ~ function system:StartGame

  接下来我们来慢慢分析。

  首先是开始的条件。有红蓝两队,那么这两队都肯定需要有人,才能够开始,考虑到同一选择器中不能重复使用tag的参数,我们保留了区分队伍的参数,而不是区分是否准备就绪的参数。因此,第一条指令的意思是,当存在选了职业并选红队的玩家以及选了职业并选蓝队的玩家,我们给中心实体加上allReady这个标记,以表明可能满足开始条件。

  至于满足条件吗?如果有未准备就绪的玩家,就说明不满足,那我们就让一个没有准备就绪的玩家来去掉allReady这个标记好了。

  对于3~5行,我们放后面点讲。先看后面。满足开始条件以后,我们会给中心实体加分(使用waitTime这个记分板项),在第一刻加分后出现提示文字提示准备开始,然后进入循环计时,最后计时满了,调用system:startgame这个函数来开始游戏(这里不是例子的部分,不作说明)。

  那么回过头来看3~5行,这里明显是打断的部分。打断,就是要清掉提示文字、重置计时器。如果此时都还没有进行过加分,那么我们就不必进行那三条指令,因此可以看到中间有个选择器里有score_waitTime_min=1的参数加以限制。

  重点来了,我们看到这3条指令前面相当长一串execute是重复的。因为在以前用cb写的时候,这里我使用了Conditional,而现在函数不直接支持Conditional,所以我用了一大堆execute,但是这里我们可以稍作修改,对不对?请看下面

  execute @p[tag=redTeam,score_selectClass_min=1] ~ ~ ~ execute @p[tag=blueTeam,score_selectClass_min=1] ~ ~ ~ scoreboard players tag @e[type=area_effect_cloud,name=gameStat,tag=notGaming] add allReady

  execute @p[tag=!Ready,m=2] ~ ~ ~ scoreboard players tag @e[name=gameStat,type=area_effect_cloud,tag=notGaming] remove allReady

  execute @p[tag=!Ready,m=2] ~ ~ ~ execute @e[name=gameStat,type=area_effect_cloud,tag=notGaming] ~ ~ ~ execute @s[tag=!allReady,score_waitTime_min=1] ~ ~ ~ function system:cond_breakstartcount

  scoreboard players add @e[name=gameStat,tag=allReady] waitTime 1

  execute @e[name=gameStat,score_waitTime=1,score_waitTime_min=1] ~ ~ ~ title @a times 10 140 10

  execute @e[name=gameStat,score_waitTime=1,score_waitTime_min=1] ~ ~ ~ title @a subtitle [{"color":"aqua","text":"请玩家站在准备区域不要离开"}]

  execute @e[name=gameStat,score_waitTime=1,score_waitTime_min=1] ~ ~ ~ title @a title [{"color":"yellow","text":"游戏即将开始"}]

  execute @e[name=gameStat,score_waitTime=40,score_waitTime_min=40] ~ ~ ~ title @a subtitle [{"color":"aqua","text":"3"}]

  execute @e[name=gameStat,score_waitTime=40,score_waitTime_min=40] ~ ~ ~ execute @a ~ ~ ~ playsound block.note.pling voice @p ~ ~ ~ 1 0

  execute @e[name=gameStat,score_waitTime=60,score_waitTime_min=60] ~ ~ ~ title @a subtitle [{"color":"aqua","text":"2"}]

  execute @e[name=gameStat,score_waitTime=60,score_waitTime_min=60] ~ ~ ~ execute @a ~ ~ ~ playsound block.note.pling voice @p ~ ~ ~ 1 0

  execute @e[name=gameStat,score_waitTime=80,score_waitTime_min=80] ~ ~ ~ title @a subtitle [{"color":"aqua","text":"1"}]

  execute @e[name=gameStat,score_waitTime=80,score_waitTime_min=80] ~ ~ ~ execute @a ~ ~ ~ playsound block.note.pling voice @p ~ ~ ~ 1 0

  execute @e[name=gameStat,score_waitTime_min=100] ~ ~ ~ title @a times 10 30 10

  execute @e[name=gameStat,score_waitTime_min=100] ~ ~ ~ title @a title [{"color":"gold","text":"游戏开始"}]

  scoreboard players set @e[name=gameStat,type=area_effect_cloud,score_waitTime_min=100] gameStat 1

  scoreboard players reset @e[name=gameStat,score_gameStat_min=1,score_gameStat=1] waitTime

  scoreboard players tag @e[name=gameStat,score_gameStat_min=1,score_gameStat=1] remove allReady

  execute @e[type=area_effect_cloud,name=gameStat,score_gameStat_min=1,score_gameStat=1] ~ ~ ~ function system:StartGame

  system:cond_breakstartcount.mcfunction

  title @a clear

  title @a reset

  scoreboard players reset @s waitTime

  虽然这个独立出来的子模块只有3条指令,但是如果分离出来的是30条而不是3条呢?能够节省多少功夫想必不需要我解释了吧?

  以上是关于函数系统模块调用的部分,当中有提到使用进度系统来调用部分独立模块,我们接下来来讲这一部分。

  函数系统与进度系统的联动

  advancement,亦简称adv,目前wiki翻译叫进度。这里就不多作介绍了。在17w17b中MOJANG允许进度返回指令作为达成进度的奖励,让不少玩家发现了新大陆。随后在17w18b中,MOJANG进一步完善进度系统,使其可以完全独立于命令方块而建立起一个命令系统;在1.12 pre1中,MOJANG又作出了修改,将进度系统中的命令部分拿出来做成了如今的函数系统。

  但是这并不意味着进度系统就不可以参与到命令系统中来,因为如今的进度系统可以返回函数作为达成进度的奖励。

  相信很多人已经知道进度系统的结构了,但仍有相当一部分朋友还没有了解,在这里我们不妨来温习一下。

  自定义的进度,所有文件都保存在存档目录/data/advancements/下,在这里新建的文件夹同样都称为命名空间,命名空间下存放各种进度文件。进度文件使用 json 格式。这里展示一个用于进度命令系统的例子

  所涉及的两个文件分别是data/advancements/system/HelloTitle.json和data/functions/system/HelloTitle.mcfunction,这里进度和函数都用同样的命名空间和文件名方便记忆和管理,可以看到函数文件是 .mcfunction,而进度文件是 .json

  system:HelloTitle.json

  {

  "criteria":{

  "custom_name":{

  "trigger":"minecraft:tick"

  }

  },

  "rewards":{

  "function":"system:hellotitle"

  }

  }

  system:HelloTitle.mcfunction

  #revoke adv,用于下次再激活

  advancement revoke @s only system:hellotitle

  #命令部分

  scoreboard objectives add helloTitle stat.leaveGame

  scoreboard players tag @s[tag=HelloTitle,score_helloTitle_min=1] remove HelloTitle

  tellraw @s[tag=!HelloTitle] ["",{"text":"Hello ","color":"yellow"},{"selector":"@s"},{"text":"! Welcome to Minecraft!","color":"yellow"}]

  scoreboard players tag @s[tag=!HelloTitle] add HelloTitle

  scoreboard players reset @s[score_helloTitle_min=1] helloTitle

  这个进度会在下一个游戏刻达成,对象是全体在线玩家,达成进度后会执行HelloTitle.mcfunction中的指令。其实现的效果是,当玩家进入这个世界时,会在聊天框看见问候语(其他人看不到)。

  可以看到,相比于以前命令方块高频,这里采用了进度系统的 tick 触发器和@s选择器。如果单纯用命令方块高频或者函数系统,那么只需要这样

  scoreboard objectives add helloTitle stat.leaveGame

  scoreboard players tag @a[tag=HelloTitle,score_helloTitle_min=1] remove HelloTitle

  execute @a[tag=!HelloTitle] ~ ~ ~ tellraw @s ["",{"text":"Hello ","color":"yellow"},{"selector":"@s"},{"text":"! Welcome to Minecraft!","color":"yellow"}]

  scoreboard players tag @a[tag=!HelloTitle] add HelloTitle

  scoreboard players reset @a[score_helloTitle_min=1] helloTitle

  区别就是选择器上的不一样。如果大家觉得进度系统很麻烦,可以不去使用,但是接下来我们会看到一个使用进度系统的其他触发器来调用函数的例子。例如,要让所有冒险模式玩家入水即死。

  rules:DieInWater.json

  {

  "criteria":{

  "1":{

  "trigger":"enter_block",

  "condition":{

  "block":"water"

  }

  }

  },

  "rewards":{

  "function":"rules:dieinwater"

  }

  }

  rules:DieInWater.mcfunction

  #revoke

  advancement revoke @s only rules:dieinwater

  #commands

  scoreboard players tag @p[m=2,r=0] add waterKill

  execute @s[tag=waterKill] ~ ~ ~ tellraw @a [{"selector":"@s"},{"color":"white","text":" 被水淹没了"}]

  execute @s[tag=waterKill] ~ ~ ~ gamerule showDeathMessages false

  kill @s[tag=waterKill]

  execute @s[tag=waterKill] ~ ~ ~ gamerule showDeathMessages true

  scoreboard players tag @s[tag=waterKill] remove waterKill

  当玩家踏入水中时,我们要给玩家加上一个tag,然后杀掉他。至于为什么用@p而不用@s呢?因为@p不能选中死人,而@s可以,如果不想看到聊天框刷屏,就不要选择用@s。

  以上是利用进度系统的 enter_block(玩家进入方块) 这一触发器来实现落水即死功能的,如果单纯依靠函数,不依靠进度系统去实现的话,可以这样写

  rules:DieInWater_FUNCONLY.mcfunction

  execute @a[m=2] ~ ~ ~ detect ~ ~ ~ water -1 scoreboard players tag @p[r=0] add waterKill

  execute @a[tag=waterKill] ~ ~ ~ tellraw @a [{"selector":"@s"},{"color":"white","text":" 被水淹没了"}]

  execute @a[tag=waterKill] ~ ~ ~ gamerule showDeathMessages false

  kill @a[tag=waterKill]

  execute @a[tag=waterKill] ~ ~ ~ gamerule showDeathMessages true

  scoreboard players tag @a[tag=waterKill] remove waterKill

  然后将这个函数扔进主进程中高频执行即可。

  我们讲完了函数系统与进度系统的联动部分。道理而言已经讲完了函数系统的基础使用,那么在最后,我们来聊聊函数系统与命令方块系统的对比吧,看看它们各自的优缺点。

我的世界1.12版函数命令系统教学详解 函数命令系统教程

  函数系统与命令方块的对比

  如果你看上面的看得有点迷糊,那我们来简单讲讲函数系统和命令方块(CB)系统的对比吧,进度作为函数的联动触发形式,就不作过多讲解了。

  前面讲到的三种模块中,对执行顺序无要求的高频模块无论是用函数还是CB都没有什么问题,而那些需要严格保证执行顺序的模块,以前我会将他们全部连在一起,只用一个 RCB(循环型命令方块,即高频CB源)作为“信号源”。

  为什么不划出做成子模块(通常以ICB-脉冲型命令方块起头,后面跟一串CCB -连接型命令方块)调用呢?因为你在当前游戏刻调用了ICB子模块以后,它会等到下一个游戏刻才执行。可不要小看这一个游戏刻的延迟,它往往可能让你的系统出现意外,进而产生各种蜜汁bug。

  而函数系统中,调用的子模块会立即插队执行,从而能够严格保证执行顺序,出错的可能性大大降低了。

  函数系统不能够直接支持Conditional模式,也就是条件激活,而CB是支持的。关于这一点,以我个人的经验,影响是不大的,过去1.8没有

  Conditional不也是这么过来了吗?

  函数系统的主进程使用gamerule gameLoopFunction <命名空间:函数>来挂载,而CB系统的"主进程"使用 RCB 作为高频信号源。

  在过去的版本,通过glf挂载的主进程,其执行者是系统,也就是server。这个设定会产生各种各样的安全隐患,于是在后来的版本中,MOJANG将其执行者改成了glf所挂载的函数(前面也讲到了)。就目前而言,仅仅通过函数系统,就能够实现过去CB能够实现的功能,甚至还有一些是CB难以实现的功能。在这里就不过多讲了,希望对大家有所启发,可以研发各种各样的黑科技出来~

  这里插入讲一点,我想对于地图制作者来讲是绝对的福音。

  mcf系统直接支持样式代码§。

  CB系统的颜色黑科技什么的在这个面前根本不值一提。

  资源占用方面,简单说一下我个人的经验。

  我们花了不到一天的时间把《喋血冰封II》升级到新的命令系统。新系统在资源占用方面明显比之前庞大的CB系统少了很多,流畅度不降反升,这也得益于函数系统更加接近游戏底层。CB系统在方块更新这一方面就输掉了一大截。更何况它需要占地。

  试想一下,如果你的系统足够庞大,出生地可以加载的区域放多CB,你能够记得住吗?你在调试系统的时候,需要花多少时间去找到你要修改的指令呢?

  此外,对于一些不放在出生点的模块,我们还需要考虑到区块加载的问题,相信这也是让许多人头疼的问题吧?

  函数系统显然不需要担心这个,因为它所有的内容都保存在文件里,不具体地出现在游戏世界中,在资源占用方面相比与CB系统而言,是要占优的。

  我们知道,写一个功能可能只要一两天,debug可能要一周。过去CB系统,不依靠编辑器的话,你得手动检查,如果要在中间插入什么指令的话,还得整体移动CB,实际工作效率是十分感人的;借助于编辑器,我们可以通过ooc导入的方式来实现快速修改

  而函数系统呢?你需要改点什么,直接去翻文件改,改完了保存一下,再在游戏里通过/reload指令直接刷新,完事儿了。游戏都不用退出重进。

  但凡地图制作者,知道了这些,都应该会心动的吧。

  讲了这么多,相信大家对新系统也有一定的了解了,说不定已经激动得说不出话来了吧,那么更多内容就请大家自行去体验一下吧。在接下来的更新里,没准还会多出什么意想不到的东西呢!




游戏攻略 游戏攻略 我的世界1.12版函数命令系统教学详解 我的世界函数命令系统教程 我的世界函数命令系统一览 我的世界1.12版函数命令系统教学详解 函数命令系统教程--61





 下载本知识
 猜你喜欢
·《星际争霸2》繁体中文语音超雷演示·传奇4游戏好玩吗 mir4游戏特色内·抖音极速版走路赚钱是真的吗 走路赚钱
·王者荣耀新年限定皮肤 王者荣耀简介·饥荒手游猫尾鞭怎么做 饥荒合辑版猫尾·地下城堡3兑换码2月10日 地下城堡
·江湖悠悠兑换码在哪用 江湖悠悠兑换码·国外战术《星际争霸2》虫族心得汇总·steam怎么永久删除游戏
·不思议的皇冠剧毒博士什么技能 不思议·孤岛惊魂4怎么扔飞刀(孤岛惊魂4怎么·如何领取新年QQ运动红包
·只狼全BOSS+精英怪打法详解 只狼·欧陆风云4君主dlc多少钱 欧陆风云·数码宝贝新世纪最新测试改动 数码宝贝
·吉田直树谈铃木亮太加盟《FF16》:·纪元1800野生水仙任务怎么做 纪元·如何评价游戏伊森卡特的消失
·好听的游戏名字女可爱·英雄联盟无限火力有哪些好用的套路 无·马拉松创作大赛活动什么时候截止 和平
·贪婪洞窟2怎么洗点 洗点洗技能的方法·使命召唤手游svd强度测评 使命召唤·如何下载DNF安装包?
·英雄联盟手游3.0版本上单英雄强度 ·机械迷城配置要求介绍 机械迷城配置要·如何在excel表格里加入公式
·天刀手游菜谱竹笋豆腐汤 竹笋豆腐汤食·摇摆动效怎么制作·pokemmo手游合众大剑鬼配招特性
 热门文章
·皮衣怎么洗·电信号码暂停服务什么意思·石鸡和鹧鸪的区别是什么
·御前夜巡使剧情·泰国ray面膜三层怎么用·怎么做紫薯 紫薯的好吃做法
·电脑怎么安装浏览器 电脑安装浏览器在哪里·蛏子吃多了有什么坏处 多吃蛏子的危害·浪漫血液歌词 浪漫血液歌词及歌曲介绍
·双离合变速箱油可以通用吗?·酷派COOL20Pro屏幕是什么材质,支·东风小康v07s节温器在什么位置?
·不知细叶谁裁出二月春风似剪刀此诗句的意思·董岩磊演过什么电视剧·照片循环播放怎么制作
·冷僻却惊艳的诗词做网名 冷门又惊艳的诗词·oppo全屏手机下面三个键怎么设置 op·古代的帝王为何都如此短命 古代的帝王为为
·浙江学霸表白被拒,当街将女方斩首,被捕时·起步2000转速高伤车吗?起步转速在多少·没网络信号怎么导航 这样操作即可
·寸步不让是成语吗 词语寸步不让什么意思·苏州市公安局关于依法严厉打击故意隐瞒行程·2022年3月30日重庆第38次公租房摇
·魔豆种子怎么种植方法 魔豆种子的种植方法·普通话考试时间 普通话好久考试·杂粮饭怎么煮 杂粮米饭的做法
·化妆品店中店的劣势是什么·如何快速收纳裤子·第五套100元背面的风景
·鳄鱼的眼泪告诉我们什么道理 鳄鱼的眼泪告·手腕带的佩戴方法 手腕带的使用方法·90后女生普遍结婚年龄 90后女生平均结
·大动作!19位院士,调研太原理工·秋葵的营养价值·花盆种植月季花不开花的原因及解决办法?
·油青种翡翠手镯的鉴别·手机卡lte网络是什么意思·阿玛尼权力粉底液干皮可以用吗
·科目二一直在受理中多久才好·文胸钢圈断了怎么办·人真的是越耐寒就越健康吗
·枢密院十号:深度介入!美国要向乌克兰派遣·微信怎么看访客记录苹果·苹果浏览器怎么调黑夜模式
·科目二考试需要注意哪些问题·买手机能开增值税专用发票吗·水中做爱 独享世外桃源性快感
 热门搜索
 相关推荐
梦幻西游手游官网最新版下载_梦幻西游手游攻略大全_玩一玩   【红旗S9】一汽红旗S9报价_红旗S9图片_太平洋汽车   2023款奥迪A6L40 TFSI 豪华动感型 报价_图片_太平洋汽车   这些好看的动漫,你看过吗?   【厚德揽胜】厚德揽胜价格_厚德揽胜报价 - 供应商网   湖南旅游攻略,湖南旅游景点大全   广西桂林旅游景点攻略??|游玩路线??   奔驰glk300怎么设置(奔驰glk300怎么设置时间)_玩车行家_百   蓝奏云软件库app下载_蓝奏云软件库安卓|苹果|最新版app_11   腾讯视频vip - 百度贴吧   女神的超级赘婿林阳(黑夜的瞳)最新章节免费阅读无弹窗-无   修罗武神最新章节_修罗武神全文阅读_笔趣阁   心尖宠小说_时衿_心尖宠全文免费阅读-93小说网   战神狂飙最新章节列表_战神狂飙全文免费阅读_酷匠网)小说_笔趣库   《一念关山》 - 电视剧 - 全集高清手机在线观看 - 承德影视   《绝命反击》动作片在线观看免费完整观看-星空影院   《戏杀》免费观看完整版-高清电影视频在线-天狼影视   海王2:失落的王国科幻电影 在线观看 - 白头鹤影视   《承欢记》央八首播,收视夺冠,杨紫演得好,霸总故事,很是悬浮_电视   美丽新世界漫画在线阅读完整漫画免费阅读「下拉观看」-贺   【正宗川菜菜谱大全_川菜怎么做好吃_家常做法大全】_下厨房   【携程攻略】携程旅游攻略,自助游,自驾游,出游,自由行攻略   美国神婆星座运势官网   我要学会的100道家常菜 _下厨房   《白日梦我》第1集全集免费观看_电视剧在线观看-十品影视   《夜城赋》电视剧高清全集完整版在线观看-迅播影院   脱口秀第3季决赛_视频在线观看-爱奇艺搜索   风车动漫 - 专注动漫的门户网站   新水浒传 - 爱奇艺-在线视频网站-海量正版高清视频在线观看   剧情电视剧大全 - 漫漫看影视剧   ?周深 - Apple Music   本子-本子价格、图片、排行 - 阿里巴巴   单机游戏大全免费-2024单机游戏大全免费推荐 - 逗游网   蕾姆Cosplay 全彩本子合集   杭州西湖风景名胜区管委会   小影看影片_最新小影看影片推荐-QQ阅读   美女热舞 高清_视频在线观看 - 56.com   【屈臣氏招聘】_屈臣氏招聘招聘-猎聘   安卓bt下载器app-超强磁力/孤搜磁力/磁力狗/bt蚂蚁磁力搜   香格里拉旅游攻略-2024香格里拉自助游-周边自驾-游玩攻略-  
 热门推荐
双子女的魅力为什么学不来
冻干粉在水乳前还是后
牛血色是什么色号
烟台旅游什么时间去好 烟台什么时候去旅
金缕梅的功效与作用 金缕梅的功效与作用
2022杭州失业补助金最新政策
短发丸子头怎么扎 短发丸子头的扎法
吃芥末有什么好处壮阳吗 吃芥末的好处
示宽灯什么时候需要打开 示宽灯是什么情
中元节上坟注意些什么 中元节上坟禁忌
美甲钻石的粘法 美甲钻石怎么粘
新鲜无花果怎么洗(新鲜无花果怎么洗才干
总是上火怎么办 总是上火如何处理
用砂锅炖鸡的好处 用砂锅炖鸡的几个好处
奥迪a6l雨刮水壶拆卸步骤 奥迪a6l
pin是什么 什么是pin
十代思域软件安装教程
违章超速扣多少分
白皮书显示:2023年考研形势或将更加
o化学的意义 化学意义o的意思
护肤的顺序 正确的护肤顺序是什么
家里没有阳台怎么养花(家里没有阳光怎么
我的世界1.12版新方块混凝土详解 新
车险理赔流程
科目二考试经验总结 预祝大家能一次通过
椰子鞋面家庭清洗方法 椰子鞋的清洗方法
作明佛母心咒歌词,作明佛母心咒唱颂
丘比沙拉酱吃了会不会胖
家贫无从致书以观的翻译 家贫无从致书以
2022年瓦房店社区工作者报名人数实时
等风来,不如追风去什么意思(等风来,不
2022南昌中小学暑假开学会延迟吗?附
现在科目三是电脑评分还是考官
如何熬出传说中的奶白色鱼汤
教你做一个纸大炮
好看的经典美国电影推荐
长寿花的养殖方法技巧有哪些
佛珠几大材质特点
抖音怎么两个道具一起用
LA MER化妆水有香味吗
蘸水怎么弄好吃
天梭运动户外手表闹钟怎么设置
白头翁的功效与作用
书中自有黄金屋的意思
没有直接血缘关系可以结婚吗
惠普4530s上市时间
怎么勾选认证增值税专用发票
微博如何查看自己评论过的动态
友情链接: 花卉图片 情感故事 网址导航 小说下载 电影下载 音乐下载 百科知识
我的世界1.12版函数命令系统教学详解 函数命令系统教程_游戏攻略
站内所有资源均收集于互联网,其版权属原作者所有。如有问题请及时与我们联系。
[xg-3414 t:147-21392] All Rights Reserved 京ICP备10019856号      手机版