先要说明的是,它有几个硬伤:一个是不能保存。无论是退出重进还是执行命令/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,就必须有它的对象引用,所以在控制多个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分别对应俯仰角、偏航角、翻滚角。在这里很难解释清楚,所以就放张图。你也可以自己搜索。
要注意的是,要使用特定的旋转角,就必须先把属性useRotation设为false。否则,文字只会面向你。
缩放只能使用统一缩放,所以拉伸文字这样的效果是做不出来的。要让文字放大一倍,就可以这样写:
附着实体
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);
});