개요

게임 컨트롤러에는 플레이어 상호작용과 몰입도를 크게 향상시키는 추가 기능이 장착되어 있습니다. 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에서 직접 기기 제어 기능을 제공합니다. 터치패드를 터치하면 화면에 마우스 포인터가 생성되어 마우스와 유사한 직관적인 탐색이 가능합니다.