ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MC命令从入门到实战:execute、命令方块、计分板与数据包

MC命令从入门到实战:execute、命令方块、计分板与数据包 很多人第一次接触MC命令是从看别人在一个存档里随手敲了一句/tp p 100 64 100人就瞬移过去了开始的。那一刻的感觉通常是这游戏居然还能这么玩但真正自己上手打开聊天框敲下斜杠屏幕上跳出Unknown command的时候热情往往就凉了半截。这篇东西就是写给这个阶段的你——不管你是刚接触MC命令的新手还是已经会用几条常用指令、但一碰到execute和命令方块就发懵的半吊子玩家都能从里面找到能直接抄走的东西。我会把MC命令从最底层的语法骨架讲起一路讲到目标选择器、条件判断、命令方块、计分板、数据包函数最后给三个能直接落地的小项目。全文只讲Java版和基岩版共通或者需要区分的地方不扯任何和本主题无关的内容。1. 从一条 /tp 说起MC命令的语法骨架到底长什么样1.1 斜杠、空格、参数命令的三段式结构MC命令的语法其实极其规整规整到有点无聊。抛开所有花哨的功能任何一条指令都能拆成三段斜杠加指令名、必填参数、可选参数。以/tp p 100 64 100为例tp是指令名p是传送谁后面三个数字是传送到哪。斜杠本身不是语法的一部分它只是个开关——告诉游戏我接下来敲的是指令不是聊天内容。你在聊天框里必须打斜杠但在命令方块里、在.mcfunction函数文件里斜杠必须去掉写了反而报错。这一点我在早期踩过好几次命令方块里粘贴聊天框的内容一直提示语法错误排查了半小时才发现是多了个斜杠。空格是唯一的分隔符参数之间必须用空格隔开多打几个空格游戏会忽略但少打一个空格就会把两个参数粘成一个直接导致解析失败。指令名和参数在Java版里大小写敏感——/tp是对的/TP会报错而方块名、物品名则统一用小写下划线风格比如diamond_sword、command_block。NBT标签就是那对大括号里的东西又是另一套规则它区分大小写{CustomName:...}写成{customname:...}就不生效。这三套大小写规则混在一起是新手最容易翻车的地方记住一句话就行指令名和坐标随意方块和物品全小写NBT严格照抄。1.2 坐标三种写法绝对、相对、局部别再用错波浪号坐标是MC命令里最基础也最容易搞混的部分。游戏里有三套坐标系写错了结果会差得很离谱。绝对坐标100 64 100直接指定世界坐标X是东西方向东为正Y是高度基岩层大约在Y-64到Y320之间海平面约在Y63Z是南北方向南为正。相对坐标~5 ~ ~-3波浪号代表执行这条命令的那个位置后面跟数字是偏移量。~ ~ ~就是原地不动~ ~1 ~是往上抬一格。这个执行位置很关键——玩家敲命令时是玩家脚下那格命令方块执行时是方块自身的坐标。局部坐标^ ^ ^5这个基于朝向而不是世界方向。第一个^是左第二个是上第三个是前。^ ^ ^5的意思是沿着我面朝的方向往前5格。做导弹、激光、跟随视角的粒子效果时局部坐标是唯一选择。有一个坑我必须单独提醒相对坐标和局部坐标不能混在同一条坐标串里你写^ ^ ~5是无效的。另外相对坐标的数字可以是小数也可以是负数~-0.5完全合法做精确站位的时候很有用。1.3 权限等级与执行位置为什么同一条命令别人能跑你不能同样一条/gamemode creative你在自己单人存档里能用进了某个服务器就提示没权限原因就是权限等级。Java版的权限等级分成0到4级0级是普通玩家只能执行影响自己的指令1级可以绕过出生点保护2级能用命令方块、能执行大部分管理类指令单人存档开启作弊后你就是这个级别3级是多人服务器的管理员级别能踢人、封人、给别人上权限4级是服务器控制台权限最高。所以在单人游戏里用命令第一件事是确认作弊已开启——创建世界时勾选或者对已有的世界在对局域网开放里允许作弊。已经开着的存档如果发现命令不生效去世界设置里把允许作弊打开再重进一次。服务器里则需要管理员给你/op或者你直接改ops.json和server.properties里的相关配置。2. 目标选择器把谁这件事说清楚2.1 六个基础选择器适用场景对照命令里对谁执行这件事全靠目标选择器来指定。基础选择器一共六个用熟了能覆盖八成场景。选择器含义典型用法p最近的玩家给最近的人发东西、传送到最近的人r随机一个玩家抽奖、随机选人a所有玩家全服公告、统一加效果e所有实体处理怪物、掉落物、箭矢s执行者自己在execute as之后指代当前实体n最近的实体1.21后加入需要指定最近非玩家实体时用s特别值得说。它本身几乎不单独使用但在execute as e[typezombie] at s run ...这种结构里s代表当前被遍历到的那只僵尸。这是MC命令从单条指令升级成批量处理的关键后面讲execute时会反复用到。注意a和e的区别不只是玩家和实体a只挑玩家而e默认会把玩家也包含进去。想让e排除玩家得写e[type!player]。2.2 筛选参数type、distance、scores、nbt 逐个拆光靠基础选择器肯定不够。要给10格内的僵尸上效果或者给分数超过100的玩家发奖励就得靠方括号里的筛选参数。常用的几个type按实体类型筛typezombie只挑僵尸type!player排除玩家type#minecraft:raiders可以按标签筛一整类。distance按距离筛distance..10表示10格以内..是区间写法前面省略代表负无穷distance5..15是5到15格之间。scores{}按计分板分数筛scores{points10..}表示 points 这项分数大于等于10。tag按标签筛配合/tag指令给实体打标记是做状态管理最干净的方式。nbt{}按NBT数据筛比如nbt{IsBaby:1b}只挑小僵尸这个参数威力最大但也最容易写错。gamemode按游戏模式筛玩家。name按名字筛玩家ID或者实体的自定义名字。level按经验等级筛。坐标范围筛选还有一组xyz配合dxdydz定义一个长方体区域。这里有个经典陷阱——dx/dy/dz的判定体积是从指定点往正方向延伸且体积偏向负方向半格。很多人写x0,y64,z0,dx10,dy10,dz10以为是0到10的立方体实际判定会往负方向偏。做精确区域检测时我更推荐用distance或者干脆用/execute if block逐格判断。2.3 排序与限量limit、sort 组合出的实用写法当选择器匹配到多个目标时limit和sort决定取几个、按什么顺序取。这两个参数组合出来的写法特别实用a[limit1,sortnearest] 最近的一个玩家等价于p a[limit3,sortrandom] 随机抽3个玩家 e[typeitem,limit1,sortnearest] 最近的一个掉落物 a[scores{points10..},limit5,sortfurthest] 分数达标里最远的5个sort的取值有nearest、furthest、random、arbitrary默认按加载顺序不稳定。做排行榜、抽奖、范围伤害时这组参数能省掉大量判断逻辑。我自己做跑酷地图的时候前三名传送上台就是靠a[scores{time..},limit3,sortarbitrary]配合计分板排序实现的。3. 高频指令分组清单从改天气到发装备3.1 环境与规则类time、weather、gamerule这类指令是搭场景、做地图的基础改动的是整个世界而不是某个玩家。/time set day 设为白天 /time set midnight 设为午夜 /time add 1000 时间前进1000刻 /weather clear 晴天 /weather rain 600 下雨600秒 /weather thunder 雷暴 /gamerule doDaylightCycle false 关闭昼夜循环 /gamerule keepInventory true 死亡不掉落 /gamerule mobGriefing false 阻止怪物破坏方块 /gamerule doMobSpawning false 禁止自然刷怪 /gamerule randomTickSpeed 0 关闭随机刻作物不长、草不蔓延gamerule是地图作者用得最多的一条指令。randomTickSpeed值得单独说默认是3设成0之后作物不生长、树叶不腐烂、火不蔓延性能会明显好转做红石机器或者极限跑酷时经常要关掉。但注意关闭随机刻之后很多依赖它的机制也停了做生存地图时别乱关。3.2 玩家状态类gamemode、effect、experience/gamemode creative p 切换游戏模式 /effect give p speed 30 2 给速度效果30秒等级2放大器2代表III级 /effect give p night_vision 999999 0 true 长时间夜视隐藏粒子 /effect clear p 清空所有效果 /experience add p 100 points 给100点经验 /experience add p 5 levels 给5级经验 /xp 10L p 简写形式给10级药水效果指令里有两个容易搞错的点一是放大器和等级差10是I级1是II级2是III级写2想要I级效果是新手常见误解二是时长单位是秒而不是刻1.13之后改的老教程里写20倍数值的是旧版本抄了会得到超长效果。3.3 物品与方块类give、setblock、fill、clone/give p diamond_sword 1 /give p minecraft:netherite_helmet{Enchantments:[{id:minecraft:protection,lvl:4}]} 1 /setblock ~ ~ ~ stone 在脚下放石头 /setblock ~ ~-1 ~ chest{Items:[{Slot:0b,id:minecraft:diamond,Count:1b}]} replace /fill ~-5 ~-1 ~-5 ~5 ~-1 ~5 stone 填充一片区域 /fill ~ ~ ~ ~10 ~10 ~10 air replace stone 把石头替换成空气 /clone ~-3 ~-3 ~-3 ~3 ~3 ~3 ~10 ~ ~ 复制一片区域到别处/fill有两个关键参数replace模式和replace [要替换的方块]模式。不写就是强制覆盖写了replace stone就只替换石头其他方块原样保留。做地形塑造的时候/fill ... air replace stone能精准掏空石头而不影响周围的土和木头。/clone后面还有masked、filtered、force这几个模式参数。masked只复制非空气方块做建筑迁移的时候能省掉一堆空气格子非常实用。3.4 世界与实体类summon、tp、data/summon zombie ~ ~ ~ {IsBaby:1b,CustomName:{text:小僵尸}} /summon lightning_bolt ~ ~ ~ 召唤闪电 /tp p 0 100 0 传送玩家 /tp e[typeitem] p 把所有掉落物吸到玩家身上 /data get entity p 读取玩家NBT数据 /data merge entity e[typezombie,limit1] {Health:50f} 修改实体数据/summon的NBT部分是最能体现MC命令深度的地方。给召唤出来的生物加装备、改血量、设名字、加标签全靠NBT。{CustomName:{text:小僵尸}}里那对单引号是必须的——外层用单引号包住一个JSON文本组件内层用双引号这样才不会被解析器拆错。这个嵌套引号规则坑过无数人记住外层单引号内层双引号基本能解决九成的报错。4. execute 与条件判断命令真正开始编程的地方4.1 execute 的四段式语法as/at/if/run如果只会用前面那些指令你顶多算个会敲命令的人。真正跨进命令编程这道门的标志是看懂execute。1.13之后execute被彻底重构语法变成链式结构一条命令里可以串好几个子命令最后必须用run收尾/execute 子命令 子命令 ... run 真正的指令最常用的四个子命令as 目标改变执行者也就是s指代谁。但不改变执行位置。at 目标改变执行位置和朝向但不改变执行者。positioned 坐标只改位置。rotated 角度只改朝向。as和at的区别是理解execute的分水岭。举个例子/execute as e[typezombie] run say 我被执行了 /execute at e[typezombie] run summon lightning_bolt ~ ~ ~第一条每只僵尸自己说一句话执行者是僵尸。第二条在每只僵尸的位置召唤闪电但执行者还是你。如果写成as e[typezombie] at s run summon lightning_bolt ~ ~ ~就是以每只僵尸为执行者并且把位置也移到它身上然后原地召唤闪电。s在这里的作用是承接as选出来的那个实体。4.2 if 与 unless 的条件源block、entity、score、dataexecute之所以强是因为它能带条件。if是满足则执行unless是不满足则执行等价于if取反。条件源有好几种/execute if block ~ ~-1 ~ stone run say 脚下是石头 /execute if entity a[distance..10] run say 有人靠近 /execute if score p points matches 10.. run say 分数够10了 /execute if data entity s Inventory run say 背包里有东西 /execute if biome ~ ~ ~ minecraft:desert run say 我在沙漠 /execute if loaded ~ ~ ~ run say 这块区域已加载if score ... matches 10..里的matches支持区间语法10..是大于等于10..10是小于等于105..15是闭区间写单个数字就是精确匹配。这个语法在计分板相关判断里到处都是必须练熟。还有一个组合写法特别常用/execute as a at s if block ~ ~-1 ~ minecraft:emerald_block run give s diamond 1读法是把每个玩家当作执行者把位置移到玩家身上如果玩家脚下是绿宝石块就给他一颗钻石。这就是踩到特定方块给奖励的完整实现逻辑做小游戏地图时几乎天天用。4.3 一个完整例子只在特定条件下给玩家发奖励把前面的东西串起来做一个分数达标且站在特定区域才能领奖的小逻辑。假设已经建好了points计分板目标是让分数达到100的玩家走到坐标为(0,64,0)附近10格内时自动获得一把附魔剑并且扣掉100分/execute as a[scores{points100..}] at s if entity s[distance..10,x0,y64,z0] run give s minecraft:diamond_sword{Enchantments:[{id:minecraft:sharpness,lvl:5}]} 1 /execute as a[scores{points100..}] at s if entity s[distance..10,x0,y64,z0] run scoreboard players remove s points 100这里我把if entity s[...]当作位置判断来用因为s配合x/y/z/distance就是一个位置条件。两条命令分别做发东西和扣分必须分开写因为run后面只能跟一条指令。这也是很多人第一次写execute时的困惑一条execute只能对应一条实际操作要做两件事就写两条。实际部署时把这两条命令放进一个循环命令方块里每刻执行一次就能实现实时检测。记得配合/gamerule调整 tick 频率或者加个冷却计分板防止手速太快重复触发。5. 命令方块与函数让命令自己跑起来5.1 三种命令方块类型的区别与连锁顺序命令方块是MC命令从手动输入走向自动运行的桥梁。它有三种颜色对应三种运行方式方块类型颜色触发方式典型用途脉冲命令方块橙色收到红石信号执行一次按钮触发的单次事件循环命令方块紫色每游戏刻1/20秒执行一次持续检测、计时器连锁命令方块绿色被前一个命令方块指向后执行把多条命令串成一条流水线连锁命令方块的指向是靠放置方向决定的。放置时要站在你想让它等待的那个方块后面对着它放箭头指向的那个方块就是它的前驱。这个方向感很多人第一次摆都会摆反摆完记得按F3看准星朝向或者干脆先放一个、开红石触发测试一下顺序对不对。三个方块都记得设置自动执行或者需要红石。脉冲方块默认需要红石信号连锁方块默认始终执行也就是前驱一跑它就跟着跑。做流水线的时候把第一个脉冲方块接按钮后面的连锁方块全部保持默认红石信号一进来整条链就会在同一个游戏刻内按顺序跑完。5.2 循环命令方块与刻的概念tickMC的游戏循环是每秒20个刻tick也就是每50毫秒一次。循环命令方块默认就是每刻执行这意味着它一秒跑20次。这个频率带来两个后果一是能做出实时的检测效果比如踩到压力板立刻响应二是性能开销会累积——放几十个循环命令方块再配上复杂的选择器帧率会肉眼可见地掉。我在做中型地图的时候踩过这个坑为了做排行榜放了十几个循环命令方块每个都遍历a计算分数结果进游戏就卡成PPT。后来把逻辑改成用一个循环方块调用一条/function再在函数里统一处理帧率立刻回来了。经验是循环命令方块数量尽量控制在个位数复杂逻辑一律走函数。还有个细节是刻的先后顺序。同一刻内多个命令方块的执行顺序是按加载顺序来的不是按坐标或者你摆放的顺序这会导致依赖关系出错。解决方法是用一个主循环方块串起所有链式方块保证执行顺序严格可控。5.3 数据包函数比命令方块更干净的方案数据包datapack是Java版里管理命令逻辑的正规方案本质上就是把.mcfunction文件放在存档里让游戏去读。它的优势很明显可读、可版本管理、可以互相调用、不占用世界里的方块。一个最小可用的数据包结构长这样saves/你的存档/datapacks/mypack/ ├── pack.mcmeta └── data/ └── mypack/ └── function/ └── hello.mcfunctionpack.mcmeta的内容{ pack: { pack_format: 15, description: 我的第一个数据包 } }pack_format的数值必须和你的游戏版本匹配1.20.1 是 15越新的版本数值越大1.21 附近已经到 48 上下。填错了游戏会提示数据包不兼容。具体数值去查对应版本的官方文档或者干脆新建一个世界看看原版数据包用的是哪个数字直接抄。hello.mcfunction里写say 数据包加载成功 give a minecraft:bread 1然后在游戏里执行/reload重载数据包再输入/function mypack:hello就能触发。函数名是命名空间:文件路径的形式子文件夹会体现在路径里比如data/mypack/function/shop/buy.mcfunction对应mypack:shop/buy。注意从 1.20.5 开始函数目录名从functions改成了单数function很多老教程还写着复数形式照着抄会加载不到。写数据包之前先确认自己的版本号这个细节。函数还有个杀手级特性函数里的命令默认以函数调用者的身份和位置执行而且执行过程中不会因为某条命令失败就中断除非你显式加了条件。这意味着你可以把一个复杂的连锁逻辑写进一个文件里比摆一堆命令方块清爽太多。6. 计分板与变量MC里怎么存数据6.1 scoreboard objectives 的三种类型计分板scoreboard是MC命令体系里唯一的变量系统。它的核心概念是记分项objective和分数score每个玩家或实体在每个记分项上都有一个数值。创建记分项的语法/scoreboard objectives add points dummy /scoreboard objectives add deaths deathCount /scoreboard objectives add kills playerKillCount第二个参数是准则criteria决定这个分数怎么涨dummy手动控制的只能靠命令加减最灵活用于自定义玩法。deathCount玩家死亡自动加1。playerKillCount击杀玩家自动加1。totalKillCount击杀任何生物都加1。health、food、air、armor、level、xp直接读取玩家的对应属性只读不能手动设。想把记分项显示在屏幕右侧/scoreboard objectives setdisplay sidebar points /scoreboard objectives setdisplay list pointssidebar是右侧排行榜list是Tab列表里的黄字belowName显示在玩家名字下方这些是地图里最常用的展示位置。6.2 常用 operation 运算分数本身可以参与运算这是做逻辑判断的基础/scoreboard players set p points 0 设为0 /scoreboard players add p points 10 加10 /scoreboard players remove p points 5 减5 /scoreboard players operation p points p bonus 把bonus加到points上 /scoreboard players operation p points * p multiplier 乘以倍率 /scoreboard players operation p points p other 交换两个分数 /scoreboard players operation p points p other 取两者较小值operation的语法是目标 运算符 来源运算结果写回目标。这一组运算符里交换和、取小取大是很多人不知道但极其好用的。做血量同步、属性限制的时候能一行搞定不超过上限的逻辑。有个必须注意的点计分板里的分数是整数没有小数。要做精确到0.1秒的计时得用分数存毫秒值显示时除以10的方式处理。这个坑我在做跑酷计时的时候踩得很深一开始直接存秒数结果所有人成绩都是整数秒完全没有区分度。6.3 用计分板做计数器与状态标记计分板最经典的用法是冷却计时器。思路很简单用循环命令方块每刻给某个记分项减1减到0就可以再次触发。/scoreboard objectives add cooldown dummy /scoreboard players set p cooldown 100 触发时设为100刻5秒 /execute as a[scores{cooldown1..}] run scoreboard players remove s cooldown 1 循环减 /execute as a[scores{cooldown1}] run say 冷却结束这套设初值—循环递减—到0触发的模式是所有冷却、计时、状态持续时间逻辑的通用骨架。做技能、传送冷却、任务倒计时全都是这个套路换皮。另一种用法是状态标记。比如玩家是否完成了某个任务用一个task1记分项0是未完成1是已完成配合if score p task1 matches 1做条件判断。相比用标签/tag计分板能存数值、能排序、能展示相比NBT计分板操作简单、性能好。我一般的原则是纯状态用标签需要数值或展示用计分板。7. 踩坑清单这些报错我基本都遇到过7.1 Unknown command 的几种真实原因这个报错几乎是所有人的入门第一课但它背后的原因远比想象的多报错场景真实原因解决方式单人存档敲命令没反应作弊未开启世界设置里打开允许作弊指令名拼写正确但报错大小写写错了指令名全小写在命令方块里粘贴聊天框内容多了斜杠删掉开头的/服务器里报错权限等级不够让管理员给 op版本升级后老命令失效语法在1.13后大改查新版本对应语法中文输入法状态敲命令标点是全角切到英文输入法最后一条特别隐蔽。中文输入法下的逗号、括号都是全角字符看起来一样但游戏解析不了。写NBT和JSON的时候我强烈建议先在记事本里写好再粘贴避免输入法捣乱。7.2 NBT 语法大小写与引号NBT是MC命令里最容易写错的部分错误类型基本固定几种类型后缀漏了Health:50不行得写Health:50ff代表浮点Count:1bb代表字节IsBaby:1b。整数后缀还有sshort、llong。字符串引号搞错CustomName:名字在某些位置是错的文本组件需要用 JSON 格式标准写法是CustomName:{text:名字}外层单引号内层双引号。该加minecraft:命名空间没加id:diamond在新版本里建议写成id:minecraft:diamond不加虽然有时也能识别但会有警告。列表格式写错Enchantments:[{id:...,lvl:4}]里那对大括号和小括号缺一不可每条附魔是一个独立的对象。我个人的习惯是每次写完NBT先执行/data get验证一次确认数据真的挂上去了再往下写。直接写完一长串命令方块然后发现不生效回头定位是哪一层引号错了会非常痛苦。7.3 Java版与基岩版的语法差异对照这是另一个高频踩坑区。很多人看的教程是Java版的自己玩的却是基岩版手机、主机、Windows商店版照着抄必然失败。功能Java版基岩版游戏模式切换/gamemode creative p语法类似但参数顺序更宽松药水效果/effect give p speed 30 2旧版是/effect p speed 30 2目标选择器限量limit3c3execute1.13后链式结构1.19.80后才引入新语法老版本完全不同NBT支持完整NBT大部分指令不支持NBT数据包支持不支持用行为包差异最大的是execute。基岩版长期用的是/execute 目标 坐标 指令的老结构直到1.19.80才跟上Java版的新语法。如果你在基岩版里写execute as a at s run报错先确认版本号低于1.19.80就只能用老语法。8. 从玩具到作品三个可以直接抄的实战小项目8.1 一键回城传送点目标玩家在任意位置执行/trigger home传送回预设的家。这个项目能一次性练熟触发式计分板、函数调用和坐标存储。/scoreboard objectives add home trigger /scoreboard players enable a hometrigger类型的记分项有个特殊之处玩家自己可以用/trigger改名但只能通过/scoreboard players enable授权后才能用而且用完会自动重置。然后在循环命令方块里挂一条/execute as a[scores{home1..}] at s run tp s 100 65 100 /execute as a[scores{home1..}] run scoreboard players set s home 0想给多个家升级就加多个触发项home2、home3每个对应不同坐标。这个方案的妙处在于完全不需要玩家有权限普通玩家也能用/trigger触发自定义功能是多人服务器的标准做法。8.2 简易商店/兑换系统目标玩家打怪获得金币计分板走到商店方块前用金币换物品。先建金币记分项并绑定击杀/scoreboard objectives add gold dummy /execute as a run scoreboard players add s gold 0用一个循环命令方块做检测玩家站在指定方块比如一个金块上方且金币够10就扣10金币给他一个苹果/execute as a at s if block ~ ~-1 ~ minecraft:gold_block if score s gold matches 10.. run give s minecraft:apple 1 /execute as a at s if block ~ ~-1 ~ minecraft:gold_block if score s gold matches 10.. run scoreboard players remove s gold 10注意顺序先给物品再扣金币。如果反过来扣完金币后分数可能不满足10..条件第二条第if score判断就失败了物品发不出去。这个执行顺序问题是做商店系统时最容易忽略的细节。8.3 跑酷计时与排行榜目标玩家踩到起点方块开始计时踩到终点方块结束记录用时并排名。/scoreboard objectives add timer dummy /scoreboard objectives add best dummy /scoreboard objectives setdisplay sidebar timer起点检测循环命令方块/execute as a at s if block ~ ~-1 ~ minecraft:redstone_block run scoreboard players set s timer 0 /execute as a at s unless block ~ ~-1 ~ minecraft:redstone_block run scoreboard players add s timer 1逻辑是站在起点红石块上时计时器每刻被重置为0一旦离开起点计时器开始累加。到终点时用运算符比较并更新最佳成绩/execute as a at s if block ~ ~-1 ~ minecraft:emerald_block run scoreboard players operation s best s timer注意这里是反的——因为计时器数值越小越好所以最佳成绩取两者的较小值需要用而不是/execute as a at s if block ~ ~-1 ~ minecraft:emerald_block run scoreboard players operation s best s timer跑酷计时里数值越小越好所有比较运算的方向都要反过来这一点我在第一次做的时候全写反了排行榜显示的是最慢记录调了半天才发现。我个人在做这类计时系统的时候还有个心得计时器每刻加120刻等于1秒直接显示会有4位数很难看。解决办法是用/scoreboard players operation做一次除法把刻数除以20或者干脆在展示界面用title显示你用了 X 秒在命令里做一次换算。整数除法的精度损失是无可避免的只要比赛规则接受秒级精度就没问题要精确到0.1秒就得存毫秒值再手动插入小数点代价是显示和排名的逻辑都要跟着改。这中间的取舍取决于你的地图到底想精确到什么程度。
返回列表