BE教程

Concepts of SAPI: Properties & DynamicProperties

牢***版主 发表于 2025-8-31 · 最后回复 2025-8-31 IP:北京 2,315 1
AI 速览2026-09-19 04:01 生成

讲解 SAPI 脚本中属性与自定义属性的区别及用法

这篇教程面向已会使用 SAPI 脚本的开发者,梳理了实体与物品堆栈中属性(Properties)和自定义属性(DynamicProperties)的概念差异。文中说明属性只能存一种类型、需在行为包中定义,而自定义属性以 NBT 形式存于存档且类型可变,并用狼的声音变体与拉弓传送两个示例演示 setProperty 和 setDynamicProperty 的写法。适合想弄清这两组方法该在什么场景使用的脚本作者参考。

  • 演示代码基本符合 @minecraft-server-2.0.0 以后的格式
  • 需具备 SAPI 脚本使用基础,可直接复制到 .js 文件试验
  • 官方文档字段后带半角冒号为必填,带问号加冒号可留空
本卡片由 AI 阅读本帖后生成,可能存在疏漏,请以帖子正文为准。
本帖最后由 牢冥王 于 2026-7-23 10:02 编辑

前言
在SAPI的脚本中,可以发现物品堆栈类(ItemStack Class)和实体类(Entity Class)都有.getDynamicProperty()和.setDynamicProperty()方法;而只有实体类有.getProperty()和.setProperty()方法。它们分别对应的是“自定义属性(DynamicProperties,有时也作CustomProperties)”和“属性(Properties)”的概念。注意,这里介绍的并不等同于JavaScript定义中的属性。
讲述
首先我们需要知道,属性和组件(Components)不同,组件可以与多种数据交互或储存,而属性只能储存一种类型的数据。让我们查看官方文档中的定义: 屏幕截图 2025-08-31 165702.png
其中三维向量类是一种包含x、y、z三个属性的对象,我们知道一个属性只能对应一种类型的数值。自定义属性会以数据的形式储存在存档中的实体或物品NBT的标签组下,之所以叫动态(Dynamic)属性,是因为它存储的数据可以随时更改类型,而不是指定的一种类型。而属性在实体和方块中都有所体现,不过方块用的是一组属性的概念:序列(Permutation)。在实体类的文档中,我们可以看到: 屏幕截图 2025-08-31 172844.png
这些属性通常要在相应的行为包文件中定义,且类型已经指定为一种了。我们拿狼举例: 屏幕截图 2025-08-31 195349.png
其中某些属性会在驯服后改变,行为包事件也为属性增加了新关键字:“set_property”。不过,这里主讲的是SAPI中对属性的运用,感兴趣可以去官方github仓库查看原版的实体文件。
应用
我们知道定义文件中狼存在3个布尔值属性,1个枚举属性。它们分别用于决定是否可以给其装备狼铠、是否增加狼的最大生命值(在原版行为中驯服后就会增加狼的最大生命值)、狼的声音变体,以及标记是否已在1.21.100更新过该狼实体。
我们可以借助.setProperty()方法来使其变为使用“可爱”声音变体的狼:
  1. import { world, system } from "@minecraft/server"
  2. system.runInterval(() => {
  3.   const wolf = world.getEntity("狼的唯一标识符")
  4.   wolf.setProperty("minecraft:sound_variant", "cute")
  5. })
复制代码

其中获得狼实体的方法仅演示用,个人不推荐用world.getEntity()方法,因为有其他方法可以直接获得实体,而实体的唯一标识符通常是要先获取实体才能得到。对于自定义属性,因为原版中没有定义这样的属性(即使你在实体行为文件中定义的新属性也不叫“DynamicProperty”,不过这样的属性在原版中也没有相应的作用),所以你需要借助SAPI来定义它的效果。比如:
  1. import { world } from "@minecraft/server"
  2. world.afterEvents.itemUse.subscribe(event => {
  3.   event.itemStack.setDynamicProperty("tpspot", { x: 1, y: 1, z: 1 })
  4.   if (event.itemStack.typeId === "minecraft:bow") {
  5.     event.source.teleport(event.itemStack.getDynamicProperty("tpspot"))
  6.   }
  7. })
复制代码

这样你在拉弓的时候就会传送至坐标为1,1,1的位置。
总结
在这里先打一个小补丁,官方文档中的字段后面是半角冒号的,表示该字段的参数是必填项,带半角问号和半角冒号的表示该字段的参数可以不填,也就是可以留空(或设置为null)。以上的演示代码基本符合@minecraft-server-2.0.0以后的格式,如果你知道如何使用SAPI脚本就可以直接复制到.js文件中进行试验。

  • 小*** 铁粒 +20 原创奖励
回复 1 最早 最新 只看楼主
您需要登录后才可以回帖 登录 | 立即注册
本版积分规则