コンテンツへスキップ

useGamepad

カテゴリ
エクスポートサイズ
1.25 kB
最終更新日
先週

Gamepad APIのためのリアクティブなバインディングを提供します。

デモ

このデバイスではGamepadはサポートされていません。お使いのデバイスではGamepad APIがサポートされていないようです。こちらでサポートされているデバイスのリストを確認してください。

使用方法

Gamepad APIの動作方法により、検出される前にゲームパッドを使用してページと対話する必要があります。

vue
<script setup>
import { useGamepad } from '@vueuse/core'
import { computed } from 'vue'

const { isSupported, gamepads } = useGamepad()
const gamepad = computed(() => gamepads.value.find(g => g.mapping === 'standard'))
</script>

<template>
  <span>
    {{ gamepad.id }}
  </span>
</template>

ゲームパッドの更新

現在、Gamepad APIにはゲームパッドの状態を更新するためのイベントサポートがありません。ゲームパッドの状態を更新するには、`requestAnimationFrame`を使用してゲームパッドの変更をポーリングします。このポーリングは、`useGamepad`によって提供される`pause`関数と`resume`関数を使用して制御できます。

ts
import { useGamepad } from '@vueuse/core'

const { pause, resume, gamepads } = useGamepad()

pause()

// gamepads object will not update

resume()

// gamepads object will update on user input

ゲームパッドの接続と切断イベント

`onConnected`イベントと`onDisconnected`イベントは、ゲームパッドが接続または切断されたときにトリガーされます。

ts
const { gamepads, onConnected, onDisconnected } = useGamepad()

onConnected((index) => {
  console.log(`${gamepads.value[index].id} connected`)
})

onDisconnected((index) => {
  console.log(`${index} disconnected`)
})

振動

Gamepad Haptics APIはまばらなので、使用する前に互換性表を確認してください。

ts
import { computed } from 'vue'

const supportsVibration = computed(() => gamepad.hapticActuators.length > 0)
function vibrate() {
  if (supportsVibration.value) {
    const actuator = gamepad.hapticActuators[0]
    actuator.playEffect('dual-rumble', {
      startDelay: 0,
      duration: 1000,
      weakMagnitude: 1,
      strongMagnitude: 1,
    })
  }
}

マッピング

Gamepad APIの使いやすさを向上させるために、コントローラーのボタンレイアウトにコントローラーをマッピングするためのマッピングを提供します。

Xbox360コントローラー

vue
<script setup>
import { mapGamepadToXbox360Controller } from '@vueuse/core'

const controller = mapGamepadToXbox360Controller(gamepad)
</script>

<template>
  <span>{{ controller.buttons.a.pressed }}</span>
  <span>{{ controller.buttons.b.pressed }}</span>
  <span>{{ controller.buttons.x.pressed }}</span>
  <span>{{ controller.buttons.y.pressed }}</span>
</template>

現在、Xbox 360コントローラーのみのマッピングがあります。マッピングを追加したいコントローラーがある場合は、より多くのコントローラーマッピングのPRを作成してください。

型宣言

型宣言を表示
typescript
export interface UseGamepadOptions
  extends ConfigurableWindow,
    ConfigurableNavigator {}
/**
 * Maps a standard standard gamepad to an Xbox 360 Controller.
 */
export declare function mapGamepadToXbox360Controller(
  gamepad: Ref<Gamepad | undefined>,
): ComputedRef<{
  buttons: {
    a: GamepadButton
    b: GamepadButton
    x: GamepadButton
    y: GamepadButton
  }
  bumper: {
    left: GamepadButton
    right: GamepadButton
  }
  triggers: {
    left: GamepadButton
    right: GamepadButton
  }
  stick: {
    left: {
      horizontal: number
      vertical: number
      button: GamepadButton
    }
    right: {
      horizontal: number
      vertical: number
      button: GamepadButton
    }
  }
  dpad: {
    up: GamepadButton
    down: GamepadButton
    left: GamepadButton
    right: GamepadButton
  }
  back: GamepadButton
  start: GamepadButton
} | null>
export declare function useGamepad(options?: UseGamepadOptions): {
  isSupported: ComputedRef<boolean>
  onConnected: EventHookOn<number>
  onDisconnected: EventHookOn<number>
  gamepads: Ref<
    {
      readonly axes: ReadonlyArray<number>
      readonly buttons: readonly {
        readonly pressed: boolean
        readonly touched: boolean
        readonly value: number
      }[]
      readonly connected: boolean
      readonly id: string
      readonly index: number
      readonly mapping: GamepadMappingType
      readonly timestamp: DOMHighResTimeStamp
      readonly vibrationActuator: {
        playEffect: (
          type: GamepadHapticEffectType,
          params?: GamepadEffectParameters,
        ) => Promise<GamepadHapticsResult>
        reset: () => Promise<GamepadHapticsResult>
      }
    }[],
    | Gamepad[]
    | {
        readonly axes: ReadonlyArray<number>
        readonly buttons: readonly {
          readonly pressed: boolean
          readonly touched: boolean
          readonly value: number
        }[]
        readonly connected: boolean
        readonly id: string
        readonly index: number
        readonly mapping: GamepadMappingType
        readonly timestamp: DOMHighResTimeStamp
        readonly vibrationActuator: {
          playEffect: (
            type: GamepadHapticEffectType,
            params?: GamepadEffectParameters,
          ) => Promise<GamepadHapticsResult>
          reset: () => Promise<GamepadHapticsResult>
        }
      }[]
  >
  pause: Fn
  resume: Fn
  isActive: Readonly<Ref<boolean, boolean>>
}
export type UseGamepadReturn = ReturnType<typeof useGamepad>

ソース

ソースデモドキュメント

コントリビューター

Anthony Fu
wheat
Anthony Fu
Jelf
Aaron-zon
yue
Curt Grimes
Stefan
Antonin Rousset
丶远方
三咲智子

変更ログ

v12.0.0-beta.1 2024/11/21
0a9ed - feat!: Vue 2サポートの削除、バンドルの最適化、クリーンアップ (#4349)
v10.10.0 2024/5/27
2ccbd - 修正: ゲームパッドの状態修正のため、スプレッド演算子を回避 (#3913)
v10.8.0 2024年2月20日
9b8ed - 修正: データ更新ロジックの改善 (#3775)
8c735 - 修正: ゲームパッドインデックスが確実に利用可能であることを明示的に確認 (#3653)

MITライセンスの下でリリースされています。