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」を作成します。

  1. Android Studioで「No Activity」により新規プロジェクト「UnityPlugin」を作成します。

  2.  

  3. File メニューから「 New 」→ 「New Module」を選択し、開いたダイアログで「Android Library」を選択して、ライブラリモジュール「unitylibrary」を作成します。
  4. File メニューから「Project Structure…」を選択し、開いたダイアログの左メニュー「Modules」を選択して、最初に作られた「app」を削除します。
  5. 次のフォルダのUnityクラスライブラリ「classes.jar」を取得して、作成したプロジェクトフォルダ内の「libs」に追加します。
  6. 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」
    にあります。

  7. モジュールレベル「unitylibrary」のbuild.gradleを次のように修正し、右上の「Sync Now」ボタンをクリックして、Gradleの変更を適用します。
  8.     implementation fileTree(dir: "libs", include: ["*.jar"])
            ↓
        compileOnly fileTree(dir: "libs", include: ["*.jar"])
    
  9. 次のようにJavaクラスを新規追加し、名称を「UnityPlugin」、パッケージ名を「com.tomosoft.unitylibrary」とします。
  10. 作成した「UnityPlugin 」に次のコードを記述します。
    • シーンに存在するオブジェクト「UnityTest」のメソッド「FromAndroid」にメッセージ「”UnityTest”+パラメータとして受けとった文字列」を送信します。
    •  

       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);
        }
    }
    
  11. Build VariantsをReleaseにして、Buildメニューから「Make Module ‘unitylibrary’」をクリックして、作成したプラグインをAARファイルとしてビルドします。
  12. ビルドが完了すると、次のように「・・・/UnityPlugin/unitylibrary/build/outputs/aar」にAARファイル「unitylibrary-release.aar」が生成されます。

Unityによりネイティブプラグインの実装

新規プロジェクト「PluginTest」を作成してネイティブプラグイン「unitylibrary-release.aar」を実装して、Android携帯にゲームオブジェクトを転送して実行します。

  1. 新規プロジェクト「PluginTest」を作成します。
  2. Unityエディタでにフォルダ「Assets/Plugins/Android」を作成し、作成したネイティブプラグイン「unitylibrary-release.aar」をドラッグ&ドロップします。
  3. Hierarchyタブの「Create」→「 UI」からText、Buttonを作成し、それぞれのx,y位置を調整します。
  4. Assetsメニューから「Create」→「C# Script」を選択して、次に示すスクリプト「UnityTest.cs」を作成します。
    • 21行目で作成したネイティブプラグイン「unitylibrary-release.aar」を呼び出します。
    • 23行目でネイティブプラグイン「FromUnity」関数を呼び出し、戻り値をAndroid携帯に表示します。カウンタ「counter」値が更新されて表示されます。

    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;
        }
    }
    
  5. 作成したスクリプト「UnityTest.cs」をゲームオブジェクト「Canvas」にドラッグ&ドロップし、inspectorタブのスクリプト「UnityTest.cs」の「Txt Message」「Btn Android」それぞれにHierarchyタブの「Text」、「Button」をドラッグ&ドロップします。
  6. Fileメニューから「Build Settings」を選択します。表示された「Build Settings」画面で「Android」を選択して「Build And Run」ボタンをクリックします。「Build And Run」ボタンが無効になっている場合は、「Build」ボタンをクリックして、フォルダを指定してファイル名を設定します。
  7. 作成した「apk」ファイルの保存フォルダ名を聞いてくるので、フォルダを指定してファイル名を設定します。これによりapkファイルの作成とAndroid携帯への書き込みが行われます。Android携帯への書き込みが終了すると、次の画面が表示され、「Button」ボタンをクリックするごとに数値がカウントアップします。

エラーメッセージ「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をクラッシュさせて、再度プロジェクトを開き直すと発生しやすい。

対処法は、特にないのですが、再度プロジェクトを開きなおしています(特に問題はありません??)。