Android Studioによりネイティブプラグインを作成し、Unityに作成したネイティブプラグインを実装し、新規プロジェクトを作成して、Android携帯にネイティブプラグインとゲームオブジェクトを転送して実行します。
- Android携帯:京セラ android one s2
- Androidバージョン:7.1.2
- Android開発環境:Android Studio 4.0
- Unity: 2018.4.26f1 (64-bit)
Android Studioによりネイティブプラグインの作成
Android Studioにより次の手順でネイティブプラグイン「unitylibrary-release.aar」を作成します。
- Android Studioで「No Activity」により新規プロジェクト「UnityPlugin」を作成します。
- File メニューから「 New 」→ 「New Module」を選択し、開いたダイアログで「Android Library」を選択して、ライブラリモジュール「unitylibrary」を作成します。
- File メニューから「Project Structure…」を選択し、開いたダイアログの左メニュー「Modules」を選択して、最初に作られた「app」を削除します。
- 次のフォルダのUnityクラスライブラリ「classes.jar」を取得して、作成したプロジェクトフォルダ内の「libs」に追加します。
- モジュールレベル「unitylibrary」のbuild.gradleを次のように修正し、右上の「Sync Now」ボタンをクリックして、Gradleの変更を適用します。
- 次のようにJavaクラスを新規追加し、名称を「UnityPlugin」、パッケージ名を「com.tomosoft.unitylibrary」とします。
- 作成した「UnityPlugin 」に次のコードを記述します。
- シーンに存在するオブジェクト「UnityTest」のメソッド「FromAndroid」にメッセージ「”UnityTest”+パラメータとして受けとった文字列」を送信します。
- メッセージを介して渡せるのは文字列だけなので、複雑な結果を渡したい場合にはシリアライズ/デシリアライズする必要があります。
- Build VariantsをReleaseにして、Buildメニューから「Make Module ‘unitylibrary’」をクリックして、作成したプラグインをAARファイルとしてビルドします。
- ビルドが完了すると、次のように「・・・/UnityPlugin/unitylibrary/build/outputs/aar」にAARファイル「unitylibrary-release.aar」が生成されます。
F:\Program Files\2018.4.26f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar
Unityクラスライブラリは、Unityアプリケーション(MacならUnity.app、WindowsならUnity.exe)が格納されているフォルダから見て「/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar」
にあります。
implementation fileTree(dir: "libs", include: ["*.jar"]) ↓ compileOnly fileTree(dir: "libs", include: ["*.jar"])
UnitySendMessage("GameObject名","関数名","引数");
package com.tomosoft.unitylibrary; import com.unity3d.player.UnityPlayer; public class UnityPlugin { public static String FromUnity(String str) { UnityPlayer.UnitySendMessage("UnityTest" , "FromAndroid" , ""); return( "UnityPlugin: " + str); } }
Unityによりネイティブプラグインの実装
新規プロジェクト「PluginTest」を作成してネイティブプラグイン「unitylibrary-release.aar」を実装して、Android携帯にゲームオブジェクトを転送して実行します。
- 新規プロジェクト「PluginTest」を作成します。
- Unityエディタでにフォルダ「Assets/Plugins/Android」を作成し、作成したネイティブプラグイン「unitylibrary-release.aar」をドラッグ&ドロップします。
- Hierarchyタブの「Create」→「 UI」からText、Buttonを作成し、それぞれのx,y位置を調整します。
- Assetsメニューから「Create」→「C# Script」を選択して、次に示すスクリプト「UnityTest.cs」を作成します。
- 21行目で作成したネイティブプラグイン「unitylibrary-release.aar」を呼び出します。
- 23行目でネイティブプラグイン「FromUnity」関数を呼び出し、戻り値をAndroid携帯に表示します。カウンタ「counter」値が更新されて表示されます。
- 作成したスクリプト「UnityTest.cs」をゲームオブジェクト「Canvas」にドラッグ&ドロップし、inspectorタブのスクリプト「UnityTest.cs」の「Txt Message」「Btn Android」それぞれにHierarchyタブの「Text」、「Button」をドラッグ&ドロップします。
- Fileメニューから「Build Settings」を選択します。表示された「Build Settings」画面で「Android」を選択して「Build And Run」ボタンをクリックします。「Build And Run」ボタンが無効になっている場合は、「Build」ボタンをクリックして、フォルダを指定してファイル名を設定します。
- 作成した「apk」ファイルの保存フォルダ名を聞いてくるので、フォルダを指定してファイル名を設定します。これによりapkファイルの作成とAndroid携帯への書き込みが行われます。Android携帯への書き込みが終了すると、次の画面が表示され、「Button」ボタンをクリックするごとに数値がカウントアップします。
UnityTest.cs
using UnityEngine; using UnityEngine.UI; public class UnityTest : MonoBehaviour { [SerializeField] Text txtMessage; [SerializeField] Button btnAndroid; int counter = 0; void Start() { btnAndroid.onClick.AddListener(CallAndroidPlugin); txtMessage.text = "初期値"; } /// <summary> /// ボタンが押されたらプラグインを呼ぶ /// </summary> public void CallAndroidPlugin() { using (AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.tomosoft.unitylibrary.UnityPlugin")) { txtMessage.text = androidJavaClass.CallStatic<string>("FromUnity", counter.ToString()); counter++; } } /// <summary> /// プラグイン側からUnityを呼ぶ /// </summary> public void FromAndroid(string str) { // txtMessage.text += str; } }
エラーメッセージ「CommandInvokationFailure: Gradle build failed」
Fileメニューから「Build Settings」を選択します。表示された「Build Settings」画面で「Build And Run」ボタンをクリックしてビルドを開始すると、エラーメッセージ「CommandInvokationFailure: Gradle build failed」が発生しました。。
CommandInvokationFailure: Gradle build failed. F:\Program Files\2018.4.26f1\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\OpenJDK\Windows\bin\java.exe -classpath "F:\Program Files\2018.4.26f1\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle\lib\gradle-launcher-5.1.1.jar" org.gradle.launcher.GradleMain "-Dorg.gradle.jvmargs=-Xmx4096m" "assembleRelease" stderr[ C:\Users\ne\UnityProjects\PluginTest\Temp\gradleOut\src\main\AndroidManifest.xml Error: uses-sdk:minSdkVersion 16 cannot be smaller than version 24 declared in library [:unitylibrary-debug:] C:\Users\ne\.gradle\caches\transforms-2\files-2.1\09fb3a5f4d1ce3a93019f48acfb48541\AndroidManifest.xml as the library might be using APIs not available in 16 Suggestion: use a compatible library with a minSdk of at most 16, or increase this project's minSdk version to at least 24, or use tools:overrideLibrary="com.tomosoft.unitylibrary" to force usage (may lead to runtime failures) FAILURE: Build failed with an exception. ・・・
対処法は、Fileメニューから「Build Settings」を選択します。表示された「Build Settings」画面で「Player Settings…」ボタンをクリックして、次のようにInspectorタブに表示されている「Minimum API level」を「Android 4.2」から 「Android 7.0」に変更することによりエラーメッセージ「CommandInvokationFailure: Gradle build failed」が発生しなくなりました。
エラーメッセージ「Build Target AndroidPlayer is not supported 」
Unityを起動した時に次のエラーメッセージ「Build Target AndroidPlayer is not supported 」が表示されます。BuildTarget が Android または iOS の状態で作業をしてる際にUnityをクラッシュさせて、再度プロジェクトを開き直すと発生しやすい。
対処法は、特にないのですが、再度プロジェクトを開きなおしています(特に問題はありません??)。