开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

[BE教程] 【26.30+】基岩版也可以展示文本?ScriptAPI中TextPrimitive的简单使用

 发表于 3 天前|显示全部楼层|阅读模式 IP:江西省
本帖最后由 dyodyo 于 2026-7-21 17:59 编辑

很都人都知道在Java版中有一种叫做“文本展示实体”的特殊实体。顾名思义,它就是为展示文本而生的,还可以在此基础上调整旋转、缩放等其他的东西。

2.png

不过基岩版就没有这种东西。要实现它,在之前我们可以在行为包中自定义实体。而现在,ScriptAPI中引入了一个新的东西叫做TextPrimitive,使用它的相关接口可以在世界上创建文本标签。

1.jpg

TextPrimitive不仅可以做到展示文本,还支持一些高级的功能,比如说固定朝向、自定义(背景)颜色之类的。


快速开始

先要说明的是,它有几个硬伤:一个是不能保存。无论是退出重进还是执行命令/reload都会导致所有TextPrimitive全部消失。如果想要保存,就要写一套存储机制或用什么其他的东西。二是它最多只能同时存在1000个。
提示
如果你想要快速体验新特性,可以在这里下载演示附加包,使用命名牌就可以管理TextPrimitive。
 pack.mcaddon(16.55 KB, 下载次数: 31)
TextPrimitive拥有非常多的属性,不过我们怎么说都得先创建一个新的TextPrimitive对象。
const textPrimitive = new TextPrimitive( /* ... */ );

TextPrimitive的构造方法需要2个参数:位置和文本。位置这块除了可以使用传统的Vector3(三维向量)以外,还可以使用DimensionLocation(维度位置),其实就是在Vector3的基础上加了一个dimension(维度)属性,比如这样:
const textPrimitive = new TextPrimitive({
    dimension: world.getDimension("overworld"), // 这是维度
    x: 0,
    y: 0,
    z: 0
}, /* ... */ );

如果没有dimension属性,也就是使用Vector3,那么新的TextPrimitive会在**所有维度**显示。这不太可能是你想要的,所以,最好使用DimensionLocation。
文本可以使用字符串,也可以用文本组件(就是JSON文本)。
const textPrimitive = new TextPrimitive({
    dimension: world.getDimension("overworld"), // 这是维度
    x: 0,
    y: 0,
    z: 0
}, "我的测试文本" );

这样,一个TextPrimitive就被我们创建好了,但是它还不会被添加进世界,这要我们自己做一下。primitiveShapesManager用于管理这些东西,它是一个定义在world下的常量,可以这样获取:
const primitiveShapesManager = world.primitiveShapesManager;

添加TextPrimitive需要使用primitiveShapesManager的addText方法。它需要2个参数,第一个显然是我们刚刚的TextPrimitive,至于第二个参数...为什么又来一个维度啊?而且文档也没说这是干嘛的。
由于我担心不填会出现奇怪的问题,所以就直接把TextPrimitive的维度属性填进去了。
world.primitiveShapesManager.addText(textPrimitive, textPrimitive.dimension);

这样,在主世界的原点位置就会出现文本了。


删除TextPrimitive

有添自然会有删。我们有三种方法可以把TextPrimitive删掉,一个是简单粗暴的全部删除:
world.primitiveShapesManager.removeAll();

一个是删除指定的TextPrimitive对象:
world.primitiveShapesManager.removeText(textPrimitive);

也可以调用TextPrimitive自己的remove方法(其实这和第二种方法是一样的):
textPrimitive.remove();

可以看到,要删除特定的TextPrimitive,就必须有它的对象引用,所以在控制多个TextPrimitive时你得好好保存它们。
你说为什么没有获取方法?其实是有的,不过目前还是beta特性(做事做一半是吧)。


控制TextPrimitive的属性

TextPrimitive本身有6个属性可用,在加上它继承自PrimitiveShape,总共有15个可以读取/修改的属性和2个只读属性。文本这种东西就不说了,我们先来看看颜色。

颜色
颜色有两种:文字颜色和背景颜色。文字颜色对应的属性是color,类型是RGBA,其中所有的值都在0-1区间。
textPrimitive.color = {
    red: 1,
    green: 0,
    blue: 0,
    alpha: 1
};

尽管alpha通道(不透明度)并不生效,但必须有。可以随便给个值,反正到游戏里会自动变成1。像上面这样,文字颜色就会变成红色。如果不知道有哪些颜色,可以随便找个在线工具,再把RGB的值除以255就可以了。
背景颜色就支持不透明度了,比如下面的代码可以把textPrimitive的背景变得完全透明。
textPrimitive.backgroundColorOverride = {
    red: 0,
    green: 0,
    blue: 0,
    alpha: 0 // 关键在这里
};

想要恢复默认把它设置成undefined就可以了。
textPrimitive.backgroundColorOverride = undefined;


位置、旋转与缩放
虽然在构造TextPrimitive时使用的是DimensionLocation,但实际上维度和位置是2个属性。
textPrimitive.location // 位置(Vector3),这是只读的!
textPrimitive.dimension // 维度(Dimension),这是只读的!

而且也不能直接改。要改的话必须使用setLocation方法。
textPrimitive.setLocation(/* 这里是DimensionLocation */);

旋转就可以直接读写,它的类型是Vector3,其中x、y、z分别对应俯仰角、偏航角、翻滚角。在这里很难解释清楚,所以就放张图。你也可以自己搜索。
4.png

要注意的是,要使用特定的旋转角,就必须先把属性useRotation设为false。否则,文字只会面向你。
缩放只能使用统一缩放,所以拉伸文字这样的效果是做不出来的。要让文字放大一倍,就可以这样写:
textPrimitive.scale = 2;


附着实体
TextPrimitive的attachedTo属性可以设置为一个实体。之后,这个TextPrimitive的位置就会跟随它变动,类似于用命名牌给实体命的名字。如果attachedTo属性不为undefined,则location属性就会用作偏移。
我们可以写一个简单的功能:如果实体受到伤害,就在它的头上显示伤害的数值(类似于伤害显示)。
关于实体受伤的事件,有afterEvents.entityHurt可以用。
world.afterEvents.entityHurt.subscribe(event => {
    // ...
});

获取实体的AABB(轴对齐包围盒,类似于碰撞箱),构造并确定TextPrimitive的偏移位置。
world.afterEvents.entityHurt.subscribe(event => {
    const AABB = event.hurtEntity.getAABB();
    const textPrimitive = new TextPrimitive({
        dimension: event.hurtEntity.dimension,
        x: 0,
        y: AABB.extent.y * 2 + 0.5,
        z: 0
    }, event.damage.toFixed(2));
});

设置attachedTo属性并显示。
world.afterEvents.entityHurt.subscribe(event => {
    // 省略前面的代码
    textPrimitive.attachedTo = event.hurtEntity;
    world.primitiveShapesManager.addText(textPrimitive, textPrimitive.dimension);
});

在1秒后清除TextPrimitive。
world.afterEvents.entityHurt.subscribe(event => {
    // 省略前面的代码
    system.runTimeout(() => {
        textPrimitive.remove();
    }, 20);
});

效果图:
3.jpeg




THE END

TextPrimitive还有很多属性我们没有说,它们有些还可以做出其他的效果,这就要自己去查阅
文档了。



苦力怕论坛,感谢有您~

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

| 由 木韩网络 提供支持 | GMT+8, 2026-7-24 20:22

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4