모든 화면에서 이용할 수 있는 게임 개발

Android용 게임을 개발할 때 가능한 여러 플레이어 환경을 예상하고 플레이어의 실시간 상호작용 요구사항에 계속 대응하는 것이 중요합니다. 다양한 플레이어 환경을 지원하면 게임플레이 유연성을 향상하여 게임의 도달범위를 확장하는 데 도움이 됩니다.

플레이어 환경의 구체적인 차이점은 다음과 같습니다.

  • 기기 폼 팩터: 휴대전화가 기존 Android 기기 환경을 제공하지만 다른 폼 팩터에서 게임과 상호작용할 수 있습니다. ChromeOS 기기는 게임을 표시하는 Android 컨테이너를 실행할 수 있습니다. Android를 실행할 수 있는 태블릿은 다양한 수준의 충실도를 지원합니다. Android TV 기기는 매우 상세하고 몰입도가 높은 환경을 지원합니다. 플레이어가 디스플레이 확장 도구를 사용하여 멀티 윈도우 환경을 시뮬레이션할 수 있습니다. 또한 폴더블 기기를 사용하는 경우 플레이어가 게임플레이 세션 중에 화면의 크기를 변경할 수 있습니다.
  • 상호작용 방법: 플레이어가 기기의 화면을 터치하여 입력 값을 제공하거나 마우스, 터치패드, 키보드 또는 컨트롤러를 사용할 수도 있습니다. 또한 디스플레이 확장 도구와 폴더블 기기로 플레이어가 더 큰 화면에서 게임을 경험할 수 있어서 더 긴 게임플레이 세션과 더 복잡한 인터페이스를 실현할 수 있습니다.
  • 하드웨어 지원: 일부 Android 지원 기기에는 후면 카메라, GPS, 네트워크 연결과 같이 휴대기기에서 흔히 볼 수 있는 기능이 없습니다. 게임이 사용 가능한 하드웨어에 맞게 조정되고 특정 기능을 사용할 수 없는 상황을 적절하게 처리해야 합니다.

이 가이드에서는 다양한 유형의 화면 및 사용자 상호작용을 위한 게임 개발과 관련된 권장사항을 제공합니다. 또한 게임 디자인 및 효과적인 테스트 전략 개발에 관한 제안사항을 제공합니다.

게임 디자인 권장사항

게임 디자인 및 아키텍처를 계획할 때 다음 섹션에 설명된 권장사항을 따르세요.

수동으로 구성 변경에 응답

Android 시스템에서 화면 크기, 화면 방향 또는 입력 방법 변경과 같은 구성 변경을 감지하면 시스템이 기본적으로 현재 활동을 다시 시작합니다. 앱 또는 게임 내에서 상태를 유지하려면 활동이 다시 시작되기 전에 기본적으로 onSaveInstanceState()를 호출하고 다시 시작된 후 onRestoreInstanceState()를 호출합니다. 그러나 이 프로세스를 실행하려면 활동이 관련된 모든 서비스 및 리소스를 새로고침해야 합니다. 이 기본 동작에 관해 자세히 알아보려면 구성 변경 처리 가이드를 참고하세요.

일반적인 게임플레이 세션에는 몇 가지 구성 변경이 적용됩니다. 게임이 시스템에서 각 구성 변경을 처리하도록 하면 게임의 장면이 제거되고 계속해서 다시 시작되어 게임의 성능이 저하됩니다. 이와 같은 이유로 게임에서 직접 이러한 구성 변경을 처리하도록 적극 권장합니다.

이 구성 변경 로직을 게임에 추가하는 방법을 알아보려면 맞춤 구성 변경 핸들러를 만드는 방법에 관한 섹션을 참고하세요.

유연한 아키텍처 만들기

가능한 한 많은 기기에서 개발자님의 게임을 지원하도록 하려면 다음 권장사항을 따르세요.

  • 개별 APK 대신 Android App Bundle을 배포하세요. Android App Bundle을 사용하면 다양한 해상도 및 다양한 아키텍처 모델(예: x86, ARM)의 아티팩트를 단일 아티팩트로 패키징할 수 있습니다. 더 좋은 점은 Android App Bundle이 게임과 관련된 더 큰 크기 제한을 지원한다는 것입니다. 각 기본 APK의 크기는 최대 150MB일 수 있고 번들 자체의 크기는 몇 GB일 수 있습니다.
  • x86 아키텍처 지원을 추가하세요. 이 단계는 ARM을 지원하지 않는 기기에서 게임의 성능을 향상시킵니다. 이제 이러한 기기는 먼저 명령을 변환할 필요 없이 명령을 실행할 수 있기 때문입니다.

Vulkan 지원 추가

Vulkan을 지원하면 게임의 그래픽 성능이 향상될 수 있습니다. 대부분의 기기는 이 그래픽 API를 지원합니다.

맞춤 구성 변경 핸들러 만들기

게임에서 직접 처리하는 구성 변경 유형을 선언하려면 화면이나 복잡한 인터페이스를 나타내는 매니페스트의 각 <activity> 요소에 android:configChanges 속성을 추가합니다.

다음 코드 스니펫은 게임이 화면 크기, 화면 방향 및 입력 방법 변경을 처리한다고 선언하는 방법을 보여줍니다.

<activity ...
    android:configChanges="screenSize|orientation|keyboard|keyboardHidden">
</activity>

선언된 구성 변경이 발생할 때 이제 시스템에서 다른 메서드 onConfigurationChanged()를 호출합니다. 이 메서드 내에 게임의 UI를 업데이트하는 로직을 추가하세요.

화면 구성 변경 처리

android:configChanges 속성에 screenSizeorientation 값을 각각 포함할 때마다 게임이 화면 크기 및 화면 방향 변경을 수동으로 처리합니다. 이러한 새 값을 사용하여 장면의 콘텐츠 및 플레이어의 입력 영역을 업데이트할 수 있습니다. 더 쉽게 업데이트할 수 있도록 게임의 레이아웃을 디자인하는 방법에 관한 안내는 다양한 화면 크기 지원 가이드를 참고하세요.

게임의 onConfigurationChanged() 구현에서, 전달된 Configuration 객체와 창 관리자의 Display 객체를 사용하여 화면 크기와 화면 방향의 업데이트된 값을 각각 확인합니다.

다음 코드 스니펫은 게임의 업데이트된 화면 크기와 방향을 얻는 방법을 보여줍니다.

Kotlin

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    val density: Float = resources.displayMetrics.density
    val newScreenWidthPixels = (newConfig.screenWidthDp * density).toInt()
    val newScreenHeightPixels = (newConfig.screenHeightDp * density).toInt()

    // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
    // Configuration.ORIENTATION_LANDSCAPE.
    val newScreenOrientation: Int = newConfig.orientation

    // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180,
    // or ROTATION_270.
    val newScreenRotation: Int = windowManager.defaultDisplay.rotation
}

Java

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    float density = getResources().getDisplayMetrics().density;
    int newScreenWidthPixels = (int) (newConfig.screenWidthDp * density);
    int newScreenHeightPixels = (int) (newConfig.screenHeightDp * density);

    // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
    // Configuration.ORIENTATION_LANDSCAPE.
    int newScreenOrientation = newConfig.orientation;

    // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180,
    // or ROTATION_270.
    int newScreenRotation = getWindowManager().getDefaultDisplay()
            .getRotation();
}

폴더블 기기의 포즈를 변경하면 앱을 전체 화면 모드로 실행 중인 경우에도 구성이 변경됩니다. 따라서 게임이 실행되는 동안 사용자가 기기를 접거나 펼치면 앱이 화면 크기 또는 픽셀 밀도의 변경사항을 처리해야 할 수 있습니다.

게임별 화면 품질

다음 섹션에서는 게임이 게임의 품질에 따라 화면 크기 또는 화면 방향 변경에 어떻게 반응하는지를 조정하는 방법을 설명합니다.

전체 화면 모드

ChromeOS와 같은 일부 플랫폼에서는 기본적으로 Android 앱 및 게임에 창이 있고 크기를 조절할 수 있습니다. 게임이 항상 전체 화면 모드에서 실행되어야 한다면 다음 코드 스니펫과 같이 <activity> 요소 중 하나에서 android:resizeableActivity 속성을 false로 설정하면 됩니다.

<activity ...
    android:resizeableActivity="false">
</activity>

android:resizeableActivity 속성을 false로 설정하여 크기 기반 구성 변경이 발생하는 것을 방지할 수도 있습니다. 그러나 게임이 항상 전체 화면 모드에서 실행되는 경우가 아니면 테스트 목적으로 이 속성을 임시 수정으로만 추가해야 합니다.

화면 방향

게임이 특정 방향의 기기 센서에 의존하는 경우 다음 코드 스니펫과 같이 게임의 활동에서 android:screenOrientation 값을 지정하세요. 이 설정은 게임의 장면이 예기치 않게 뒤집히지 않도록 하는 데 도움이 됩니다.

<activity ...
    android:screenOrientation="landscape">
</activity>

기기별 화면 품질

다음 섹션에서는 일부 기기의 특정 품질을 고려하여 화면 기반 구성 변경을 처리하는 방법을 설명합니다.

가로세로 비율

일부 기기에서는 여러 가로세로 비율을 지원합니다. 예를 들어, 폴더블 기기는 접힌 상태에서 21:9의 가로세로 비율을 지원하도록 설계되었습니다. 이 잠재적으로 다양한 가로세로 비율을 처리하려면 다음 중 하나 이상을 실행하세요.

  • Android 8.0(API 수준 26) 이상을 타겟팅합니다.
  • 게임의 장면과 인터페이스의 크기를 조절할 수 있도록 합니다. Android 7.0(API 수준 24) 이상을 실행하는 기기에서 android:resizeableActivitytrue로 설정합니다.
  • 지원되는 최대 가로세로 비율을 선언합니다. 게임과 연결된 <meta-data> 속성에서 다음 코드 스니펫과 같이 android.max_aspect2.4로 설정합니다. 그러나 가로세로 비율이 지정한 것보다 크면 게임이 디스플레이 내에서 레터박스 처리되어 표시됩니다.

    <application>
    <meta-data android:name="android.max_aspect"
               android:value="2.4" />
    </application>
    

동시에 여러 활동 표시

많은 최신 기기가 화면 분할, PIP 모드 및 대형 디스플레이 영역을 비롯한 다양한 화면 레이아웃을 지원합니다. 이러한 레이아웃 중 하나를 사용하는 경우 시스템에서 여러 활동이 동시에 표시되도록 할 수 있습니다.

Android 9(API 수준 28) 이상을 실행하는 기기에서는 맨 위에 표시되는 모든 활동이 동시에 재개될 수 있습니다. 그러나 이 동작이 작동하려면 게임 및 기기의 OEM이 모두 이 기능을 선택해야 합니다. 다음 코드 스니펫과 같이 게임의 매니페스트에서 android.allow_multiple_resumed_activitiestrue로 설정하여 게임 내에 지원을 추가할 수 있습니다.

<application>
    <meta-data android:name="android.allow_multiple_resumed_activities"
               android:value="true" />
</application>

그런 다음, 여러 기기에서 게임을 테스트하여 이 중에서 다중 재개가 올바르게 작동하는 데 필요한 OEM 지원을 제공하는 기기를 확인할 수 있습니다.

멀티 윈도우 디스플레이의 일부로 표시되도록 게임을 구성하는 방법을 자세히 알아보려면 멀티 윈도우 지원을 추가하는 방법에 관한 가이드를 참고하세요.

여러 유형의 상호작용 모델 처리

android:configChanges 속성에 keyboardkeyboardHidden 값을 각각 포함할 때마다 게임이 키보드 현재 상태 및 키보드 사용 가능 여부를 수동으로 처리합니다. 이러한 새 값을 사용하여 게임의 기본 입력 방법을 업데이트할 수 있습니다.

여러 유형의 사용자 입력을 지원하도록 게임을 구성할 때 다음 사항에 유의하세요.

  • 개별 기기가 아니라 입력 방법을 감지합니다. 이렇게 하면 플레이어가 보유하는 특정 기기에 너무 많이 집중하지 않고 보다 쉽게 플레이어 환경을 개선할 수 있습니다.
  • 수동으로 처리된 구성 변경 목록에 keyboardHidden 속성을 포함합니다. 이렇게 하면 키보드가 실제로 기기에 연결되어 있지만 사용할 수 없는 경우를 게임에서 추적할 수 있습니다.
  • 현재 사용 가능한 입력 방법을 확인합니다. 이렇게 하려면 게임 시작 시와 각 구성 변경 후에 getInputDeviceIds()를 호출합니다.

    종종 플레이어가 선호하는 입력 기기에 따라 게임과 상호작용할 방법을 결정할 수 있습니다.

    • 플레이어는 일반적으로 키보드 또는 게임 컨트롤러를 사용하여 빠른 버튼 시퀀스를 실행합니다.
    • 플레이어는 일반적으로 터치스크린 또는 터치패드를 사용하여 더 복잡한 동작을 실행합니다.
    • 플레이어는 일반적으로 마우스를 사용하여 정밀도가 높은 입력을 실행합니다.

다음 섹션에서는 특정 유형의 입력 기기에 관한 권장사항을 제공합니다.

키보드

게임용 키보드 레이아웃을 만들 때 플레이어가 지정된 장면을 탐색하는 방법과 플레이어가 게임의 설정과 상호작용하는 방법을 고려하세요.

일반적으로 WASD 키 또는 화살표 키는 문자 이동을 제어하는 데 가장 적합합니다. 또한 제어 가능한 문자가 게임 내에서 실행할 수 있는 각각의 중요한 작업 또는 기술에 특정 키를 할당하는 것이 가장 좋습니다. 플레이어 환경을 최대한 활용하려면 게임에 맞춤 키 바인딩 지원을 추가하는 것을 고려하세요.

또한 플레이어가 게임의 메뉴를 열고 키보드를 사용하여 탐색할 수 있어야 합니다. Esc 키는 장면을 일시중지하고 게임의 메뉴를 표시하기 위한 일반 매핑입니다.

게임에서 키보드 입력을 지원하는 방법을 자세히 알아보려면 키보드 탐색을 지원하는 방법에 관한 가이드키보드 작업을 처리하는 방법에 관한 가이드를 참고하세요.

게임 컨트롤러

게임에서 컨트롤러 입력을 처리하는 방법을 자세히 알아보려면 게임 컨트롤러를 지원하는 방법에 관한 가이드를 참고하세요.

마우스 또는 터치패드

게임이 마우스 또는 터치패드로부터의 플레이어 입력을 지원하는 경우 플레이어가 게임 플레이 이외의 방식으로 기기와 상호작용합니다. 포인터 캡처를 요청하면 모든 마우스 입력이 게임으로 전달된다는 점에 주의해야 합니다. 따라서 게임에 필요한 정보가 있으면 플레이어가 기기의 표준 마우스 제어를 다시 얻을 수 있도록 포인터 캡처를 해제하세요.

Android 8.0(API 수준 26) 이상을 실행하는 기기에서 Mouse Capture API를 사용하여 포인터 캡처 프로세스를 지원할 수 있습니다. 정밀도가 높은 입력에 반응하는 게임에서 getX()getY() 메서드를 호출하여 포인터의 현재 좌표를 가져올 수 있습니다.

게임에서 마우스 입력 및 터치패드 입력 지원을 추가하는 방법을 자세히 알아보려면 터치 및 포인터 이동을 추적하는 방법에 관한 가이드멀티 터치 동작을 처리하는 방법에 관한 가이드를 참고하세요.

게임 테스트

게임을 출시하기 전에 다음 섹션에 설명된 단계를 완료하여 게임이 구성 변경에 어떻게 반응하는지 테스트하세요.

테스트 계획 업데이트

게임의 기능을 검증할 때 다음 테스트 사례를 포함하세요.

  • 게임을 포함하는 창을 최소화하고 최대화합니다. (게임이 항상 전체 화면 모드인 경우에는 적용하지 않음)
  • 화면 크기를 변경합니다.
  • 화면 방향을 변경합니다. (게임 방향이 고정된 경우에는 적용하지 않음)
  • 키보드 및 마우스와 같은 입력 기기를 연결하고 연결 해제합니다.
  • 게임에서 지원하는 경우 다중 재개를 실행합니다.

또한 다양한 플레이어 환경에 맞게 최적화할 수 있도록 게임의 품질 관리 시스템 업데이트를 고려해 보세요.

게임 테스트와 관련된 권장사항은 테스트 기본 요소 가이드를 참고하세요.

테스트 및 디버깅 도구 사용

플랫폼에서 지원하는 다양한 도구를 사용하여 테스트를 실행할 수 있습니다.