개요

게임 컨트롤러에는 게임 성능을 크게 향상시키는 플레이어 상호작용과 몰입도를 향상하세요. 햅틱, 움직임 감지 센서, 조명 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 터치패드를 터치하면 화면상의 마우스 포인터가 생성되어 를 사용합니다.