今回は、Androidネイティブ側からUnityへメッセージを返すUnitySendMessageの機能を使用した簡単な実装方法をご紹介します。
本記事を読み進めることで、AndroidStudioで作成したネイティブプラグイン(jar)をUnityに取り込み、ボタン操作からAndroidのActivityを呼び出して結果を受け取る一連のフローを理解できます。
開発環境の前提条件
本検証で使用した各種ツールのバージョンは以下の通りです。
環境によってパスや画面が異なる場合がありますので、適宜読み替えてください。
- OS:OSX Yosemite v10.10.5
- Unity:v5.1.2f1
- AndroidStudio:v1.3.2
- 検証端末:Nexus7(2012) v5.1.1
Androidプラグイン(.jar)を生成する
まずはAndroid Studioを使用して、Unityから呼び出すためのネイティブプラグインを作成していきます。
空のプロジェクト作成とモジュール準備
AndroidStudioでプロジェクトを新規作成します。この際、Activityは「Add No Activity」を選択してください。これによりappというモジュールが生成されます。
build.gradleの編集(プラグイン化の設定)
NativeActivity(:app)のbuild.gradleを編集し、アプリケーションではなくプラグインとして出力されるように修正します。また、UnityやAndroidの機能を使用するためのライブラリパスを追記します。
修正のポイント:
・apply pluginをライブラリ用に変更
・applicationIdの削除
・classes.jarとandroid.jarのパスを追加
・ファイル末尾にjar出力用のgradleタスクを追記
//apply plugin: 'com.android.application' /*Androidプラグインとして利用するため修正*/
apply plugin: 'com.android.library'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
//applicationId "com.example.callactivitytest" /*Androidプラグインとして利用するため削除*/
minSdkVersion 22
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile files('/Applications/Unity/Unity.app/Contents/PlaybackEngines/AndroidPlayer/Variations/mono/Development/Classes/classes.jar')
compile files('/Users/ユーザ名/Library/Android/sdk/platforms/android-22/android.jar') /*Androidプラグインとして利用するため追加*/
}
task clearJar(type: Delete) {
delete 'build/libs/' + 'plugin.jar'
}
task makeJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
rename('classes.jar', 'plugin.jar')
}
makeJar.dependsOn(clearJar, build)
Javaクラスの作成(ActivityとLauncher)
今回は2つのJavaファイルを作成します。
1. NativeActivity.java
UnityのButton押下で呼び出されるActivityです。ここにUnitySendMessageを記述します。
引数は左から順に(Unity側のGameObject名称, Unity側の呼び出すメソッド名, Unity側に渡す文字列)となります。
package com.example.callactivitytest;
import android.app.Activity;
import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
public class NativeActivity extends Activity {
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
UnityPlayer.UnitySendMessage("Receiver","onCallBack","successful!");
}
}
2. ActivityLauncher.java
Activityを起動するためのランチャークラスです。
package com.example.util;
import android.app.Activity;
import android.content.Intent;
public class ActivityLauncher {
public static void launchActivity(String type, final Activity m_activity) {
Intent i = new Intent();
i.setAction(Intent.ACTION_MAIN);
i.setClassName(m_activity,type);
m_activity.startActivity(i);
}
}
jarファイルの出力
AndroidStudioのTerminalを開き、プロジェクトのルートディレクトリで以下のコマンドを実行します。
./gradlew app:clean app:assembleDebug app:makeJar
TerminalウィンドウにBUILD SUCCESSFULと表示されれば成功です。app/release直下にplugin.jarが出力されていることを確認してください。
Unity側からAndroidプラグインを呼び出す
ここからはUnityでの作業です。UIのButtonを使用して、作成したAndroidプラグインを呼び出します。
jarファイルとAndroidManifestの配置
Unityで新規プロジェクトを作成したら、プラグインを配置する準備を行います。
- ディレクトリの作成:
Assets/Plugins/Androidディレクトリを手動で作成します。 - jarファイルの配置: 作成したディレクトリ直下に、先ほど出力した
plugin.jarを配置します。 - AndroidManifestファイルの作成: AndroidのActivityを呼び出すために必須です。以下の内容で作成し、jarファイルと同じディレクトリに配置します。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player">
<application android:icon="@drawable/app_icon" android:label="@string/app_name">
<activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
<activity android:name="com.example.callactivitytest.NativeActivity"></activity>
</application>
</manifest>
メッセージ受け取り用のReceiverを用意する
Androidから送られてくるメッセージを受け取るための設定を行います。
- 空のGameObjectを作成し、名前を「Receiver」に変更します。(※Android側の第1引数と一致させる必要があります)
- 以下の
Receiver.csスクリプトを作成し、アタッチします。(※メソッド名も第2引数と一致させます)
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Receiver : MonoBehaviour {
public void onCallBack(string message){ /*UnitySendMessageの第二引数で指定した名称*/
GameObject obj = GameObject.Find("/Canvas/Button1/Text");
Text textComponent = obj.GetComponent<Text>();
textComponent.text = message;
}
}
ボタン押下時の呼び出し処理を実装する
Hierarchyウィンドウを右クリックし、UI > Buttonからボタンを作成します。次に、Activityを呼び出すためのスクリプトActivityLauncher.csを作成します。
using UnityEngine;
using System.Collections;
public class ActivityLauncher : MonoBehaviour {
public void LaunchActivity() {
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentUnityActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass plugin = new AndroidJavaClass("com.example.util.ActivityLauncher");
plugin.CallStatic("launchActivity", "com.example.callactivitytest.NativeActivity", currentUnityActivity);
}
}
作成したスクリプトをアタッチし、Buttonの「On Click()」イベントにLaunchActivityメソッドを設定します。
ビルドと実機での動作確認
設定が完了したらAndroid向けにビルドし、実機で実行してみましょう。
ボタンを押すとネイティブのActivity画面が開きます。Androidのソフトウェアキーの戻るボタンを押してUnityの画面に戻ったとき、ボタンのテキスト表示が「successful!」に変わっていれば、UnitySendMessageを通じた引数の受け渡しは成功です。



