12
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Unity] Android NativePluginの実装の仕方

Last updated at Posted at 2021-09-08

はじめに

Unityで使用するNativePluginのタスクがあったのでとりあえずテストでサンプルを作成してみました。
ここでは、UnityでAndroidのNativeアラートを表示させるまでの忘却録です。

環境

macOS Catalina: 10.15.7
Unity 2018.4.19f
Android Studio 4.0.1

Android Studioでプロジェクトを作成

今回は「AndroidStudio4.0.1」で作成していきます。
android001.png

「Select a Project Template」で「No Activity」を選択
android002.png

Projectの概要を決めていきます。「Package name」はサンプルなので適当です。言語は「Java」を選択しました。
android003.png

ライブラリ用モジュールを作成する

「File」→「New」→「NewModule」を選択
005.png

「Select a Module Type」で「Android Library」を選択
006.png

「Module name」もサンプルなので適当にそのままにしました。
007.png

左上にあるプルダウンから「Android」を選択しておきます。
android004.png

「mylibrary」が出来てます。
008.png

Plugin開発には不必要なAppディレクトリを削除する

「File」→「Project Structure」を選択
009.png

左サイドバーの「Modules」を選択して「app」を選択。赤丸の「-」で削除します。
010.png

「Remove Module」で削除確認されますが、「Yes」です。
011.png

Unity機能をAndroidから使用する準備

Android側からUnityのクラスを認識するために「jar」ファイルをインポートする必要があります。
主にUnitySendMessageを使う時などです。アラートであればこの部分は必要ありません。

Android 用に開発されたプラグインを使用して、Unity の外部で作成された Java や C++ コードを C# スクリプトから呼び出しすることができます。これにより、他の方法では Unity で使用できない OS の呼び出しやサードパーティのコードライブラリなどの機能にアクセスできます。Unity によるプラグインの使用方法の詳細については、プラグイン のドキュメントを参照してください。
以下のページでは、Android プロジェクトで使用する独自のプラグインを作成する手順を説明します。これらのページの情報は、Unity のネイティブプラグインの作成方法をすでに理解していることを前提としています。ネイティブプラグインとその使用の詳細については、ネイティブプラグイン のドキュメントを参照してください。
https://docs.unity3d.com/ja/current/Manual/PluginsForAndroid.html

場所はUnityがインストールされてるディレクトリにあります。
ファイル名: classes.jar
下記は、UnityHubを使用していた場合の格納場所です。

/Applications/Unity/Hub/Editor/2018.4.19f1/PlaybackEngines/AndroidPlayer/Variations/il2cpp/Release/Classes/classes.jar

Androidプロジェクトの「libs」ディレクトリへ「classes.jar」をコピーします。
012.png

Gradleの設定からclasses.jarを外す

Gradleの設定からclasses.jarを外さないと、出力されるaarファイルに含まれてしまいUnityのビルド時にエラーが出てしまうので外さないといけません。ということで、「build.gradle」を編集します。
013.png
下記、箇所を変更。また、追記します。

build.gradle
// 26行目
NG implementation fileTree(dir: "libs", include: ["*.jar"])

OK: compileOnly fileTree(dir: 'libs', include: ['classes.jar'])

// 追記箇所
android.libraryVariants.all{ variant->
  variant.outputs.each{output->
    output.packageLibrary.exclude('libs/classes.jar')
  }
}

完成形は下記。右上に出ている「SyncNow」を押下して完了
014.png

Unityで呼び出すNativeAlertDialogのサンプル

該当箇所からClassを作成します。
 2021-09-06 16.36.26.png
 2021-09-06 16.37.19.png
 2021-09-06 16.37.37.png
 2021-09-06 17.04.20.png

該当コード

AndroidNativeDialog.java
package jp.co.test.mylibrary;

import android.app.AlertDialog;
import android.content.Context;

public class AndroidNativeDialog {
    static public void showNativeDialog(Context context, String title, String message) {
        new AlertDialog.Builder(context)
                .setTitle(title)
                .setMessage(message)
                .setPositiveButton("はい", null)
                .setNegativeButton("いいえ", null)
                .show();
    }
}

ビルド

画面右側に「Gradle」のアイコンがありますので、設定画面を表示します。
 2021-09-06 17.06.55.png

「mylibrary」→「Tasks」→「build」→「assemble」をダブルクリックでビルドが始まります。
 2021-09-06 17.07.16.png

成功すると「BUILD SUCCESSFUL in 時間」が表示されます。
 2021-09-06 17.07.39.png

aarの場所

左上から「Project」を選択し、「mylibrary」→「build」→「outputs」→「aar」の中にあります。
 2021-09-06 17.19.03.png

該当のファイルから「Reveal in Finder」でFinderが開いてくれます。
 2021-09-06 17.55.44.png

aarをUnityプロジェクトへ配置する

UnityプロジェクトをAndroidにSwitchPlatformします。
該当のaarは「Assets」→「Plugins」→「Android」のディレクトリを無ければ作成して配置します。
 2021-09-06 17.59.08.png

Unity側の対応(呼び出し方法)サンプル

呼び出す際に「AndroidJavaClass」、「AndroidJavaObject」を使います。
サンプルでは、ShowNativeDialog()をButtonEventで使用しました。

ButtonView.cs
using UnityEngine;

public class ButtonView : MonoBehaviour
{
    public void ShowNativeDialog() {
        #if UNITY_ANDROID
        AndroidJavaClass nativeDialog = new AndroidJavaClass ("jp.co.test.mylibrary.AndroidNativeDialog");
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject context  = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

        context.Call ("runOnUiThread", new AndroidJavaRunnable(() => {
            nativeDialog.CallStatic (
                "showNativeDialog",
                context,
                "タイトル",
                "本文テキスト"
            );
        }));
        #elif UNITY_EDITOR
            UnityEngine.Debug.Log("On Click!");
        #endif
    }
}

サンプルフォルダ構成

 2021-09-07 15.02.35.png

Unity配置

ボタンを押下するとアラートダイヤログを表示
 2021-11-17 18.09.43.png

ビルドして実機で確認します。
output.gif

成果物

ここにあるプロジェクトをダウンロードしてもらい、Androidでビルドしてもらえれば実機確認可能です。
FileBuildSettingsBuildでapkが出来ます。

 2021-11-17 18.31.52.png

実機インストールについてはadbコマンドが使えれば出来ます。

12
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?