时装制作简明教程:修订间差异
更多操作
小 添加视频:在游戏内导入模型并查看效果 |
小无编辑摘要 |
||
| (未显示2个用户的19个中间版本) | |||
| 第29行: | 第29行: | ||
== 3.调整模型后再次导入 == | == 3.调整模型后再次导入 == | ||
刚刚导入的方块过于小了,假设我们想做一个正常大小的方块,此时就需要返回blockbench中进行调整,此处不对blockbench的基础操作进行教学,想要学习可以参考b站视频教程,可以视为mc与blockbench中采用同一个单位,mc的默认资源包中,方块纹理默认尺寸是16x16,因此我们将模型放大至16x16x16,再次导入,即可得到一个与原版方块相同大小的时装方块,此时选择保存项目,进入游戏中导入,放置下来看看,严丝合缝! | 刚刚导入的方块过于小了,假设我们想做一个正常大小的方块,此时就需要返回blockbench中进行调整,此处不对blockbench的基础操作进行教学,想要学习可以参考b站视频教程,可以视为mc与blockbench中采用同一个单位,mc的默认资源包中,方块纹理默认尺寸是16x16,因此我们将模型放大至16x16x16,再次导入,即可得到一个与原版方块相同大小的时装方块,此时选择保存项目,进入游戏中导入,放置下来看看,严丝合缝! | ||
[[文件:调整模型后再次导入.gif|居中|1000x1000像素]] | |||
[ | |||
= '''具体时装制作实例''' = | = '''具体时装制作实例''' = | ||
| 第44行: | 第43行: | ||
因为要制作一个头饰,为了对齐人物头部,编者建议在刚刚的 <u>高级时装部件对照-原版皮肤.bbmodel</u> 的基础上进行修改,这个模型和游戏内的模特是完全对齐的,当你制作通用类的时装时,都可以基于此模型进行制作以达到完美对齐的效果,而无需在游戏内进行调整。 | 因为要制作一个头饰,为了对齐人物头部,编者建议在刚刚的 <u>高级时装部件对照-原版皮肤.bbmodel</u> 的基础上进行修改,这个模型和游戏内的模特是完全对齐的,当你制作通用类的时装时,都可以基于此模型进行制作以达到完美对齐的效果,而无需在游戏内进行调整。 | ||
在创建第一个方块之前,因为我们需要制作的时装类型是头饰,所以先点开名为Head的分组,再在内部创建所有的方块和组。这样制作完成的模型就会跟随角色头部运动。 | |||
[[文件:创建方块.gif|居中]] | |||
对于需要设置动画的部位,我们需要进行单独分组。以我们的年猪为例,我们会希望有一个头部晃动的动画,因此头部要有一个专门的分组,命名好Pighead,目的是清晰便于理解。身体和四肢我们就不做动画了,可以分为一个组,也可以干脆不分组,只要不做动画,一个组都没有也是可以的,但当你开始制作更加复杂的模型时,一大堆块混在一起会把你搞疯的,因此还是建议清晰的分开。 | |||
[[文件:Model.gif|居中]] | |||
在一通添加、缩放、移动、旋转块之后,你成功得到了一个小猪模型!别忘了把对齐用到的人物模型删除,我们的时装只有这个头饰! | 在一通添加、缩放、移动、旋转块之后,你成功得到了一个小猪模型!别忘了把对齐用到的人物模型删除,我们的时装只有这个头饰! | ||
[ | [[文件:Delete.gif]] | ||
== 2.上色 == | == 2.上色 == | ||
| 第55行: | 第58行: | ||
创建好纹理后,接下来开始上色,点击右上角的绘画模式,此时编辑工具会发生变化,可以使用画笔、油漆桶、渐变工具等进行上色,选中一个块,按 i 可以暂时隐藏其他块,让你聚焦选中块的上色,熟悉基本操作后,这一步骤考验的是你的绘画能力。 | 创建好纹理后,接下来开始上色,点击右上角的绘画模式,此时编辑工具会发生变化,可以使用画笔、油漆桶、渐变工具等进行上色,选中一个块,按 i 可以暂时隐藏其他块,让你聚焦选中块的上色,熟悉基本操作后,这一步骤考验的是你的绘画能力。 | ||
感觉上色困难?我们还编写了一篇[[时装工坊相关简要调色教程|上色教程]] | 感觉上色困难?我们还编写了一篇[[时装工坊相关简要调色教程|上色教程]],详细介绍了色彩理论,帮助你更好的学习上色。下面的视频也演示了一些基本的上色流程。 | ||
[ | [[文件:上色.gif|居中]] | ||
== 3.动画制作 == | == 3.动画制作 == | ||
| 第65行: | 第68行: | ||
接下来选中parallel0,表示编辑此动画,点击head节点,表示给head添加动画,此时下方会出现head的时间轴,我们来到第0帧,点击“旋转”旁的 + ,就成功添加了一个关键帧,表示在第0帧时,head的旋转姿态应该是当前这样,接下来拖动时间条来到第1秒(或者任意时间),再次单击“旋转”旁的 + ,但是这时候我们要调整一下head的旋转,这里随意调整,只需要知道这样做是表示第1秒时,head会旋转成这个样子,这样就添加了一个简单的动画了!单击空格播放动画检查一下,你会看到head在循环这个旋转动画,但此时的动画比较生硬,因此我们要多加几个关键帧,让head达到来回摆动的效果,因此再添加一个复位的关键帧,以及朝另一个方向摆动的关键帧,最后再复位一次,这样来回摆动的动画就完全做好了! | 接下来选中parallel0,表示编辑此动画,点击head节点,表示给head添加动画,此时下方会出现head的时间轴,我们来到第0帧,点击“旋转”旁的 + ,就成功添加了一个关键帧,表示在第0帧时,head的旋转姿态应该是当前这样,接下来拖动时间条来到第1秒(或者任意时间),再次单击“旋转”旁的 + ,但是这时候我们要调整一下head的旋转,这里随意调整,只需要知道这样做是表示第1秒时,head会旋转成这个样子,这样就添加了一个简单的动画了!单击空格播放动画检查一下,你会看到head在循环这个旋转动画,但此时的动画比较生硬,因此我们要多加几个关键帧,让head达到来回摆动的效果,因此再添加一个复位的关键帧,以及朝另一个方向摆动的关键帧,最后再复位一次,这样来回摆动的动画就完全做好了! | ||
[[文件:制作动画.gif|居中]] | |||
最后按照第一章的操作,把模型导入游戏,记住,你需要选择合适的部位,在这里我们选择头部,导入模型并导出到物品栏,ctrl+p打开时装栏或者直接右键,开启第三人称欣赏你的成品吧! | 最后按照第一章的操作,把模型导入游戏,记住,你需要选择合适的部位,在这里我们选择头部,导入模型并导出到物品栏,ctrl+p打开时装栏或者直接右键,开启第三人称欣赏你的成品吧! | ||
= '''常用技巧''' = | = '''常用技巧''' = | ||
=== 1.如何制作跟随视角旋转的时装?——nvgaovO === | === 1.如何制作跟随视角旋转的时装?——nvgaovO === | ||
还在写! 也许可以催催nvgao? | |||
=== 2.如何让你手中的物品出现在时装上?——nvgaovO === | === 2.如何让你手中的物品出现在时装上?——nvgaovO === | ||
还在写! 也许可以催催nvgao? | |||
=== 3.如何给时装添加音效?——nvgaovO === | === 3.如何给时装添加音效?——nvgaovO === | ||
还在写! 也许可以催催nvgao? | |||
=== 4. | === 4.如何创建发光 / 镜面的材质? ——nvgaovO === | ||
还在写! 也许可以催催nvgao? | |||
= '''常用资料''' = | = '''常用资料''' = | ||
== 动画类型及效果对应 == | == 动画类型及效果对应 == | ||
{| class="wikitable" | {| class="wikitable mw-collapsible" | ||
!动画名称 | !动画名称 | ||
!动画效果 | !动画效果 | ||
| 第94行: | 第96行: | ||
|idle | |idle | ||
|无其他动画播放时播放的动画 | |无其他动画播放时播放的动画 | ||
|适用于待机动画 | |适用于待机动画 | ||
会被其他动画打断,无论是否有帧冲突 | |||
(如左/右键动画) | |||
|- | |- | ||
|parallel0 | |parallel0 | ||
|'''强覆盖'''播放的动画 | |'''强覆盖'''播放的动画 | ||
|适用于一些默认的动画,比如齿轮旋转 | |||
一直播放不会被任何动画打断 | 一直播放不会被任何动画打断 | ||
如果有冲突,也会导致其他动画无法正常播放 | 如果有冲突,也会导致其他动画无法正常播放 | ||
|- | |- | ||
|pre_parallel0-9 | |pre_parallel0-9 | ||
|'''弱覆盖'''播放的动画 | |'''弱覆盖'''播放的动画 | ||
|适用于默认动画在某些情况需要有所变化的情况,比如一直旋转的齿轮突然加速 | |||
如果他的关键帧没有和别的动画冲突,则正常播放 | 如果他的关键帧没有和别的动画冲突,则正常播放 | ||
如果冲突,则会被打断 | 如果冲突,则会被打断 | ||
|- | |- | ||
|rightclick | |rightclick | ||
|右键时触发 | |右键时触发 | ||
|时装工坊并不支持,这是FST通过kjs脚本执行的动画播放 | |时装工坊并不支持,这是FST通过kjs脚本执行的动画播放 | ||
无法执行停下操作播放idle动画 | 无法执行停下操作播放idle动画<br> | ||
当你右键后使用了物品(如扳手右键旋转方块),动画不会播放 | 当你右键后使用了物品(如扳手右键旋转方块),动画不会播放<br> | ||
只有当右键后,物品本身也没有发挥作用时(如扳手右键空气或其他方块)才会播放 | 只有当右键后,物品本身也没有发挥作用时(如扳手右键空气或其他方块)才会播放<br> | ||
当前有一点小bug,当你使用别的物品右键后再切换至有右键动画的物品,则动画也会播放 | 当前有一点小bug,当你使用别的物品右键后再切换至有右键动画的物品,则动画也会播放 | ||
|- | |- | ||
| 第120行: | 第123行: | ||
|左键时触发 | |左键时触发 | ||
|时装工坊并不支持,这是FST通过kjs脚本执行的动画播放 | |时装工坊并不支持,这是FST通过kjs脚本执行的动画播放 | ||
无法执行停下操作播放idle动画,此动画无法覆盖第一/第三人称手臂挥舞的动画。 | 无法执行停下操作播放idle动画,此动画无法覆盖第一/第三人称手臂挥舞的动画。<br> | ||
当前有一点小bug,当你使用别的物品左键后再切换至有左键动画的物品,则动画也会播放 | 当前有一点小bug,当你使用别的物品左键后再切换至有左键动画的物品,则动画也会播放 | ||
|- | |- | ||
|walk | |walk | ||
| | |行走 | ||
| | |在地面移动时触发 | ||
|- | |- | ||
|run | |run | ||
| | |疾跑 | ||
| | |在地面疾跑(移动+疾跑状态)时触发 | ||
|- | |- | ||
|jump | |jump | ||
| | |跳跃 | ||
| | |在空中(不接触地面)时触发 | ||
|- | |- | ||
|sneak | |sneak | ||
|潜行待机 | |||
|潜行(下蹲)静止时触发 | |潜行(下蹲)静止时触发 | ||
|- | |- | ||
|sneak_walk | |sneak_walk | ||
| | |潜行行走 | ||
| | |潜行(下蹲)移动时触发 | ||
|- | |- | ||
|swim | |swim | ||
| | |游泳待机 | ||
| | |在水中静止时触发 | ||
|- | |- | ||
|swim_walk | |swim_walk | ||
| | |游泳移动 | ||
| | |在水中移动时触发 | ||
|- | |- | ||
|fly | |fly | ||
| | |飞行待机 | ||
| | |创造模式飞行静止时触发 | ||
|- | |- | ||
|fly_walk | |fly_walk | ||
| | |飞行移动 | ||
| | |创造模式飞行移动时触发 | ||
|- | |- | ||
|fall_fly | |fall_fly | ||
| | |鞘翅飞行 | ||
|/ | |使用鞘翅滑翔/飞行时触发 | ||
|- | |- | ||
|ride | |ride | ||
| | |骑乘待机 | ||
| | |骑乘普通实体(如猪、马、矿车)静止时触发 | ||
按键坐下无法触发此动画 | |||
|- | |||
|ride_walk | |||
|骑乘移动 | |||
|骑乘普通实体移动时触发 | |||
|- | |- | ||
|boat | |boat | ||
| | |坐船待机 | ||
| | |乘坐船只静止时触发 | ||
|- | |||
|boat_walk | |||
|坐船移动 | |||
|乘坐船只移动时触发 | |||
|- | |- | ||
|crawl | |crawl | ||
| | |爬行待机 | ||
|/ | |趴下/匍匐(如在1格高空间)静止时触发 | ||
|- | |- | ||
|crawl_walk | |crawl_walk | ||
|爬行移动 | |||
|趴下/匍匐移动时触发 | |趴下/匍匐移动时触发 | ||
|- | |- | ||
|climb | |climb | ||
| | |攀爬待机 | ||
|/ | |在梯子/藤蔓上静止时触发 | ||
|- | |||
|climb_walk | |||
|攀爬移动 | |||
|在梯子/藤蔓上移动时触发 | |||
|} | |} | ||
== 所有可用查询query、函数及用法示例 == | ==所有可用查询query、函数及用法示例== | ||
=== 一、变量绑定(Variables) === | ===一、变量绑定(Variables)=== | ||
* 所有 “判断是否是xxxx ” 的query,若是则返回1,反之返回0。 | *所有 “判断是否是xxxx ” 的query,若是则返回1,反之返回0。 | ||
* 特殊注意,涉及x、y相关的query,blockbench和mc中xy是相反的,请将x绑定在y上,y绑定在x上。 | *特殊注意,涉及x、y相关的query,blockbench和mc中xy是相反的,请将x绑定在y上,y绑定在x上。 | ||
{| class="wikitable" | {| class="wikitable mw-collapsible" | ||
!query 名 | !query 名 | ||
!含义 | !含义 | ||
| 第197行: | 第213行: | ||
!测试情况 | !测试情况 | ||
|- | |- | ||
| | | colspan="4" | | ||
===== 上下文变量 ===== | =====上下文变量 ===== | ||
|- | |- | ||
|<code>anim_time</code> | |<code>anim_time</code> | ||
|动画时间 | |动画时间 | ||
| | |获取当前动画播放的时间进度(秒),用于同步动画与逻辑 | ||
|✅ | |✅ | ||
|- | |- | ||
|<code>life_time</code> | |<code>life_time</code> | ||
|生命周期时间 | |生命周期时间 | ||
| | |获取实体存在的总时间(Tick/20 -> 秒),用于循环动画或时效判断 | ||
|✅ | |✅ | ||
|- | |- | ||
|<code>actor_count</code> | |<code>actor_count</code> | ||
|实体数量 | |实体数量 | ||
| | |获取当前渲染上下文中的实体总数(通常用于性能优化或群体检测) | ||
| | | | ||
|- | |- | ||
|<code>is_first_person</code> | |<code>is_first_person</code> | ||
| | |是否第一人称 | ||
| | |判断当前渲染是否在第一人称视角下。1=是,0=否 | ||
| | | | ||
|- | |- | ||
| | | colspan="4" | | ||
===== 世界变量 ===== | =====世界变量===== | ||
|- | |- | ||
|<code>time_of_day</code> | |<code>time_of_day</code> | ||
|游戏天数 | |游戏天数 | ||
| | |获取游戏世界的时间(0-1之间,代表一天中的进度,或具体的天数,视实现而定) | ||
| | | | ||
|- | |- | ||
|<code>time_stamp</code> | |<code>time_stamp</code> | ||
|时间戳 | |时间戳 | ||
| | |获取当前世界的总时间戳(Tick数) | ||
| | | | ||
|- | |- | ||
|<code>moon_phase</code> | |<code>moon_phase</code> | ||
|月相 | |月相 | ||
| | |获取当前月相(0-7的整数,代表不同月相) | ||
| | | | ||
|- | |- | ||
| colspan="4" | | |||
=====实体基础变量===== | |||
|- | |||
|<code>eye_target_x_rotation</code> | |||
|眼睛目标旋转X | |||
|获取实体视线绕 X 轴 的旋转角度,即 俯仰角 (Pitch) | |||
当实体 抬头或低头 时,这个值会改变<br> | |||
通常为 -90.0 (垂直向上看) 到 90.0 (垂直向下看)<br> | |||
永远指向玩家看着的方向 适用于制作比如眼球、自动炮塔 | |||
| | | | ||
|- | |||
| | |<code>eye_target_y_rotation</code> | ||
| | |眼睛目标旋转Y | ||
|获取实体视线绕 Y 轴 的旋转角度,即 偏航角 (Yaw) | |||
当实体 向左或向右转头/转身 时,这个值会改变<br> | |||
通常为 -180.0 到 180.0 (或 0-360),代表具体的罗盘方位<br> | |||
永远指向玩家看着的方向 适用于制作比如眼球、自动炮塔 | |||
| | | | ||
|- | |- | ||
|<code> | |<code>head_x_rotation</code> | ||
<code> | |头部旋转X | ||
| | |头转过的角度减去身体转过的角度 | ||
用于制作人物头部模型 像原版一样随身体转动而受限(例如身体不动时,头只能转 90 度)<br> | |||
注意 head_x 控制的是左右转头 与<code>eye_target...</code>相反 | |||
|✅ | |||
|- | |- | ||
|<code> | |<code>head_y_rotation</code> | ||
|头部旋转Y | |||
|获取头部的Y轴旋转角度(Pitch) | |||
用于制作人物头部模型 像原版一样随身体转动而受限(例如身体不动时,头只能转 90 度)<br> | |||
注意 head_y 控制的是上下点头 与<code>eye_target...</code>相反 | |||
|✅ | |✅ | ||
|- | |- | ||
|<code>yaw_speed</code> | |<code>yaw_speed</code> | ||
|偏航速度 | |偏航速度 | ||
| | |获取实体转身的速度(Y轴旋转变化率) | ||
| | | | ||
|- | |- | ||
|<code>ground_speed</code> | |<code>ground_speed</code> | ||
|地面速度 | |地面速度 | ||
| | |获取实体在地面移动的速度 | ||
| | | | ||
|- | |- | ||
|<code>vertical_speed</code> | |<code>vertical_speed</code> | ||
|垂直速度 | |垂直速度 | ||
| | |获取实体垂直移动的速度(如跳跃或坠落) | ||
| | | | ||
|- | |- | ||
|<code>cardinal_facing_2d</code> | |<code>cardinal_facing_2d</code> | ||
|2D | |2D 朝向 | ||
| | |获取实体的朝向(0-3,代表南/西/北/东等方向) | ||
| | | | ||
|- | |- | ||
|<code>distance_from_camera</code> | |<code>distance_from_camera</code> | ||
|与相机距离 | |与相机距离 | ||
| | |获取实体距离渲染相机的距离 | ||
| | | | ||
|- | |- | ||
|<code>modified_distance_moved</code> | |<code>modified_distance_moved</code> | ||
|移动距离 | |移动距离 | ||
| | |获取实体移动的总距离(修正值) | ||
| | | | ||
|- | |- | ||
|<code>walk_distance</code> | |<code>walk_distance</code> | ||
|行走距离 | |行走距离 | ||
| | |获取实体行走的距离(通常用于计算步幅动画) | ||
| | | | ||
|- | |- | ||
| | | colspan="4" | | ||
===== 实体状态变量 ===== | =====实体状态变量===== | ||
|- | |- | ||
|<code>has_rider</code> | |<code>has_rider</code> | ||
|是否有骑乘者 | |是否有骑乘者 | ||
| | |判断当前实体是否被其他实体骑乘。1=是,0=否 | ||
| | | | ||
|- | |- | ||
|<code>is_in_water</code> | |<code>is_in_water</code> | ||
|是否在水中 | |是否在水中 | ||
| | |判断实体是否在水中。1=是,0=否 | ||
| | | | ||
|- | |- | ||
|<code>is_in_water_or_rain</code> | |<code>is_in_water_or_rain</code> | ||
|是否在水 / | |是否在水/雨中 | ||
| | |判断实体是否在水中、雨中或气泡柱中。1=是,0=否 | ||
| | | | ||
|- | |- | ||
|<code>is_on_fire</code> | |<code>is_on_fire</code> | ||
|是否着火 | |是否着火 | ||
| | |判断实体是否燃烧。1=是,0=否 | ||
| | | | ||
|- | |- | ||
|<code>is_on_ground</code> | |<code>is_on_ground</code> | ||
|是否在地面 | |是否在地面 | ||
| | |判断实体是否接触地面。1=是,0=否 | ||
| | | | ||
|- | |- | ||
|<code>is_riding</code> | |<code>is_riding</code> | ||
| | |是否骑乘中 | ||
| | |判断实体是否正在骑乘其他实体(如矿车、马)。1=是,0=否 | ||
| | | | ||
|- | |- | ||
|<code>is_sneaking</code> | |<code>is_sneaking</code> | ||
|是否潜行 | |是否潜行 | ||
| | |判断实体是否处于潜行状态。1=是,0=否 | ||
|✅ | |✅ | ||
|- | |- | ||
|<code>is_jumping</code> | |<code>is_jumping</code> | ||
|是否跳跃 | |是否跳跃 | ||
| | |判断实体是否处于跳跃状态(离地)。1=是,0=否 | ||
| | | | ||
|- | |- | ||
|<code>is_spectator</code> | |<code>is_spectator</code> | ||
| | |是否旁观模式 | ||
| | |判断实体是否处于旁观模式。1=是,0=否 | ||
| | | | ||
|- | |- | ||
|<code>is_sprinting</code> | |<code>is_sprinting</code> | ||
|是否疾跑 | |是否疾跑 | ||
| | |判断实体是否处于疾跑状态。1=是,0=否 | ||
| | | | ||
|- | |- | ||
|<code>is_swimming</code> | |<code>is_swimming</code> | ||
|是否游泳 | |是否游泳 | ||
| | |判断实体是否处于游泳动作状态(通常指在深水中水平游动)。1=是,0=否 | ||
| | | | ||
|- | |- | ||
| | | colspan="4" | | ||
====== | ======生物实体变量====== | ||
| | |- | ||
| | |<code>body_x_rotation</code> | ||
| | |身体旋转X | ||
|获取身体的X轴旋转角度(Yaw) | |||
|✅ | |||
|- | |- | ||
| | |<code>body_y_rotation</code> | ||
| | |身体旋转Y | ||
| | |获取身体的Y轴旋转角度(Pitch) | ||
|✅ | |✅ | ||
|- | |- | ||
|<code>health</code> | |<code>health</code> | ||
|生命值 | |生命值 | ||
| | |获取当前生命值 | ||
| | | | ||
|- | |- | ||
|<code>max_health</code> | |<code>max_health</code> | ||
|最大生命值 | |最大生命值 | ||
| | |获取最大生命值 | ||
| | | | ||
|- | |- | ||
|<code>hurt_time</code> | |<code>hurt_time</code> | ||
|受伤时间 | |受伤时间 | ||
| | |获取受伤后的无敌时间/变红时间 | ||
| | | | ||
|- | |- | ||
|<code>is_playing_dead</code> | |<code>is_playing_dead</code> | ||
|是否装死 / 濒死 | |是否装死/濒死 | ||
| | |判断实体是否死亡或装死。1=是,0=否 | ||
| | | | ||
|- | |- | ||
|<code>is_eating</code> | |<code>is_eating</code> | ||
|是否进食 | |是否进食 | ||
| | |判断实体是否正在吃东西/喝药水。1=是,0=否 | ||
| | | | ||
|- | |- | ||
|<code>is_sleeping</code> | |<code>is_sleeping</code> | ||
|是否睡觉 | |是否睡觉 | ||
| | |判断实体是否在睡觉。1=是,0=否 | ||
| | | | ||
|- | |- | ||
|<code>is_using_item</code> | |<code>is_using_item</code> | ||
|是否使用物品 | |是否使用物品 | ||
| | |判断实体是否正在使用物品(如拉弓、格挡)。1=是,0=否 | ||
| | | | ||
|- | |- | ||
|<code>item_in_use_duration</code> | |<code>item_in_use_duration</code> | ||
| | |物品使用时长 | ||
| | | 获取物品已经使用的时长(Tick) | ||
| | | | ||
|- | |- | ||
|<code>item_max_use_duration</code> | |<code>item_max_use_duration</code> | ||
| | |物品最大使用时长 | ||
| | |获取物品最大可使用时长(Tick) | ||
| | | | ||
|- | |- | ||
|<code>item_remaining_use_duration</code> | |<code>item_remaining_use_duration</code> | ||
| | |物品剩余使用时长 | ||
| | |获取物品剩余使用时长(Tick) | ||
| | | | ||
|- | |- | ||
|<code>equipment_count</code> | |<code>equipment_count</code> | ||
|装备数量 | |装备数量 | ||
| | |获取实体装备的物品数量 | ||
| | | | ||
|- | |- | ||
| colspan="4" | | |||
=====玩家特定变量===== | |||
|- | |||
|<code>has_cape</code> | |||
|是否有披风 | |||
|判断玩家是否有披风。1=是,0=否 | |||
|❌ 不可用 | |||
|- | |||
|<code>cape_flap_amount</code> | |||
|披风飘动量 | |||
|获取披风的飘动幅度(0-1),基于玩家移动速度 | |||
|❌ 不可用 | |||
|- | |||
|<code>player_level</code> | |||
|玩家等级 | |||
|获取玩家的经验等级 | |||
|❌ 不可用 | |||
|} | |||
===二、函数绑定(Functions)=== | |||
你需要先知道一些基础知识↓ | |||
*<code>tag</code> 标签 命名方式为 '''[命名空间:标签id]''' 示例:<code>minecraft:is_plain</code> | |||
*<code>item</code> 物品 命名方式为 '''[命名空间:物品id]''' 示例:<code>create:potato_cannon</code> | |||
*<code>slot</code> 槽位 可选值有:<code>mainhand(主手), offhand(副手), head(头), chest(胸), legs(腿), feet(脚)</code> <sub>ps:其中主副手测试可用 其他的未测试</sub> | |||
如果你不知道你想要判断的物品id / tag,请直接上网搜索。 | |||
{| class="wikitable" | |||
!query 名 | |||
!含义及用法 | |||
!测试情况 | |||
|- | |||
| colspan="3" | | |||
=====环境检测函数===== | |||
|- | |||
|<code>biome_has_all_tags</code><code>( tag, ... )</code> | |||
|生物群系是否包含所有指定标签 | |||
<code>tag</code> 生物群系标签<br> | |||
示例:判断是否在平原且是寒冷群系<br> | |||
<code>biome_has_all_tags('minecraft:is_plains', 'minecraft:is_cold')</code> | |||
| | | | ||
|- | |||
|<code>biome_has_any_tag</code><code>( tag, ... )</code> | |||
|生物群系是否包含任意指定标签 | |||
<code>tag</code> 生物群系标签<br> | |||
示例:判断是否在森林或平原<br> | |||
<code>biome_has_any_tag('minecraft:is_forest', 'minecraft:is_plains')</code> | |||
| | | | ||
|- | |||
|<code>relative_block_has_all_tags</code> | |||
<code>( x, y, z, tag, ... )</code> | |||
|相对位置方块是否包含所有标签 | |||
<code>x, y, z</code> 相对坐标(整数,范围 +/- 8) <code>tag</code> 方块标签<br> | |||
示例:判断脚下(y-1)是否是泥土且有特定标签<br> | |||
<code>relative_block_has_all_tags(0, -1, 0, 'minecraft:dirt', 'some:tag')</code> | |||
| | | | ||
|- | |||
|<code>relative_block_has_any_tag</code> | |||
<code>( x, y, z, tag, ... )</code> | |||
|相对位置方块是否包含任意标签 | |||
<code>x, y, z</code> 相对坐标(整数,范围 +/- 8) <code>tag</code> 方块标签<br> | |||
示例:判断脚下(y-1)是否是泥土或草方块<br> | |||
<code>relative_block_has_any_tag(0, -1, 0, 'minecraft:dirt', 'minecraft:grass_block')</code> | |||
| | | | ||
|- | |- | ||
|<code> | | colspan="3" | | ||
| | =====物品检测函数===== | ||
| | |- | ||
|<code>is_item_name_any</code><code>( slot , item, ... )</code> | |||
|判断已装备物品是否匹配任意传入的物品名称 | |||
示例:判断主手是否持有机械动力的土豆加农炮或者....<br> | |||
<code>is_item_name_any('mainhand','create:potato_cannon', ...)</code> | |||
|✅️可用 | |||
|- | |||
|<code>equipped_item_all_tags</code> | |||
<code>( slot, tag, ... )</code> | |||
|判断已装备物品是否包含所有传入的标签 | |||
示例:判断主手物品是否同时包含两个标签<br> | |||
(这里是原木标签和可燃烧标签 意思是可燃烧的原木)<br> | |||
<code>equipped_item_all_tags('mainhand', 'minecraft:logs', 'minecraft:burnable')</code> | |||
| | |||
|- | |||
|<code>equipped_item_any_tag</code><code>( slot, tag, ... )</code> | |||
|判断已装备物品是否包含任意传入的标签 | |||
示例:判断主手物品是否是原木<br> | |||
<code>equipped_item_any_tag('mainhand', 'minecraft:logs')</code> | |||
| | |||
|- | |||
| colspan="3" | | |||
=====位置相关函数===== | |||
|- | |||
|<code>position</code><code>( axis )</code> | |||
|获取实体 / 对象的当前坐标位置 | |||
<code>axis</code> 轴索引:0=X, 1=Y, 2=Z | |||
示例:获取实体Y坐标 <code>position(1)</code> | |||
| | | | ||
|- | |- | ||
|<code> | |<code>position_delta</code><code>( axis )</code> | ||
| | |获取实体 / 对象的当前渲染帧的位置与上一游戏刻(Tick)位置的位移差 | ||
| | <code>axis</code> 轴索引:0=X, 1=Y, 2=Z | ||
示例:获取Y轴位移 <code>position_delta(1)</code> | |||
|❌ 不可用 | |||
<sub>3.2.0的bug</sub> | |||
|- | |||
| colspan="3" | | |||
=====物品耐久函数===== | |||
|- | |||
|<code>max_durability</code><code>( slot )</code> | |||
|获取物品的最大耐久值 | |||
示例:获取主手物品最大耐久 <code>max_durability('mainhand')</code> | |||
| | | | ||
|- | |- | ||
|<code> | |<code>remaining_durability</code><code>( slot )</code> | ||
| | |获取物品的当前剩余耐久值 | ||
示例:获取主手物品剩余耐久 <code>remaining_durability('mainhand')</code> | |||
| | | | ||
|} | |} | ||
=== | ==材质效果后缀及对应效果== | ||
{| class="wikitable" | {| class="wikitable mw-collapsible" | ||
! | !材质命名后缀 | ||
!对应效果 | |||
!测试情况 | |||
|- | |||
|_e | |||
|自发光材质 (Emissive) | |||
让贴图在黑暗中发光,不受光照影响 | |||
|✅️可用 | |||
|- | |||
|_s | |||
|高光材质 (Specular) | |||
控制贴图的反光强度,使材质看起来更光滑或有金属质感 | |||
|✅️可用 | |||
|- | |||
|_n | |||
|法线材质 (Normal) | |||
通过法线贴图增加表面的凹凸细节感,不改变模型几何形状 | |||
|❌ 不可用 | |||
|} | |||
===数学函数=== | |||
*所有函数均可在 molang 表达式中直接调用。 | |||
*`math.` 前缀通常是可选的,但建议直接使用函数名(如 `sin(x)` 而非 `math.sin(x)`,具体视解析器实现而定,代码中直接绑定了函数名)。 | |||
{| class="wikitable mw-collapsible" | |||
!函数名 | |||
!含义 | !含义 | ||
!用法 | !用法 | ||
!测试情况 | !测试情况 | ||
|- | |- | ||
| colspan="4" | | |||
=====常量===== | |||
|- | |||
|<code>pi</code> | |||
|圆周率 | |||
|3.14159... | |||
| | | | ||
|- | |||
|<code>e</code> | |||
|自然常数 | |||
|2.71828... | |||
| | | | ||
|- | |||
| colspan="4" | | |||
=====取整与舍入===== | |||
|- | |||
|<code>floor(x)</code> | |||
|向下取整 | |||
|返回不大于 x 的最大整数 | |||
| | | | ||
|- | |||
|<code>ceil(x)</code> | |||
|向上取整 | |||
|返回不小于 x 的最小整数 | |||
| | | | ||
|- | |- | ||
|<code> | |<code>round(x)</code> | ||
| | |四舍五入 | ||
| | |返回最接近 x 的整数 | ||
| | | | ||
|- | |- | ||
|<code> | |<code>trunc(x)</code> | ||
| | |截断 | ||
| | |移除 x 的小数部分 | ||
| | | | ||
|- | |- | ||
|<code> | | colspan="4" | | ||
| | =====比较与限制===== | ||
| | |- | ||
|<code>clamp(value, min, max)</code> | |||
|钳位/限制 | |||
|将 value 限制在 min 和 max 之间。若 value < min 返回 min,若 value > max 返回 max | |||
| | | | ||
|- | |- | ||
|<code> | |<code>max(a, b)</code> | ||
| | |最大值 | ||
| | |返回 a 和 b 中的较大值 | ||
|✅ | |||
|- | |||
|<code>min(a, b)</code> | |||
|最小值 | |||
|返回 a 和 b 中的较小值 | |||
|✅ | |||
|- | |||
| colspan="4" | | |||
=====三角函数与运算===== | |||
|- | |||
|<code>sin(x)</code> | |||
|正弦 | |||
|输入角度(Degree),返回正弦值 | |||
| ✅ | |||
|- | |||
|<code>cos(x)</code> | |||
|余弦 | |||
|输入角度(Degree),返回余弦值 | |||
|✅ | |||
|- | |||
|<code>asin(x)</code> | |||
| 反正弦 | |||
|输入值,返回角度(Degree) | |||
| | | | ||
|- | |- | ||
|<code>acos(x)</code> | |||
|反余弦 | |||
|输入值,返回角度(Degree) | |||
| | | | ||
|- | |||
|<code>atan(x)</code> | |||
|反正切 | |||
|输入值,返回角度(Degree) | |||
| | | | ||
|- | |||
|<code>atan2(y, x)</code> | |||
|方位角 | |||
|返回点 (x, y) 与 x 轴的夹角(Degree) | |||
| | | | ||
|- | |||
|<code>sqrt(x)</code> | |||
|平方根 | |||
|返回 x 的平方根 | |||
| | | | ||
|- | |- | ||
|<code> | |<code>pow(base, exp)</code> | ||
| | |幂运算 | ||
| | |返回 base 的 exp 次幂 | ||
| | |||
| | |||
|- | |- | ||
|<code> | |<code>exp(x)</code> | ||
| | |指数 | ||
| | |返回 e 的 x 次幂 | ||
| | | | ||
|- | |- | ||
|<code> | |<code>ln(x)</code> | ||
| | |自然对数 | ||
| | |返回 x 的自然对数 | ||
| | | | ||
|- | |- | ||
|<code>mod(a, b)</code> | |||
|取模 | |||
|返回 a 除以 b 的余数 | |||
|✅ | |||
|- | |||
|<code>abs(x)</code> | |||
|绝对值 | |||
|返回 x 的绝对值 | |||
| | | | ||
===== | |- | ||
| colspan="4" | | |||
=====插值与随机===== | |||
|- | |||
|<code>lerp(start, end, delta)</code> | |||
|线性插值 | |||
|返回 start + (end - start) * delta | |||
| | | | ||
|- | |||
|<code>lerprotate(start, end, delta)</code> | |||
|角度插值 | |||
|在两个角度之间进行插值,自动处理 360 度环绕问题 | |||
| | | | ||
|- | |||
|<code>hermite_blend(t)</code> | |||
|Hermite 插值 | |||
|返回 3t^2 - 2t^3,用于平滑曲线 | |||
| | | | ||
|- | |- | ||
|<code> | |<code>die_roll(rolls, min, max, [seed])</code> | ||
| | |骰子随机(浮点) | ||
| | |投掷 rolls 次骰子,每次取 min 到 max 之间的随机浮点数,返回总和。可选 seed 种子。 | ||
| | | | ||
|- | |- | ||
|<code> | |<code>die_roll_integer</code><code>(rolls, min, max, [seed])</code> | ||
| | |骰子随机(整数) | ||
| | |投掷 rolls 次骰子,每次取 min 到 max 之间的随机整数,返回总和。可选 seed 种子。 | ||
| | | | ||
|- | |- | ||
|<code>random(min, max, [seed])</code> | |||
|随机数(浮点) | |||
|返回 min 到 max 之间的随机浮点数。可选 seed 种子。 | |||
| | | | ||
|- | |||
| | |<code>random_integer(min, max, [seed])</code> | ||
|随机数(整数) | |||
|返回 min 到 max 之间的随机整数。可选 seed 种子。 | |||
| | | | ||
|- | |||
| colspan="4" | | |||
=====转换与工具===== | |||
|- | |||
|<code>to_deg(x)</code> | |||
|弧度转角度 | |||
|将弧度转换为角度 | |||
| | | | ||
|- | |- | ||
|<code> | |<code>to_rad(x)</code> | ||
| | |角度转弧度 | ||
| | |将角度转换为弧度 | ||
| | | | ||
|- | |- | ||
|<code> | |<code>min_angle(x)</code> | ||
| | |最小角度 | ||
| | |将角度标准化到 -180 到 180 之间 | ||
| | | | ||
|} | |} | ||
[[分类:攻略和指南]] | [[分类:攻略和指南]] | ||
2026年2月25日 (三) 01:34的最新版本
前言
本页主要是对《时装工坊官方教程》中的高级时装教程的扩展与补充,教程的重点将放在blockbench上,如果你想学习时装工坊游戏内时装制作(体素化(就是很多小方块堆起来)),请参阅时装工坊官方教程:入门实践教程 & 高级时装教程,教程较为详细,适合新人阅读。但美中不足的是,官方教程对blockbench时装制作几乎是一笔带过,很容易让想要制作更花哨精致时装的新人一头雾水,别着急,本篇教程将会从熟悉流程、具体时装制作实例、常用技巧以及常用资料四个方面教会你如何制作你的时装!
在开始学习之前,请准备好:
- blockbench 4.12版本(可以从建模社群文件中找到)(请勿使用网页端,是5.0)(打开后请在左上角-文件-首选项-设置-应用里关闭自动更新)
- 一个单人创造存档(用于游戏内查看效果,要导入到服务器内请参阅:莉亚工坊 - RIA | Wiki中时装提取章节的说明)
- 耐心
本教程为傻瓜式教程,只需按教程一步步操作,即可学会制作流程,也因此文中可能不会提及太多其他(比如进阶以及无关的操作),所以如果有类似:“在这一步里我看到了xxx,有什么用,我该不该点击 / 填写?”之类的问题,没有说那就不要做,由于有大量的操作内容,文字能够传达的十分有限,因此请务必结合相应的视频进行理解。本文未提及的问题,请在建模社与热情的群u们讨论解决。
熟悉流程
在学会具体的时装制作之前,我更推荐新人先熟练掌握从bb中导出模型,并导入到游戏内查看效果的流程,因为一个时装的制作,少不了反复制作-导入-查看效果-返回细化-继续导入...这一套来来回回,并且bb中预览效果也和游戏内有较大差别(比如难以查看的第一视角、光影渲染等),所以学会更快更方便的操作整个流程非常有必要。
1.创建并保存一个blockbench模型
首先打开blockbench,点击通用模型-创建新模型,来到模型编辑页,填入文件名,点击确定,这样一个新的模型文件就创建好啦。
但此时这个模型还什么都没有,为了能在游戏内查看到效果,你需要点击右侧的添加块工具,选中此块(cube),并点击左侧的创建纹理按钮,有模型有纹理,这样他就是一个完整的模型了!现在点击左上角的文件-另存为项目,将文件保存在 ...\RiAFst_Autoupdate\armourers_workshop\model-imports 路径(RiAFst_Autoupdate是fst自动更新整合包的实例名,如果你修改了实例名,请找到对应的实例文件夹),这样就大功告成了!
检查你的model-imports文件夹,如果有刚刚保存的 教学模型.bbmodel 文件,就说明我们已经保存成功了!之后保存时,无需再选择另存为文件,只需要选择保存文件,相应的文件即会覆盖更新,不必每次都重新选择对应文件夹,这样做也是为了更迅速更效率的导出!
这么多文字是不是有点头大?文字描述的按钮也并不直观,好在我录制了操作的视频(后面也都会有,不想阅读可以直接查看),连草履虫都能看懂噢!↓↓↓↓↓↓

2.在游戏内导入模型并查看效果
进入到你的存档,拿出“高级时装工作台”,放置并右击进入GUI界面,首先关注右上角的时装类型,默认选中的是头部,这里我们以方块为例,点击通用-头部即可出现类型选择列表,滚动到底部选中方块,此时中间的模特会变成一个草方块,用于指示方块底部的一格,可以帮助你参考以更好的贴合地面。
按ctrl+i,此时会出现导入菜单,找到刚刚创建的文件:教学模型.bbmodel,选中并单击确定,就可以看到时装被成功导入了,再按ctrl+e,点击确定,物品就成功被导入物品栏中了。
退出此界面,物品栏中已经多出了刚刚导入的时装方块,把它放置出来,小小的,很可爱。

3.调整模型后再次导入
刚刚导入的方块过于小了,假设我们想做一个正常大小的方块,此时就需要返回blockbench中进行调整,此处不对blockbench的基础操作进行教学,想要学习可以参考b站视频教程,可以视为mc与blockbench中采用同一个单位,mc的默认资源包中,方块纹理默认尺寸是16x16,因此我们将模型放大至16x16x16,再次导入,即可得到一个与原版方块相同大小的时装方块,此时选择保存项目,进入游戏中导入,放置下来看看,严丝合缝!

具体时装制作实例
本章将带你从堆块、上色到动画效果,教会你如何规范的制作一个有模有样的时装。但请注意你需要有一定的blockbench基础,至少明白如何创建块、分组、使用调整工具、创建纹理、使用上色工具、创建动画、添加关键帧...如果你还不清楚,请自行查找blockbench基础教程(这与时装工坊无关)。
当然如果你不想看也完全米有问题!跟着教学视频一步步操作,也可以实现大概的效果,但是要对于blockbench,视频中能够展现的内容较为有限,编者的水平也有限,如有更好的操作技巧,请多多留言指教。
此文编时,新年将至,不妨我们就做一只 猪咪 年猪头饰,希望大家都能吃好喝好,新的一年白白胖胖多多上工!
1.堆块
在开始堆砌块元素之前,我们要先想好这个物品由哪几部分组成,然后进行专门的分组,这一步对于后面的动画制作十分重要,如果处理不好将会非常麻烦,如何分组?只需要记得,如果你希望一个块(或一群块)能够活动,就要分为一个组,组和组之间可以嵌套包裹,父级组的动画会带动子级组一起活动。要查看具体的分组示例,请下载建模社群文件中的 高级时装部件对照-原版皮肤.bbmodel。
因为要制作一个头饰,为了对齐人物头部,编者建议在刚刚的 高级时装部件对照-原版皮肤.bbmodel 的基础上进行修改,这个模型和游戏内的模特是完全对齐的,当你制作通用类的时装时,都可以基于此模型进行制作以达到完美对齐的效果,而无需在游戏内进行调整。
在创建第一个方块之前,因为我们需要制作的时装类型是头饰,所以先点开名为Head的分组,再在内部创建所有的方块和组。这样制作完成的模型就会跟随角色头部运动。

对于需要设置动画的部位,我们需要进行单独分组。以我们的年猪为例,我们会希望有一个头部晃动的动画,因此头部要有一个专门的分组,命名好Pighead,目的是清晰便于理解。身体和四肢我们就不做动画了,可以分为一个组,也可以干脆不分组,只要不做动画,一个组都没有也是可以的,但当你开始制作更加复杂的模型时,一大堆块混在一起会把你搞疯的,因此还是建议清晰的分开。

在一通添加、缩放、移动、旋转块之后,你成功得到了一个小猪模型!别忘了把对齐用到的人物模型删除,我们的时装只有这个头饰!
2.上色
接下来我们添加纹理,也就是上色,按ctrl+a全选,点击创建新纹理,接下来会弹出一个新建弹窗,名称暂时可以不修改,重要的是这个像素密度,正如字面意义,越大的密度,每个面的分辨率会更高,也就是会更高清,这取决于你,默认16x可以较好的贴合mc的原版风格,当然像素密度也不一定是固定的,你可以通过调整UV大小来更改每个面的分辨率。
创建好纹理后,接下来开始上色,点击右上角的绘画模式,此时编辑工具会发生变化,可以使用画笔、油漆桶、渐变工具等进行上色,选中一个块,按 i 可以暂时隐藏其他块,让你聚焦选中块的上色,熟悉基本操作后,这一步骤考验的是你的绘画能力。
感觉上色困难?我们还编写了一篇上色教程,详细介绍了色彩理论,帮助你更好的学习上色。下面的视频也演示了一些基本的上色流程。

3.动画制作
点击右上角的动画模式,此时右侧只会剩下刚刚分好的组:head、body和包裹他们的总组main,这就是分组的作用,动画模式只能以组为单位进行动作编辑。下文称组为节点,这也是更规范的称谓。
首先要添加一个动画,这里我们做一个默认状态下一直摇头的动画,点击左上角的 ⊕ 按钮添加动画,命名为parallel0,以此命名的动画将不会被任何其他动画打断,如果想知道还能添加什么类型的动画,请跳转至最后一章:常用资料。我们需要他一直播放,因此循环类型选择循环播放。单击确定就创建好了。
接下来选中parallel0,表示编辑此动画,点击head节点,表示给head添加动画,此时下方会出现head的时间轴,我们来到第0帧,点击“旋转”旁的 + ,就成功添加了一个关键帧,表示在第0帧时,head的旋转姿态应该是当前这样,接下来拖动时间条来到第1秒(或者任意时间),再次单击“旋转”旁的 + ,但是这时候我们要调整一下head的旋转,这里随意调整,只需要知道这样做是表示第1秒时,head会旋转成这个样子,这样就添加了一个简单的动画了!单击空格播放动画检查一下,你会看到head在循环这个旋转动画,但此时的动画比较生硬,因此我们要多加几个关键帧,让head达到来回摆动的效果,因此再添加一个复位的关键帧,以及朝另一个方向摆动的关键帧,最后再复位一次,这样来回摆动的动画就完全做好了!

最后按照第一章的操作,把模型导入游戏,记住,你需要选择合适的部位,在这里我们选择头部,导入模型并导出到物品栏,ctrl+p打开时装栏或者直接右键,开启第三人称欣赏你的成品吧!
常用技巧
1.如何制作跟随视角旋转的时装?——nvgaovO
还在写! 也许可以催催nvgao?
2.如何让你手中的物品出现在时装上?——nvgaovO
还在写! 也许可以催催nvgao?
3.如何给时装添加音效?——nvgaovO
还在写! 也许可以催催nvgao?
4.如何创建发光 / 镜面的材质? ——nvgaovO
还在写! 也许可以催催nvgao?
常用资料
动画类型及效果对应
| 动画名称 | 动画效果 | 备注 |
|---|---|---|
| idle | 无其他动画播放时播放的动画 | 适用于待机动画
会被其他动画打断,无论是否有帧冲突 (如左/右键动画) |
| parallel0 | 强覆盖播放的动画 | 适用于一些默认的动画,比如齿轮旋转
一直播放不会被任何动画打断 如果有冲突,也会导致其他动画无法正常播放 |
| pre_parallel0-9 | 弱覆盖播放的动画 | 适用于默认动画在某些情况需要有所变化的情况,比如一直旋转的齿轮突然加速
如果他的关键帧没有和别的动画冲突,则正常播放 如果冲突,则会被打断 |
| rightclick | 右键时触发 | 时装工坊并不支持,这是FST通过kjs脚本执行的动画播放
无法执行停下操作播放idle动画 |
| leftclick | 左键时触发 | 时装工坊并不支持,这是FST通过kjs脚本执行的动画播放
无法执行停下操作播放idle动画,此动画无法覆盖第一/第三人称手臂挥舞的动画。 |
| walk | 行走 | 在地面移动时触发 |
| run | 疾跑 | 在地面疾跑(移动+疾跑状态)时触发 |
| jump | 跳跃 | 在空中(不接触地面)时触发 |
| sneak | 潜行待机 | 潜行(下蹲)静止时触发 |
| sneak_walk | 潜行行走 | 潜行(下蹲)移动时触发 |
| swim | 游泳待机 | 在水中静止时触发 |
| swim_walk | 游泳移动 | 在水中移动时触发 |
| fly | 飞行待机 | 创造模式飞行静止时触发 |
| fly_walk | 飞行移动 | 创造模式飞行移动时触发 |
| fall_fly | 鞘翅飞行 | 使用鞘翅滑翔/飞行时触发 |
| ride | 骑乘待机 | 骑乘普通实体(如猪、马、矿车)静止时触发
按键坐下无法触发此动画 |
| ride_walk | 骑乘移动 | 骑乘普通实体移动时触发 |
| boat | 坐船待机 | 乘坐船只静止时触发 |
| boat_walk | 坐船移动 | 乘坐船只移动时触发 |
| crawl | 爬行待机 | 趴下/匍匐(如在1格高空间)静止时触发 |
| crawl_walk | 爬行移动 | 趴下/匍匐移动时触发 |
| climb | 攀爬待机 | 在梯子/藤蔓上静止时触发 |
| climb_walk | 攀爬移动 | 在梯子/藤蔓上移动时触发 |
所有可用查询query、函数及用法示例
一、变量绑定(Variables)
- 所有 “判断是否是xxxx ” 的query,若是则返回1,反之返回0。
- 特殊注意,涉及x、y相关的query,blockbench和mc中xy是相反的,请将x绑定在y上,y绑定在x上。
| query 名 | 含义 | 用法 | 测试情况 |
|---|---|---|---|
上下文变量 | |||
anim_time
|
动画时间 | 获取当前动画播放的时间进度(秒),用于同步动画与逻辑 | ✅ |
life_time
|
生命周期时间 | 获取实体存在的总时间(Tick/20 -> 秒),用于循环动画或时效判断 | ✅ |
actor_count
|
实体数量 | 获取当前渲染上下文中的实体总数(通常用于性能优化或群体检测) | |
is_first_person
|
是否第一人称 | 判断当前渲染是否在第一人称视角下。1=是,0=否 | |
世界变量 | |||
time_of_day
|
游戏天数 | 获取游戏世界的时间(0-1之间,代表一天中的进度,或具体的天数,视实现而定) | |
time_stamp
|
时间戳 | 获取当前世界的总时间戳(Tick数) | |
moon_phase
|
月相 | 获取当前月相(0-7的整数,代表不同月相) | |
实体基础变量 | |||
eye_target_x_rotation
|
眼睛目标旋转X | 获取实体视线绕 X 轴 的旋转角度,即 俯仰角 (Pitch)
当实体 抬头或低头 时,这个值会改变 |
|
eye_target_y_rotation
|
眼睛目标旋转Y | 获取实体视线绕 Y 轴 的旋转角度,即 偏航角 (Yaw)
当实体 向左或向右转头/转身 时,这个值会改变 |
|
head_x_rotation
|
头部旋转X | 头转过的角度减去身体转过的角度
用于制作人物头部模型 像原版一样随身体转动而受限(例如身体不动时,头只能转 90 度) |
✅ |
head_y_rotation
|
头部旋转Y | 获取头部的Y轴旋转角度(Pitch)
用于制作人物头部模型 像原版一样随身体转动而受限(例如身体不动时,头只能转 90 度) |
✅ |
yaw_speed
|
偏航速度 | 获取实体转身的速度(Y轴旋转变化率) | |
ground_speed
|
地面速度 | 获取实体在地面移动的速度 | |
vertical_speed
|
垂直速度 | 获取实体垂直移动的速度(如跳跃或坠落) | |
cardinal_facing_2d
|
2D 朝向 | 获取实体的朝向(0-3,代表南/西/北/东等方向) | |
distance_from_camera
|
与相机距离 | 获取实体距离渲染相机的距离 | |
modified_distance_moved
|
移动距离 | 获取实体移动的总距离(修正值) | |
walk_distance
|
行走距离 | 获取实体行走的距离(通常用于计算步幅动画) | |
实体状态变量 | |||
has_rider
|
是否有骑乘者 | 判断当前实体是否被其他实体骑乘。1=是,0=否 | |
is_in_water
|
是否在水中 | 判断实体是否在水中。1=是,0=否 | |
is_in_water_or_rain
|
是否在水/雨中 | 判断实体是否在水中、雨中或气泡柱中。1=是,0=否 | |
is_on_fire
|
是否着火 | 判断实体是否燃烧。1=是,0=否 | |
is_on_ground
|
是否在地面 | 判断实体是否接触地面。1=是,0=否 | |
is_riding
|
是否骑乘中 | 判断实体是否正在骑乘其他实体(如矿车、马)。1=是,0=否 | |
is_sneaking
|
是否潜行 | 判断实体是否处于潜行状态。1=是,0=否 | ✅ |
is_jumping
|
是否跳跃 | 判断实体是否处于跳跃状态(离地)。1=是,0=否 | |
is_spectator
|
是否旁观模式 | 判断实体是否处于旁观模式。1=是,0=否 | |
is_sprinting
|
是否疾跑 | 判断实体是否处于疾跑状态。1=是,0=否 | |
is_swimming
|
是否游泳 | 判断实体是否处于游泳动作状态(通常指在深水中水平游动)。1=是,0=否 | |
生物实体变量 | |||
body_x_rotation
|
身体旋转X | 获取身体的X轴旋转角度(Yaw) | ✅ |
body_y_rotation
|
身体旋转Y | 获取身体的Y轴旋转角度(Pitch) | ✅ |
health
|
生命值 | 获取当前生命值 | |
max_health
|
最大生命值 | 获取最大生命值 | |
hurt_time
|
受伤时间 | 获取受伤后的无敌时间/变红时间 | |
is_playing_dead
|
是否装死/濒死 | 判断实体是否死亡或装死。1=是,0=否 | |
is_eating
|
是否进食 | 判断实体是否正在吃东西/喝药水。1=是,0=否 | |
is_sleeping
|
是否睡觉 | 判断实体是否在睡觉。1=是,0=否 | |
is_using_item
|
是否使用物品 | 判断实体是否正在使用物品(如拉弓、格挡)。1=是,0=否 | |
item_in_use_duration
|
物品使用时长 | 获取物品已经使用的时长(Tick) | |
item_max_use_duration
|
物品最大使用时长 | 获取物品最大可使用时长(Tick) | |
item_remaining_use_duration
|
物品剩余使用时长 | 获取物品剩余使用时长(Tick) | |
equipment_count
|
装备数量 | 获取实体装备的物品数量 | |
玩家特定变量 | |||
has_cape
|
是否有披风 | 判断玩家是否有披风。1=是,0=否 | ❌ 不可用 |
cape_flap_amount
|
披风飘动量 | 获取披风的飘动幅度(0-1),基于玩家移动速度 | ❌ 不可用 |
player_level
|
玩家等级 | 获取玩家的经验等级 | ❌ 不可用 |
二、函数绑定(Functions)
你需要先知道一些基础知识↓
tag标签 命名方式为 [命名空间:标签id] 示例:minecraft:is_plainitem物品 命名方式为 [命名空间:物品id] 示例:create:potato_cannonslot槽位 可选值有:mainhand(主手), offhand(副手), head(头), chest(胸), legs(腿), feet(脚)ps:其中主副手测试可用 其他的未测试
如果你不知道你想要判断的物品id / tag,请直接上网搜索。
| query 名 | 含义及用法 | 测试情况 |
|---|---|---|
环境检测函数 | ||
biome_has_all_tags( tag, ... )
|
生物群系是否包含所有指定标签
|
|
biome_has_any_tag( tag, ... )
|
生物群系是否包含任意指定标签
|
|
relative_block_has_all_tags
|
相对位置方块是否包含所有标签
|
|
relative_block_has_any_tag
|
相对位置方块是否包含任意标签
|
|
物品检测函数 | ||
is_item_name_any( slot , item, ... )
|
判断已装备物品是否匹配任意传入的物品名称
示例:判断主手是否持有机械动力的土豆加农炮或者.... |
✅️可用 |
equipped_item_all_tags
|
判断已装备物品是否包含所有传入的标签
示例:判断主手物品是否同时包含两个标签 |
|
equipped_item_any_tag( slot, tag, ... )
|
判断已装备物品是否包含任意传入的标签
示例:判断主手物品是否是原木 |
|
位置相关函数 | ||
position( axis )
|
获取实体 / 对象的当前坐标位置
|
|
position_delta( axis )
|
获取实体 / 对象的当前渲染帧的位置与上一游戏刻(Tick)位置的位移差
|
❌ 不可用
3.2.0的bug |
物品耐久函数 | ||
max_durability( slot )
|
获取物品的最大耐久值
示例:获取主手物品最大耐久 |
|
remaining_durability( slot )
|
获取物品的当前剩余耐久值
示例:获取主手物品剩余耐久 |
|
材质效果后缀及对应效果
| 材质命名后缀 | 对应效果 | 测试情况 |
|---|---|---|
| _e | 自发光材质 (Emissive)
让贴图在黑暗中发光,不受光照影响 |
✅️可用 |
| _s | 高光材质 (Specular)
控制贴图的反光强度,使材质看起来更光滑或有金属质感 |
✅️可用 |
| _n | 法线材质 (Normal)
通过法线贴图增加表面的凹凸细节感,不改变模型几何形状 |
❌ 不可用 |
数学函数
- 所有函数均可在 molang 表达式中直接调用。
- `math.` 前缀通常是可选的,但建议直接使用函数名(如 `sin(x)` 而非 `math.sin(x)`,具体视解析器实现而定,代码中直接绑定了函数名)。
| 函数名 | 含义 | 用法 | 测试情况 |
|---|---|---|---|
常量 | |||
pi
|
圆周率 | 3.14159... | |
e
|
自然常数 | 2.71828... | |
取整与舍入 | |||
floor(x)
|
向下取整 | 返回不大于 x 的最大整数 | |
ceil(x)
|
向上取整 | 返回不小于 x 的最小整数 | |
round(x)
|
四舍五入 | 返回最接近 x 的整数 | |
trunc(x)
|
截断 | 移除 x 的小数部分 | |
比较与限制 | |||
clamp(value, min, max)
|
钳位/限制 | 将 value 限制在 min 和 max 之间。若 value < min 返回 min,若 value > max 返回 max | |
max(a, b)
|
最大值 | 返回 a 和 b 中的较大值 | ✅ |
min(a, b)
|
最小值 | 返回 a 和 b 中的较小值 | ✅ |
三角函数与运算 | |||
sin(x)
|
正弦 | 输入角度(Degree),返回正弦值 | ✅ |
cos(x)
|
余弦 | 输入角度(Degree),返回余弦值 | ✅ |
asin(x)
|
反正弦 | 输入值,返回角度(Degree) | |
acos(x)
|
反余弦 | 输入值,返回角度(Degree) | |
atan(x)
|
反正切 | 输入值,返回角度(Degree) | |
atan2(y, x)
|
方位角 | 返回点 (x, y) 与 x 轴的夹角(Degree) | |
sqrt(x)
|
平方根 | 返回 x 的平方根 | |
pow(base, exp)
|
幂运算 | 返回 base 的 exp 次幂 | |
exp(x)
|
指数 | 返回 e 的 x 次幂 | |
ln(x)
|
自然对数 | 返回 x 的自然对数 | |
mod(a, b)
|
取模 | 返回 a 除以 b 的余数 | ✅ |
abs(x)
|
绝对值 | 返回 x 的绝对值 | |
插值与随机 | |||
lerp(start, end, delta)
|
线性插值 | 返回 start + (end - start) * delta | |
lerprotate(start, end, delta)
|
角度插值 | 在两个角度之间进行插值,自动处理 360 度环绕问题 | |
hermite_blend(t)
|
Hermite 插值 | 返回 3t^2 - 2t^3,用于平滑曲线 | |
die_roll(rolls, min, max, [seed])
|
骰子随机(浮点) | 投掷 rolls 次骰子,每次取 min 到 max 之间的随机浮点数,返回总和。可选 seed 种子。 | |
die_roll_integer(rolls, min, max, [seed])
|
骰子随机(整数) | 投掷 rolls 次骰子,每次取 min 到 max 之间的随机整数,返回总和。可选 seed 种子。 | |
random(min, max, [seed])
|
随机数(浮点) | 返回 min 到 max 之间的随机浮点数。可选 seed 种子。 | |
random_integer(min, max, [seed])
|
随机数(整数) | 返回 min 到 max 之间的随机整数。可选 seed 种子。 | |
转换与工具 | |||
to_deg(x)
|
弧度转角度 | 将弧度转换为角度 | |
to_rad(x)
|
角度转弧度 | 将角度转换为弧度 | |
min_angle(x)
|
最小角度 | 将角度标准化到 -180 到 180 之间 | |
