イベント
はじめに
イベントは、柔軟なリスナーとディスパッチシステムを通じて、エンティティが互いに通信する方法です。イベント・リスナー
リスナー
プロパティ | タイプ | 説明 |
---|---|---|
ターゲット | イード | イベントがディスパッチされたエンティティ。 |
カレントターゲット | イード | イベントがリッスンされたエンティティ。 |
名称 | ストリング | イベント名 |
データ | いずれも | イベント・カスタム・データ |
イベント・リスナーの作成
追加リスナー
world.events.addListener(target, name, listener)
パラメータ
チップ
world.events.globalId\`をターゲットとして、グローバル・イベント・リスナーを作成することができる。
プロパティ | タイプ | 説明 |
---|---|---|
ターゲット | イード | ターゲット・エンティティへの参照。 |
名称 | ストリング | リッスンするイベント名。 |
リスナー | リスナー | イベントがトリガーされたときのコールバック関数 |
イベントハンドラの作成
エンティティにイベントリスナーを追加する場合、特にコンポーネントが複数のエンティティに追加される場合は、意図したとおりに機能するようにハンドラを正しく設定することが重要です。 ハンドラーの不適切な作成は、陳腐な参照や予期せぬ動作につながる可能性がある。
例えば、NPCエンティティのハンドラを作成し、破損イベントをリッスンするとします。 ハンドラは、イベントが発生したときに、いくつかのスキーマとデータ値を更新しなければならない。
誤った例
import * as ecs from '@8thwall/ecs'
import { addCleanup, doCleanup } from './cleanup'
ecs.registerComponent({
name: 'npc',
schema: {
isInjured: ecs.boolean,
}
data: {
bpm: ecs.f32,
}
add: (world, component) => {
// ハンドラの作成が正しくない
const damagedHandler = (e) => {
component.schema.isInjured = true
component.data.bpm += 30
}
world.events.addListener(component.eid, 'damaged', damagedHandler)
const cleanup = () => {
world.events.removeListener(component.eid, 'damaged', damagedHandler)
}
addCleanup(component, cleanup)
},
remove: (world, component) => {
doCleanup(component)
},
})