Version: 2021.3
언어: 한국어
JAR 플러그인
Android용 Native(C++) 플러그인

UnityPlayerActivity Java 코드의 확장

이 페이지는 다음의 섹션으로 구성됩니다.

UnityPlayerActivity 파일 확장

Unity Android 애플리케이션을 개발할 때 플러그인을 사용하여 표준 UnityPlayerActivity 클래스(Android에서 Unity 플레이어의 기본 Java 클래스로 Unity iOS의 AppController.mm과 유사)를 확장할 수 있습니다. 애플리케이션은 Android OS와 Unity Android 애플리케이션 간의 모든 기본 상호작용을 오버라이드할 수 있습니다.

기본 동작을 오버라이드하려면 다음을 수행하십시오.

  • UnityPlayerActivity에서 파생되는 새로운 Activity를 만듭니다. 활동에 대한 Android 문서를 참조하십시오.
  • Android 앱 매니페스트를 수정하여 새로운 Activity를 애플리케이션의 엔트리 포인트로 지정합니다.

이를 위한 가장 쉬운 방법은 Unity에서 프로젝트를 익스포트한 후 Android Studio에서 UnityPlayerActivity 클래스를 수정하는 것입니다. 또는 새로운 클래스를 만들고 확장하여 unityLibrary 프로젝트에 있는 AndroidManifest.xml을 수정한 후 UnityPlayerActivity를 클래스로 대체합니다.

새로운 Activity로 플러그인을 만들어 프로젝트에 추가하려면 다음 단계를 수행하십시오.

  1. UnityPlayerActivity 파일을 확장합니다. Unity에서 프로젝트를 익스포트한 후 Android Studio에서 하는 것이 가장 좋습니다. 그러면 다음과 같은 옵션이 있습니다.
    • Activity 클래스가 포함된 .java 파일이나 .kt 파일을 Unity 프로젝트에 바로 넣습니다. 기본적으로 파일은 다음의 주소에 있습니다.
      • macOS::/Applications/Unity/Unity.app/Contents/PlaybackEngines/AndroidPlayer/src/com/unity3d/player
      • Windows:: C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\src\com\unity3d\player
    • 클래스가 포함된 Java 라이브러리 하나를 생성하고 컴파일하여 결과 .jar 파일을 Unity 프로젝트에 넣습니다.
    • Android 라이브러리 생성에 클래스가 포함되어 있습니다. 그러면 이 라이브러리를 소스 코드에 있는 Unity 프로젝트에 넣을 수 있습니다. 이렇게 하려면 폴더 이름을 .androidlib 확장으로 하거나 컴파일하여 결과 .aar 파일을 Unity 프로젝트에 넣을 수 있습니다.
  2. 새로운 Android 앱 매니페스트를 생성하여 새 Activity를 애플리케이션의 엔트리 포인트로 설정한 후 AndroidManifest.xml 파일을 프로젝트의 Assets/Plugins/Android 폴더에 배치합니다.

커스텀 UnityPlayerActivity 파일의 Unity 시작 인자 지정

UnityPlayerActivity를 확장하는 경우 String UnityPlayerActivity.updateUnityCommandLineArguments(String cmdLine)를 오버라이드하여 시작 인자를 Unity에 전달할 수 있습니다.

시작하는 동안 UnityPlayerActivity는 이 메서드를 호출하며, 현재 커맨드 라인 인자(null 또는 비어 있음)를 허용하고 Unity에 전달할 새로운 커맨드 라인 인자 문자열을 반환합니다.

Unity 커맨드 라인 인터페이스에 대한 일반적인 개요는 커맨드 라인 인자를 참조하십시오.

다음 예제는 이 방법을 사용하여 현재 기기를 기반으로 그래픽스 API를 선택하는 방법을 보여줍니다.

package com.company.product;
import com.unity3d.player.UnityPlayerActivity;
import android.os.Bundle;
import android.os.Build;

public class OverrideExample extends UnityPlayerActivity {
    private boolean preferVulkan() {
        // Use Vulkan on Google Pixel devices
        if (Build.MANUFACTURER.equals("Google") && Build.MODEL.startsWith("Pixel"))
            return true;
        else
            return false;
    }

    private boolean preferES2() {
        // Use OpenGL ES 2.0 on devices that run Android 5.1 or older
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1)
            return true;
        else
            return false;
    }

    private String appendCommandLineArgument(String cmdLine, String arg) {
        if (arg == null || arg.isEmpty())
            return cmdLine;
        else if (cmdLine == null || cmdLine.isEmpty())
            return arg;
        else
            return cmdLine + " " + arg; 
    } 

    @Override protected String updateUnityCommandLineArguments(String cmdLine)
    {
        if (preferVulkan())
            return appendCommandLineArgument(cmdLine, "-force-vulkan");
        else if (preferES2())
            return appendCommandLineArgument(cmdLine, "-force-gles20");
        else
            return cmdLine; // let Unity pick the Graphics API based on PlayerSettings
    }

    @Override protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }
}

UnityPlayerActivity 예제 파일

다음은 UnityPlayerActivity 파일의 예제입니다.

OverrideExample.java:
package com.company.product;
import com.unity3d.player.UnityPlayerActivity;
import android.os.Bundle;
import android.util.Log;

public class OverrideExample extends UnityPlayerActivity {
  protected void onCreate(Bundle savedInstanceState) {
    // call UnityPlayerActivity.onCreate()
    super.onCreate(savedInstanceState);
    // print debug message to logcat
    Log.d("OverrideActivity", "onCreate called!");
  }
  public void onBackPressed()
  {
    // instead of calling UnityPlayerActivity.onBackPressed() we just ignore the back button event
    // super.onBackPressed();
  }
}

해당 AndroidManifest.xml은 다음과 같은 모습일 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.product">
  <application android:icon="@drawable/app_icon" android:label="@string/app_name">
    <activity android:name="com.YourPackage.name.OverrideExample"
             android:label="@string/app_name"
             android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
  </application>
</manifest>

새로운 Activity로 플러그인을 만들어 프로젝트에 추가하려면 다음 단계를 수행해야 합니다.

  1. UnityPlayerActivity 파일을 확장합니다. 이 파일은 Unity에서 프로젝트를 익스포트한 후 Android Studio에서 가장 잘 수행됩니다. 다음과 같은 몇 가지 옵션이 있습니다.
    • Activity 클래스를 포함하는 .java 파일이나 .kt 파일을 Unity 프로젝트에 넣을 수 있습니다.
    • 클래스가 포함된 Java 라이브러리를 생성하고 컴파일하여 결과 .jar 파일을 Unity 프로젝트에 넣습니다.
    • 클래스가 포함된 Android 라이브러리를 생성합니다. 이 라이브러리를 (.androidlib “확장”을 가진 폴더로 이름을 지정하여) 소스 코드의 Unity 프로젝트에 넣거나 컴파일하고 결과 .aar 파일을 Unity 프로젝트에 넣습니다.
  2. 새로운 Android 앱 매니페스트를 생성하여 새로운 Activity를 애플리케이션의 엔트리 포인트로 설정한 후 AndroidManifest.xml 파일을 프로젝트의 Assets/Plugins/Android 폴더에 배치합니다.

  • 2019.2에서 새로운 코드 샘플 추가
  • Unity 2019.3 버전 이상을 위한 AndroidManifest 예제 업데이트함
JAR 플러그인
Android용 Native(C++) 플러그인
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961