カスタム・コンポーネント
はじめに
カスタムコンポーネントを作成する際の一般的な問題とベストプラクティス。陳腐なリファレンス
コンポーネントに (world, component)
を渡してコールバックを追加、チック、削除する場合、ネストされた関数の中で component
を参照し、コールバックが返った後にそれを使用するのは必ずしも安全ではありません。
誤った例
ecs.registerComponent({
name: 'age-counter',
data:{
age: ecs.i32,
interval: ecs.i32,
},
add: (world, component) => {
const interval = world.time.setInterval(() => {
// ある程度時間が経過した後にデータにアクセスしているので、これは安全ではない。
// まだ有効である保証はない。
component.data.age += 1
}, 1000)
// これはadd関数内でデータに代入しているので安全
component.data.interval = interval
},
tick: (world, component) => {
console.log('I am', component.data.age, 'seconds old')
},
remove: (world, component) => {
world.time.clearTimeout(component.data.interval)
}.
})