Androidネイティブプラグインの作り方
ネットを検索すればプラグインの作り方について書かれたサイトは沢山見つかりますが、どれも古い情報だったためか、すんなりと作成できなかったので、簡単にまとめてみます。
UnityPlayerActivityを継承したクラスを使ったプラグイン
ここにあるように、プラグインの作り方にはいくつか方法があるのですが、今回はUnityPlayerActivityを継承したクラスを使う方法について書いていきます。
- Android Studio のプロジェクトを新規作成して、Android Libraryモジュールを追加
- Unityのclasses.jarをlibsにコピー(classes.jarの場所は公式ドキュメントを参照)
- UnityPlayerActivityを継承したjavaクラスを追加
- プラグインにclasses.jarを含めないようにするため、gradleに
android.libraryVariants.all { variant ->
variant.outputs.each { output ->
output.packageLibrary.exclude('libs/classes.jar')
}
}
を追加
Unityでビルドしようとするとclasses.jarのモジュールが競合してしまう
検索すると、大体上記の方法にたどり着くのですが、手順4でclasses.jarを除外することができません。(おそらく、gradleのバージョンが上がって、dependenciesにimplementation fileTree(dir: 'libs', include: ['*.jar'])
と記述されているからだと思われます。以前はcompile~
とかだったみたい。正しい情報を知りたい方はGradleの公式ドキュメントを見てください。)
色々調べた結果、implementation用のディレクトリの他にコンパイル時だけ参照するライブラリ用のディレクトリを追加し、そこにclasses.jarを置きます。そして、depencenciesにcompileOnlyでそのディレクトリを指定してやることで、classes.jarを含まないaarを出力することができました。
- Android Studio のプロジェクトを新規作成して、Android Libraryモジュールを追加
- compile_onlyディレクトリを新規作成し、Unityのclasses.jarをそこに配置
- UnityPlayerActivityを継承したjavaクラスを追加
- gradleのdependenciesに
compileOnly fileTree(dir: 'compile_only', include: ['*.jar'])
を追加
例
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
compileOnly fileTree(dir: 'compile_only', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
まとめ
classes.jarはcompileOnlyで追加する!
他の細かい手順は省略・・・(検索すれば大体わかるはず)