Unity Android カスタムアクティビティの作り方
始めに
2024/02/11 現在において、Android のカスタムアクティビティの作り方をまとめておく。 以前は Android Studio でプラグインを作って、ビルドして、jar を配置するという事をやっていたが 今はより簡単なようなので。
- Unity 2023.2.9f1
参考
カスタムアクティビティの作成 https://docs.unity3d.com/ja/2023.2/Manual/android-custom-activity.html
サンプルコード
自己責任でどうぞ。 https://github.com/RyKishita/TestAndroidActivity2023
修正内容
以下、企業名は rykishita 、プロジェクト名は TestAndroidActivity2023 とする。
-
メニュー 編集 → プロジェクト
-
プレイヤー → Android のタブ → 公開設定 → ビルド - カスタムメインマニフェスト にチェック
-
\Assets\Plugins\Android に、MainActivity.java という名前で空ファイル追加
-
MainActivity.java の内容編集。先頭行のパッケージ名は要修正
package com.rykishita.TestAndroidActivity2023; import com.unity3d.player.UnityPlayerActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends UnityPlayerActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("OverrideActivity", "onCreate"); } public void onBackPressed() { // UnityPlayerActivity.onBackPressed() を呼び出す代わりに、この例はバックボタンのイベントを無視します // super.onBackPressed(); } public int test(String arg) { Log.d("test", arg); return 1; } }
-
Unityインストール先\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player\UnityPlayerActivity.java をコピーして、 \Assets\Plugins\Android にペースト
- (追記 2024/08/13) Unity6 では不要。プロジェクト設定 ー プレイヤー ー Android ー その他設定 ー 設定、Application Entry Point は確認する。
-
カスタムメインマニフェスト(“\Assets\Plugins\Android\AndroidManifest.xml)を編集。com.rykishita.TestAndroidActivity2023.MainActivity は要修正
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application> <activity android:name="com.rykishita.TestAndroidActivity2023.MainActivity" android:theme="@style/UnityThemeSelector" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> </application> </manifest>
-
シーンに適当にボタンを置く
-
ボタンクリックイベントに以下を書く
private void Button_onClick() { #if UNITY_EDITOR Debug.Log(nameof(Button_onClick)); #else #if UNITY_ANDROID using (var playerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { using (var androidJavaObject = playerClass.GetStatic<AndroidJavaObject>("currentActivity")) { var ret = androidJavaObject.Call<int>("test", "testarg"); Debug.Log($"{nameof(Button_onClick)} {ret}"); } } #endif #endif }
-
ビルドして実行。Android 上でボタンクリック。Android Logcat でログを見て動作を確認
備考
Android8(API26)以降をターゲットにする場合は GameActivity にも出来る。 その場合は上記内容は変わる。
- MainActivity.java の内容
- コピーする UnityPlayerActivity.java を UnityPlayerGameActivity.java にする。
- カスタムメインマニフェスト の内容。設定でチェックを入れた際に追加されたファイルの初期内容を参照
The GameActivity application entry point https://docs.unity3d.com/2023.2/Documentation/Manual/android-application-entries-game-activity.html
追記(2024/06/23)
機会があって Unity 2022.3.12f1 でこの対応を行ったところビルドエラーが出た。 UnityPlayerActivity.java に関するエラーだったので、コピーを行わないようにすると解消した。