概要
Unity向けに、Androidのネイティブ機能を呼び出す部分が作りたくて色々調べたのでまとめておきます。
今回は特にこちらの記事を参考にさせていただきました。
Android Studioで新規プロジェクトを作成する
今回作成するのはaar(Android Archive)
なので、新規で作成するプロジェクトは空の、ごくシンプルな状態で作成して問題ありません。(プロジェクト作成後に、モジュール追加してそっちでコードを書くので、通常のapk作成フローとは異なります)
次に、Phone and Tabletを選択し、Minimum SDK
のバージョンを設定します。
ここは、後々、Unityの設定でも最低バージョンを指定する際に同じバージョンにしないとエラーが出るので、それなりに小さいのを選んでおいたほうがいいでしょう。
そしてAdd No Activity
を選択してプロジェクトを作成します。
ライブラリ用モジュールを作成する
プロジェクトが作成できたら、ライブラリ用のモジュールを新規追加します。
Android Library
を選択して追加します。
プラグイン名となるモジュール名を入力します。
すると、プロジェクトビューに、先ほど入力した名前でモジュールが追加されます。
Unityからアクセスするクラスを実装する
今回はネイティブの機能(ダイアログ)を簡単に呼び出すだけなので、なにも継承しないシンプルなJavaクラスをモジュールに追加します。
追加するには、Androidビュー内のモジュール名上で右クリックしてNew > Java Class
を選択します。
そして、NativeDialog
というクラス名でファイルを作成し、参考にさせていただいた記事同様の記述を行います。
引用させてもらうと、以下のコードになります。ネイティブのダイアログを表示する、というものです。
(パッケージ名は自身の環境に合わせてください)
package jp.co.test.dialog_plugin; import android.app.AlertDialog; import android.content.Context; public class NativeDialog { static public void showMessage(Context context, String title, String message) { new AlertDialog.Builder(context) .setTitle(title) .setMessage(message) .setPositiveButton("YES, YES, YES!", null) .setNegativeButton("...No?", null) .show(); } }
Gradleを使ってビルドする
ファイルが追加されたら、Gradleを使ってビルドします。
Android Studioの右側にある「Gradle」タブを開き、:plugin-name
(名称は自身で設定したもの)の下にある「Tasks > build > assemble」をダブルクリックして実行します。
基本はこれでビルドされるはずですが、自分の環境ではちょっとエラーで躓いてしまったので、同様のエラーが出た場合は、後述の対策を参照してみてください。
エラー内容
$ Error:A problem occurred configuring project ':hoge-plugin'. > Could not resolve all dependencies for configuration ':hoge-plugin:_debugPublishCopy'. > Could not find any version that matches com.android.support:appcompat-v7:27.+. Versions that do not match: 26.0.0-alpha1 25.3.1 25.3.0 25.2.0 25.1.1 + 31 more Required by: project :dialog-plugin
ビルドが成功すると、プロジェクトフォルダ内(※)の「myplugin/build/outputs/aar
」に、ビルドされたaar
ファイルが作成されています。
※ Android Studioのプロジェクトビューはいくつかのモードがあり、デフォルトはAndroid
になっているので、これをProject
に変更するとフォルダ構造が見れるようになるので、そちらのモードにすると表示されるようになります。
↑上記はdialog-plugin
というモジュール名で作成した時のキャプチャです。
****-debug.aar
と****-release.aar
が作成されます。今回はdebug
のほうをimportしました。
これを、Unityのプラグインフォルダにコピーして利用します。
Unityから、ネイティブプラグインの機能を呼び出す
プラグイン部分が作成できたので、あとはこれをC#から読み込み、利用するコードを書きます。
以下のように、AndroidJavaClass
とAndroidJavaObject
を利用して構築します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class AndroidDialogTest : MonoBehaviour { private void Update() { if (Input.touchCount > 0) { ShowDialog(); } } private void ShowDialog() { #if UNITY_ANDROID AndroidJavaClass nativeDialog = new AndroidJavaClass("plugintest.edo.com.dialog_plugin.NativeDialog"); AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); context.Call("runOnUiThread", new AndroidJavaRunnable(() => { nativeDialog.CallStatic( "showMessage", context, "テスト", "ほげ" ); })); #endif } }
Android Studioのビルドでハマった
Android開発をしている人にとっては多分なんてことはないことなんだと思いますが、Android Studioを使ったことがほぼないので、細かなエラーに悩まされました。
こちらの記事を参考に、ごく簡単なプラグイン作成を試してみたところ、
以下のようなエラーが。
$ Error:A problem occurred configuring project ':hoge-plugin'. > Could not resolve all dependencies for configuration ':hoge-plugin:_debugPublishCopy'. > Could not find any version that matches com.android.support:appcompat-v7:27.+. Versions that do not match: 26.0.0-alpha1 25.3.1 25.3.0 25.2.0 25.1.1 + 31 more Required by: project :dialog-plugin
どうも調べていくと、Android Support Libraryを最新にしろ、ということのよう。
ただ、調べてもSDK Managerでチェック入れてインストール、みたいなのしか出てこないのに、利用しているAndroid Studioだとそもそもそのチェック項目がない。なんでやねん。
と思っていたら、こちらにやり方が書いてありました。
要は、build.gradleに依存関係を書け、ということのよう。
以下のように追記しました。
allprojects { repositories { jcenter() maven { url 'https://maven.google.com' } // 変更点 } }
こちらも参考にさせていただきました。
gradle
ちなみに余談ですが、最初、gradle自体が分かっていなかったんですが、ビルド自動化ツールでした。
GradleはApache AntやApache Mavenのコンセプトに基づくオープンソースビルド自動化システムであり、プロジェクト設定の宣言にはApache Mavenが利用するXML形式ではなくGroovyベースのドメイン固有言語 (DSL) を採用している[2]。Gradleはタスクの起動順序の決定に有向非巡回グラフ(英: Directed Acyclic Graph、DAG)を利用する。
[出典: wikipedia]
Android Studioではこれを取り入れていて、専用のタブやビューが存在します。
build.gradleはテキストファイルで、自動ビルドツール用の設定ファイルです。
(なので、プロジェクト内のどこかに存在しているので、それを編集します)
まとめ
以上で、ネイティブのダイアログを表示するだけのプラグインが作成できました。
最後に、全体の流れをまとめとして書いておきます。
- Android Studioで空プロジェクトを作る
- 作成したプロジェクトにモジュールを新規追加する
- モジュールに、ネイティブ機能を実行する処理を追加・実装する
- Gradleを使ってモジュールをビルドする
- 生成された
aar
ファイルをUnityにimportする - Unityから、aar内の実装を呼び出す処理を書く
大まかにはこんな流れで実装していきます。
ビルドエラー周りが少々厄介ですが、それをクリアしてしまえば、比較的ネイティブの機能を実行するのは容易になるかなと思います。