總覽

遊戲控制器提供額外功能,可大幅改善玩家的互動和沈浸感。Android 遊戲控制器的觸覺技術、動作感應器和光源功能特別有助於強化並充實遊戲體驗。每項功能都會以獨特的方式刺激玩家的感官,讓玩家能在遊戲中實現更有意義的互動。

觸覺回饋

Android 遊戲控制器的觸覺技術是非常重要的技術,可以在遊戲過程中提供真實的觸覺回饋。

Haptics 技術會透過震動或動作為使用者提供肢體動作。舉例來說,當遊戲發生爆炸時,控制器會震動,讓玩家感覺到逼真的效果。此外,輕微震動還能與角色走路或跑步時的音效保持同步,提供更生動的體驗。這類觸覺回饋能讓玩家感受到遊戲中各種事件。

這項技術能盡量提升玩家的沉浸感、加強情緒反應,並充實遊戲的動態效果。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 上控制裝置。輕觸觸控板會產生螢幕上的滑鼠遊標,方便使用者實現直覺的滑鼠導覽。