メインコンテンツまでスキップ

useAppEvent

useAppEvent フックを使用すると、適切な TypeScript 型付けと自動クリーンアップを備えた PlayCanvas アプリケーションイベントにサブスクライブできます。ビルトインイベントとカスタムイベントの両方をサポートしています。

基本的な使い方

import { useAppEvent } from '@playcanvas/react/hooks'

function MyComponent() {
useAppEvent('update', (dt) => {
console.log('Frame time:', dt)
})

useAppEvent('prerender', () => {
console.log('Pre-rendering')
})

return null
}

パラメータ

  • event (TEventName) - サブスクライブするイベント名
  • callback (TEventMap[TEventName]) - イベント発火時に実行するコールバック関数

ビルトインイベント

Update イベント

import { useAppEvent } from '@playcanvas/react/hooks'

function UpdateHandler() {
useAppEvent('update', (dt) => {
// dt は前のフレームからのデルタタイム
console.log('Delta time:', dt)

// 更新ロジックをここに記述
// 毎フレーム実行されます
})

return null
}

Render イベント

import { useAppEvent } from '@playcanvas/react/hooks'

function RenderHandler() {
useAppEvent('prerender', () => {
console.log('About to render frame')
// プリレンダーロジック
})

useAppEvent('postrender', () => {
console.log('Finished rendering frame')
// ポストレンダーロジック
})

return null
}

カスタムイベント

TypeScript でカスタムイベント型を定義できます:

import { useAppEvent } from '@playcanvas/react/hooks'

// カスタムイベントマップを定義
interface MyEventMap {
levelComplete: (level: number, score: number) => void
playerDeath: (position: [number, number, number]) => void
itemCollected: (itemId: string, quantity: number) => void
}

function GameEventHandler() {
useAppEvent<MyEventMap>('levelComplete', (level, score) => {
console.log(`Level ${level} completed with score ${score}`)
})

useAppEvent<MyEventMap>('playerDeath', (position) => {
console.log('Player died at position:', position)
})

useAppEvent<MyEventMap>('itemCollected', (itemId, quantity) => {
console.log(`Collected ${quantity} of item ${itemId}`)
})

return null
}

イベントの発火

カスタムイベントを発火するには、app インスタンスへのアクセスが必要です:

import { useAppEvent, useApp } from '@playcanvas/react/hooks'

function EventFirer() {
const app = useApp()

useAppEvent('update', (dt) => {
// カスタムイベントを発火
app.fire('levelComplete', 1, 1000)
app.fire('playerDeath', [0, 0, 0])
app.fire('itemCollected', 'coin', 1)
})

return null
}

入力処理

import { useAppEvent } from '@playcanvas/react/hooks'

interface InputEvents {
keyDown: (key: string) => void
keyUp: (key: string) => void
mouseClick: (x: number, y: number) => void
mouseMove: (x: number, y: number) => void
}

function InputHandler() {
useAppEvent<InputEvents>('keyDown', (key) => {
console.log('Key pressed:', key)
})

useAppEvent<InputEvents>('keyUp', (key) => {
console.log('Key released:', key)
})

useAppEvent<InputEvents>('mouseClick', (x, y) => {
console.log('Mouse clicked at:', x, y)
})

useAppEvent<InputEvents>('mouseMove', (x, y) => {
console.log('Mouse moved to:', x, y)
})

return null
}

関連

  • useApp - Application インスタンスにアクセスする
  • Application Events - PlayCanvas アプリケーションイベントのドキュメント