订阅变更
检测组件中的变化,并在每次变化时运行函数
一种编写代码的简洁方式是订阅事件,并在事件发生时运行一个函数。
一些 事件监听器 作为 SDK 的一部分预定义好了,但你也可以使用 onChange() 方法作用于任何组件上即可实现同样效果。这同样适用于任何 自定义组件 你定义的组件,而无需额外工作。
例如,以下函数会检查 AvatarEquippedData 玩家实体上的组件,并在玩家更换其已装备的穿戴物品或表情时运行一个函数。组件的新值会作为函数参数传入。
import { AvatarEquippedData } from '@dcl/sdk/ecs'
export function main() {
AvatarEquippedData.onChange(engine.PlayerEntity, (equipped) => {
if (!equipped) return
console.log('新的穿戴物列表:', equipped.wearableUrns)
console.log('新的表情列表:', equipped.emoteUrns)
})
}多亏了 onChange() 方法,无需创建系统并在每一帧迭代检查新值,它极大地简化了这个非常常见的用例。
同样的方法也可直接用于 自定义组件。例如:
// 定义组件
export const MyComponent = engine.defineComponent('myComponent', {
value1: Schemas.Boolean,
value2: Schemas.Float,
})
// 用法
export function main() {
// 创建实体
const myEntity = engine.addEntity()
// 创建该组件的实例
MyComponent.create(myEntity, {
value1: true,
value2: 10,
})
// 订阅更改
MyComponent.onChange(myEntity, (componentData) => {
if (!componentData) return
console.log(componentData.value1)
console.log(componentData.value2)
})
}你也可以将此方法与 查询组件结合使用,以便将场景中拥有某个特定组件的每个实体批量订阅到各自的函数。
请注意,此方法只会订阅 onChange() 场景开始时已存在的实体,例如通过该 UI 创建的实体 Creator Hub.
最后更新于