FMBE - 创建显示实体的新方法
引言
本文将指导您如何纯用指令在Minecraft基岩版中创建方块显示实体。
首位开发该技术的是u/Maxed_Out10,他仅使用原版指令。该技术虽灵活性较低但更为简单,采用盔甲架实现。查看该方法可参考"MBE - Max的方块实体"页面。
受Max的方块实体(MBE)启发,来自日本指令开发者集会的指令专家@pipi_Spamton、@siratama及其团队开发了一种更灵活可定制的新技术。该方法基于MBE原理,但创新性地利用狐狸的骨骼结构来渲染方块显示。
传统上可称其为方块显示实体或简称"显示实体"。但为致敬u/Maxed_Out10,基岩社区更常称之为"狐狸MBE"(FMBE)。
注意
- 每个方块显示需消耗1只狐狸。过多狐狸(如同其他实体)会导致服务器卡顿
- 玩家仍可穿过这些实体,并与之交互(除非加以限制)
视频演示
系统架构
BP/functions/wiki/fmbe/render.mcfunction
yaml
### 重定位与定义FMBE缩放
playanimation @e[type=fox,tag=wiki:fmbe] animation.player.sleeping none 0 "" controller.animation.fox.move
playanimation @e[type=fox,tag=wiki:fmbe] animation.creeper.swelling none 0 "v.xbasepos=v.xbasepos??0;v.ybasepos=v.ybasepos??0;v.zbasepos=v.zbasepos??0;v.xpos=v.xpos??0;v.ypos=v.ypos??0;v.zpos=v.zpos??0;v.xrot=v.xrot??0;v.yrot=v.yrot??0;v.zrot=v.zrot??0;v.scale=v.scale??1;v.xzscale=v.xzscale??1;v.yscale=v.yscale??1;v.swelling_scale1=2.1385*math.sqrt(v.xzscale)*math.sqrt(v.scale);v.swelling_scale2=2.1385*math.sqrt(v.yscale)*math.sqrt(v.scale);" wiki:scale
playanimation @e[type=fox,tag=wiki:fmbe] animation.ender_dragon.neck_head_movement none 0 "v.head_rotation_x=0;v.head_rotation_y=0;v.head_rotation_z=0;v.head_position_x=(v.xbasepos*3741/8000)*math.sqrt(v.xzscale)*math.sqrt(v.scale);v.head_position_y=(10.6925+v.ybasepos*3741/8000)*math.sqrt(v.yscale)*math.sqrt(v.scale);v.head_position_z=(17.108-v.zbasepos*3741/8000)*math.sqrt(v.xzscale)*math.sqrt(v.scale);" wiki:shift_pos
## 定义FMBE旋转
### X轴
playanimation @e[type=fox,tag=wiki:fmbe] animation.warden.move none 0 "v.body_x_rot=90+v.xrot;v.body_z_rot=90+v.yrot;" wiki:xrot
### Z轴
playanimation @e[type=fox,tag=wiki:fmbe] animation.player.attack.rotations none 0 "v.attack_body_rot_y=-v.zrot;" wiki:zrot
## 定义FMBE位置
### X轴
playanimation @e[type=fox,tag=wiki:fmbe] animation.parrot.moving none 0 "v.wing_flap=(16-v.xpos)/0.3;" wiki:xpos
### Y轴
playanimation @e[type=fox,tag=wiki:fmbe] animation.minecart.move.v1.0 none 0 "v.rail_offset.x=0;v.rail_offset.y=1.6485+v.ypos/16;v.rail_offset.z=0;" wiki:ypos
### Z轴
playanimation @e[type=fox,tag=wiki:fmbe] animation.parrot.dance none 0 "v.dance.x=-v.zpos;v.dance.y=0;" wiki:zpos
注:指定控制器名称可叠加动画而不覆盖前序效果。例如:
wiki:scale(其中wiki是命名空间)
首条指令的控制器名称必须为controller.animation.fox.move。
其余指令虽不强制要求相同控制器名,但统一使用可避免与其他playanimation指令冲突。
FMBE使用指南
激活上述系统后,按以下步骤操作:
初始化
在聊天栏输入:
- 召唤狐狸并用
/replaceitem赋予主手物品模型/summon fox/replaceitem entity @e[type=fox,c=1] slot.weapon.mainhand 0 <物品ID>
- 添加
wiki:fmbe标签使狐狸呈现为方块形态/tag @e[type=fox] add wiki:fmbe
变量控制
通过客户端动画可调整显示位置、尺寸、角度等。可用变量包括:
- 位置:
v.xposv.yposv.zpos
- 旋转:
v.xrotv.yrotv.zrot
- 缩放:
v.scale— 整体尺寸v.xzscale— XZ轴尺寸v.yscale— Y轴尺寸
- 基准位置:
v.xbaseposv.ybaseposv.zbasepos
注意
basepos变量移动位置但不改变旋转中心,其效果受角度影响(如v.zbasepos=16相当于相对坐标^^^1)pos和basepos值以1/16方块为单位(16=完整1方块)
数值编辑
使用以下指令结构编辑数值:
/playanimation @e[type=fox,tag=wiki:fmbe] animation.player.attack.positions none 0 "" wiki:setvariable
在引号内写入要编辑变量的Molang表达式并赋值。
例如设置xrot为35,ypos为16,scale为1.5:
/playanimation @e[type=fox,tag=wiki:fmbe] animation.player.attack.positions none 0 "v.xrot=35;v.ypos=16;v.scale=1.5;" wiki:setvariable
Molang支持使用各类查询和运算符实现复杂动画。详见**Molang文档**。
保存与加载FMBE
保存指令:
/execute at @e[type=fox,tag=FMBE,c=1] run structure save wiki:fmbe ~~~ ~~~ true disk false
加载指令:
/structure load wiki:fmbe <目标坐标: x y z>
注:结构名称wiki可自定义。
消除狐狸音效
使用以下指令消除FMBE的狐狸声音:
BP/functions/fmbe/stopsound.mcfunction
yaml
stopsound @a mob.fox.spit
stopsound @a mob.fox.sniff
stopsound @a mob.fox.sleep
stopsound @a mob.fox.screech
stopsound @a mob.fox.hurt
stopsound @a mob.fox.eat
stopsound @a mob.fox.death
stopsound @a mob.fox.bite
stopsound @a mob.fox.ambient
stopsound @a mob.fox.aggro
精简版FMBE
这是上述系统的三指令压缩版。若不需调整xzscale和yscale,此版本可稍作优化。
BP/functions/wiki/fmbe/render_compressed.mcfunction
yaml
## 重定位与定义FMBE缩放
playanimation @e[type=fox,tag=wiki:fmbe] animation.player.sleeping none 0 "" controller.animation.fox.move
playanimation @e[type=fox,tag=wiki:fmbe] animation.creeper.swelling none 0 "v.scale=1;v.adscale=math.sqrt(v.scale);v.adscaled=2.1385*v.adscale;v.xbasepos=0;v.ybasepos=0;v.zbasepos=0;v.xpos=0;v.ypos=0;v.zpos=0;v.xrot=q.life_time*0;v.yrot=q.life_time*0;v.zrot=q.life_time*20;v.swelling_scale1=v.adscaled;v.swelling_scale2=v.adscaled;" wiki:scale
## 定义FMBE位置与旋转
playanimation @e[type=fox,tag=wiki:fmbe] animation.ender_dragon.neck_head_movement none 0 "v.adjust_xz=8*v.adscaled+v.zbasepos/v.adscaled;v.adjust_y=(-5-v.ybasepos/v.adscaled/v.adscaled)*v.adscaled;v.x=v.xbasepos/v.adscaled;v.y=v.adjust_y;v.z=v.adjust_xz;v.ty=v.y*math.cos(v.xrot)-v.z*math.sin(v.xrot);v.tz=v.y*math.sin(v.xrot)+v.z*math.cos(v.xrot);v.y=v.ty;v.z=v.tz;v.tx=-v.x*math.cos(v.zrot)+v.y*math.sin(v.zrot);v.ty=v.x*math.sin(v.zrot)+v.y*math.cos(v.zrot);v.x=v.tx;v.y=v.ty;v.tx=v.x*math.cos(v.yrot)+v.z*math.sin(v.yrot);v.tz=-v.x*math.sin(v.yrot)+v.z*math.cos(v.yrot);v.x=v.tx;v.z=v.tz;v.head_position_x=v.x+v.xpos/v.adscaled;v.head_position_y=7.48/v.adscale+v.z+v.zpos/v.adscaled;v.head_position_z=v.y-v.ypos/v.adscaled;v.head_rotation_x=90+v.xrot;v.head_rotation_y=v.zrot;v.head_rotation_z=v.yrot;" wiki:posrot

