Version: 2021.1
言語: 日本語
JAR プラグイン
Android の ネイティブ (C++) プラグイン

UnityPlayerActivity Java コードの拡張

このページの各セクション

UnityPlayerActivity Java コードの拡張

Unity Android アプリケーションの開発に当たって、プラグインを使って標準の UnityPlayerActivity クラス (Android の Unity Player の基本の Java クラスで、 Unity iOS の AppController.mm と似ています) を拡張することができます。Android OS と Unity Android アプリケーション間の基本的なインタラクションは全て、アプリケーションによるオーバーライドが可能です。

デフォルトの Activity をオーバーライドするには以下を行います。

  • UnityPlayerActivity (Android ドキュメントの Activity を参照) から派生する新しい Activity を作成します。
  • 新しい Activity がアプリケーションのエントリーポイントとして使用されるように Android Manifest を修正してください。

これを実現する最も簡単な方法は、Unity からプロジェクトをエクスポートし、Android Studioで UnityPlayerActivity クラスに必要な変更を加えることです。または、新しいクラスを作成し、それを拡張し、unityLibrary プロジェクトの AndroidManifest.xml を修正し、 UnityPlayerActivity をそのクラスで置き換えます。

新しい Activity でプラグインを作成し、それをプロジェクトに追加するには、以下の手順を実行してください。 1. UnityPlayerActivity のファイルを拡張します。これは、Unity からプロジェクトをエクスポートした後、Android Studio で行うのがベストです。いくつかのオプションがあります。 * その Activity クラスを含む .java または .kt ファイルを、Unity プロジェクトに入れます。 * そのクラスを含む Java ライブラリを作成し、それをコンパイルしてできた .jar ファイルを Unity プロジェクトに加えます。 * そのクラスを含む Android ライブラリを作成します。このライブラリは、(.androidlib の拡張子を持つように名前を付けて) ソースコードによって Unity プロジェクトに配置することも、コンパイルして作成された .aar を Unity プロジェクトに入れることもできます。

新しい 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 マニフェストを 1 つ新規作成し、この新しい 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() {
        // Google Pixel デバイスで Vulkan を使用
        if (Build.MANUFACTURER.equals("Google") && Build.MODEL.startsWith("Pixel"))
            return true;
        else
            return false;
    }

    private boolean preferES2() {
        // Android 5.1 以前を使うデバイスで OpenGL ES 2.0 を使用 
        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; // Unity に Player 設定に基づくグラフィックス API を選択させます
    }

    @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) {
    // UnityPlayerActivity.onCreate() を呼び出す
    super.onCreate(savedInstanceState);
    // logcat にデバッグメッセージをプリントする
    Log.d("OverrideActivity", "onCreate called!");
  }
  public void onBackPressed()
  {
    // UnityPlayerActivity.onBackPressed() を呼び出す代わりに、Back ボタンイベントを無視する
    // 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 ライブラリを作成します。このライブラリは、ソースコードで Unity プロジェクトに入れることもできますし (フォルダ名に .androidlib の拡張子をつけます)、コンパイルしてできた .aar を Unity プロジェクトに入れることもできます。
  2. Android Manifest を 1 つ新規作成し、この新しい Activity のエントリーポイントとして設定します。AndroidManifest.xml ファイルをプロジェクトの Assets/Plugins/Android フォルダーに配置してください。

  • 2019.2 に新しいコードサンプルを追加しました。
  • 2019.3 Unity 以降の AndroidManifest の例を更新しました。
JAR プラグイン
Android の ネイティブ (C++) プラグイン