UnityとAndroidネイティブの連携:UnitySendMessageで引数を受け渡す

今回は、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.jarandroid.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から送られてくるメッセージを受け取るための設定を行います。

  1. 空のGameObjectを作成し、名前を「Receiver」に変更します。(※Android側の第1引数と一致させる必要があります)
  2. 以下の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を通じた引数の受け渡しは成功です。

unity_android_link_5_ss1 unity_android_link_5_ss2

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

はじめまして、秋月なるです。

アラフォー会社員で、スマホアプリ/ゲーム/AIが好き。
新しいものを見ると触りたくなるタイプで、スマホやウェアラブル等ガジェットが好きですが、よく買ったあとに「思ってたのと違う…」をやりがち。

ブログ投稿は趣味の1つなので、興味があるもの全般をゆるく続けていこうと思います。

目次