サイトアイコン 未知の路

UnityとAndroidネイティブの連携:UnitySendMessageの引数を使う

UnityとAndroidネイティブの連携 の投稿一覧

今回は、UnitySendMessageの返り値を使用した簡単な機能を作りました。

環境

Androidプラグインを生成するまで

  1. 空のプロジェクトを作成
  2. NativeActivity(:app)のbuild.gradleの編集
  3. javaクラスの作成
  4. jar出力
空のプロジェクトを作成

AndroidStudioで例のごとくプロジェクトを新規作成し、ActivityはAddNoActivityを選択すると、appというモジュールができます。

NativeActivity(:app)のbuild.gradleの編集

apply pluginを修正
アプリケーションではなく、プラグインとして使用するため修正します。
applicationIdを削除
アプリケーションではなく、プラグインとして使用するため削除します。
.jarを2つ追加
AndroidネイティブからUnityPlayerActivityを使えるようにするためにclasses.jarを、
Androidの機能を使えるようにするためandroid.jarを、
JavaLibraryのbuild.gradleを開いてdependenciesに追記します。
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クラスの作成

今回は2つのファイルを作成します。

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!");  /*引数は、(Unity側のGameObject名称, Unity側の呼び出すメソッド名, Unity側に渡す文字列)*/
    }
}
  • ActivityLauncher
  • 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出力

    jarを出力するためAndroidStudioのTerminalを開き、プロジェクトのrootに移動します。

    ./gradlew app:clean app:assembleDebug app:makeJar

    TerminalウィンドウにBUILD SUCCESSFULと表示されれば、jar出力は成功です。
    app/release直下にplugin.jarが出力されています。

    Unityから生成したAndroidプラグインを呼び出すまで

    Androidプラグインの呼び出し方法として、今回はUnityのButtonを利用します。

    1. 空のプロジェクトを作成
    2. jarファイルとAndroidManifestの配置
    3. Buttonを作成する
    4. Buttonの押下イベントスクリプトを作成し、アタッチする
    5. ビルド、実機で実行できるか確認
    空のプロジェクトを作成

    Unityの新規プロジェクトを作成します。

    jarファイルとAndroidManifestの配置

    配置先のディレクトリを作成
    プロジェクトを新規作成した段階ではAssets/Plugins/Androidは存在しないので、自分で作成します。
    .jarファイルの配置
    Assets/Plugins/Android/直下に、先ほど作成した.jarファイル2つを配置します。
    AndroidManifestファイルの作成、配置
    AndroidのActivityを呼び出す場合、AndroidManifestファイルが必要になります。
    作成したファイルはAndroidプラグインの.jarファイルと同じディレクトリに配置します。

    
    
    
        
            
            
                
                
                
                    
                    
                
            
            
    		
    		
        
    	
    
    空のGameObjectを作成

    CreateEmptyし、GameObjectを作成します。

    Receiverのスクリプトを作成し、アタッチする

    作成したGameObjectはUnitySendMessageの第一引数で指定した名称に変更しなければならないので、今回は作成したGameObjectをReceiverという名称に変更しています。

    Receiverにアタッチするコンポーネントとなるスクリプトを作成します。
    この時、メソッド名をUnitySendMessageの第二引数で指定した名称に設定しなければなりません。

    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
    Buttonを作成する

    Hierarchyウィンドウを右クリックし、UI > Buttonを選択しButtonを作成します。

    Buttonの押下イベントスクリプトを作成し、アタッチする

    Buttonの押下イベントは定義されていないので、On Click()に対して、次の設定をしていきます。

    1. 押下イベントのスクリプトを作成する
    2. using UnityEngine;
      using System.Collections;
      
      public class ActivityLauncher : MonoBehaviour {
      
      	public void LaunchActivity() {
      		 
      		AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
      		AndroidJavaObject currentUnityActivity = unityPlayer.GetStatic("currentActivity"); 
      	}
      }
    3. Inspectorからスクリプトをアタッチ
    4. AddComponentから作成したスクリプトを選択するか、そのままInspectorウィンドウにスクリプトアイコンをドロップすればアタッチできます。

    5. 押下イベントのメソッドを設定
    6. 押下時に発火するメソッドを指定します。今回は、LaunchActivity指定してあります。

    ビルド、実機で実行できるか確認

     
    ボタンを押すとネイティブのActivity画面が開きます。Androidのソフトウェアキーの戻るボタンを押すと、CallNativeActivityボタンのテキスト表示がsuccessful!に変わっています。
    1枚目が起動直後。ボタン押下後のActivity非表示時に2枚目が表示されます。

    モバイルバージョンを終了