概要

ゲーム コントローラには、プレーヤーの操作と没入感を大幅に向上させる追加機能が用意されています。Android ゲーム コントローラのハプティクス、モーション センサー、ライト機能は、ゲーム体験の深化と充実に特に効果的です。各機能はプレーヤーの感覚を独自に刺激し、ゲーム内でより有意義で直感的な操作を促進します。

ハプティクス

Android ゲーム コントローラのハプティクス機能は、ゲームプレイ中に現実的な触覚フィードバックを提供する重要なテクノロジーです。

ハプティクス技術は、バイブレーションや動作を通じてユーザーに物理的な感覚を提供します。たとえば、ゲーム内で爆発が発生すると、コントローラが振動し、プレーヤーは衝撃をリアルに感じられるようになります。また、小さなバイブレーションをキャラクターが歩いたり走ったりする音と同期して、よりリアルな体験を提供できます。この種の触覚フィードバックにより、プレーヤーはゲーム内で発生しているさまざまなイベントを物理的に感じられるようになります。

このテクノロジーにより、プレーヤーの没入感を最大化し、感情的な反応を増幅し、ゲームの力強さを強化できます。Android ゲーム コントローラのハプティクス設定は、ゲーム デベロッパーのクリエイティブな可能性を広げるだけでなく、これまで以上にリアルなゲーム体験をプレーヤーに提供します。

fun triggerVibrationMultiChannel(
  deviceId: Int, leftIntensity: Int, leftDuration: Int,
  rightIntensity: Int, rightDuration: Int) {
  val inputDevice = InputDevice.getDevice(deviceId)
  val vibratorManager = inputDevice!!.vibratorManager
  if (vibratorManager != null) {
    val vibratorIds = vibratorManager.vibratorIds
    val vibratorCount = vibratorIds.size
    if (vibratorCount > 0) {
      // We have an assumption that game controllers have two vibrators
      // corresponding to a left motor and a right motor, and the left
      // motor will be first.
      updateVibrator(vibratorManager.getVibrator(vibratorIds[0]), leftIntensity, leftDuration)
      if (vibratorCount > 1) {
        updateVibrator(vibratorManager.getVibrator(vibratorIds[1]), rightIntensity, rightDuration)
      }
    }
  }
}

fun updateVibrator(vibrator: Vibrator?, intensity: Int, duration: Int) {
  if (vibrator != null) {
    if (intensity == 0) {
      vibrator.cancel()
    } else if (duration > 0) {
      vibrator.vibrate(VibrationEffect.createOneShot(duration.toLong(), intensity))
    }
  }
}

バイブレーションを使用するには、機能と権限を設定します。

<application ...>
  ...
  <uses-feature android:name="android.hardware.gamepad" android:required="true"/>
  <uses-permission android:name="android.permission.VIBRATE"/>
  ...
</application>

詳しくは、VibratorManagerアプリ マニフェストをご覧ください。

モーション センサー

ゲームプレイ エクスペリエンスを向上させる最も革新的なテクノロジーの一つは、モーション センサーを搭載した Android ゲーム コントローラです。このテクノロジーは、ユーザーの物理的な動きを正確に検出し、そのデータをゲーム内のアクションに変換します。これにより、より直感的で没入感のあるゲーム エクスペリエンスを実現できます。この概要では、Android ゲーム コントローラのモーション センサー機能の仕組みについて説明します。

通常、モーション センサーにはジャイロスコープと加速度計が組み込まれており、ユーザーの動きや向きを検出します。

加速度とジャイロスコープのリスナークラスを実装し、これらのリスナーをコントローラのセンサー マネージャーに登録する必要があります。

fun setIntegratedAccelerometerActive(deviceId: Int) {
  val device = InputDevice.getDevice(deviceId)
  val sensorManager = device?.sensorManager
  val accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
  if (accelerometer != null) {
    val accelerometerListener =
      GameControllerAccelerometerListener(accelerometer)
    sensorManager.registerListener(
      accelerometerListener, accelerometer,
      SensorManager.SENSOR_DELAY_GAME
    )
  }
}

fun setIntegratedGyroscopeActive(deviceId: Int) {
  val device = InputDevice.getDevice(deviceId)
  val sensorManager = device?.sensorManager
  val gyroscope = sensorManager?.getDefaultSensor(Sensor.TYPE_GYROSCOPE)
  if (gyroscope != null) {
    val gyroscopeListener = GameControllerGyroscopeListener(gyroscope)
    sensorManager.registerListener(
      gyroscopeListener, gyroscope,
      SensorManager.SENSOR_DELAY_GAME
    )
  }
}

class GameControllerAccelerometerListener(private val listenerAccelerometer: Sensor?) :
  SensorEventListener {
  override fun onSensorChanged(event: SensorEvent) {
    if (listenerAccelerometer != null) {
      synchronized(listenerAccelerometer) {
        if (event.sensor == listenerAccelerometer) {
          Log.d("Accelerometer",
            "onSensorChanged " + event.values[0] + ", "
            + event.values[1] + ", " + event.values[2])
        }
      }
    }
  }

  override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
  }
}

class GameControllerGyroscopeListener(private val listenerGyroscope: Sensor?) :
  SensorEventListener {
  override fun onSensorChanged(event: SensorEvent) {
    if (listenerGyroscope != null) {
      synchronized(listenerGyroscope) {
        if (event.sensor == listenerGyroscope) {
          Log.d("Gyroscope",
            "onSensorChanged " + event.values[0] + ", " +
            event.values[1] + ", " + event.values[2])
        }
      }
    }
  }

  override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
  }
}

詳しくは、モーション センサーSensorEventListener をご覧ください。

照明

Android ゲーム コントローラのライトの色の設定により、視覚要素を通じてゲームプレイに新たな臨場感が加わります。

ライトの色機能では、コントローラに内蔵されている LED ライトを使用してさまざまな色を表示し、さまざまなゲームシナリオに動的に反応します。たとえば、プレーヤーの健全性が重要なときにライトが赤色で点滅し、特定のミッションが完了すると緑色で点滅し、ゲーム内イベントに基づいて視覚的なフィードバックを提供できます。このような明るい色の設定により、ユーザー エンゲージメントが深まり、ゲームのサスペンスと楽しさが高まり、プレーヤーがゲームの世界に没頭できるようになります。

Android ゲーム コントローラのライトカラー機能は、単なる装飾目的ではありません。ゲームの雰囲気を演出し、ユーザー エクスペリエンスを向上させるうえで重要な役割を果たします。

fun changeControllerLightColor(deviceId: Int, color: Int) {
  val device = InputDevice.getDevice(deviceId)
  device?.let {
    if (it.sources and InputDevice.SOURCE_JOYSTICK == InputDevice.SOURCE_JOYSTICK) {
      val lightsManager = device.lightsManager
      lightsManager?.let { manager ->
        manager.lights.forEach { light ->
          val stateBuilder = LightState.Builder()
          stateBuilder.setColor(color)
          val requestBuilder = LightsRequest.Builder()
          requestBuilder.addLight(light, stateBuilder.build())
          val lightsSession = lightsManager.openSession()
          lightsSession.requestLights(requestBuilder.build())
        }
      }
    }
  }
}

バイブレーションを使用するには、機能と権限を設定します。

<application ...>
  ...
  <uses-feature android:name="android.hardware.gamepad" android:required="true"/>
  <uses-permission android:name="android.permission.LIGHTS" />
  ...
</application>

詳しくは、LightsManagerアプリ マニフェストをご覧ください。

コントローラのタッチパッド

一部のゲーム コントローラにはタッチパッドが搭載されており、メニューを操作したり、より直感的にゲーム キャラクターを操作したりするなど、ゲーム内のさまざまなアクションに使用できます。

ゲーム コントローラのタッチパッド。
図 1. ゲーム コントローラのタッチパッド

タッチパッドが統合されたゲーム コントローラでは、Android でデバイスを直接制御できます。タッチパッドをタップすると、画面上にマウスポインタが生成され、マウスのような直感的なナビゲーションが可能になります。