UnityとAndroidを上手く付き合わせる方法~UnityPlayerActivityの拡張(1)

つい先日からUnityの開発を始めた者です。

この記事では、UnityでのAndroidアプリケーションの開発において「Android独自のアクションを呼び出す方法」を自分が忘れないように残しておくためのものですよ…!

・開発環境について

AndroidStudio 1.2 Beta

Visual Studio 2013

Unity 5.0.1



・AndroidStudio側の処理

手順は、

[Add No Activity]でProjectの作成

UnityPlayerActivityが使えるようにjarファイルのパスを通す

UnityPlayerActivityをextendsしたjavaクラスの作成

build.gradleにjarの出力を行う文を書く

ボタンをぽちっと押してjarの出力!

こんな感じ!(だったと思う...



・Projectの作成

[New Project]で行えますので割愛!



・UnityPlayerActivityが使えるようになる魔法のjarの居場所について

[Unityをインストールしたディレクトリ\Unity\Editor\Data\PlaybackEngines\androidplayer\release\bin]

ここにclasses.jarがあるので、このjarを[File]->[Project Structure]の[Dependencies]に追加してください。


・UnityPlayerActivityをextendsしたjavaクラスの作成

先ほど作成したProjectにjavaクラスを作成します。
今回は「MainActivity.java」とします。
ソースとしてはこんな感じになります。

package あなたのパッケージ名;

import android.os.Bundle;


import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;


public class MainActivity extends UnityPlayerActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
    }

public void showToast(){
        final Activity activity = UnityPlayer.currentActivity;
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(activity, "Hello world!", Toast.LENGTH_SHORT).show();
            }
        });
    }

    
}

Activityを作成したので"AndroidManifest.xml"を編集します。
"Aplication"タグ内に

    <activity
            android:name="MainActivity"
            android:label="あなたの好きなアプリ名" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

を追加します
AndroidのActivityとほぼほぼ一緒だと思います。
ただ違うところはextendsしているのが "UnityPlayerActivity" というところです。
今回はUnityのスクリプト側から "showToast()" を呼び出してToastの表示を行おうと思うので記載。
(runOnUiThreadはhandlerでも良かったのかな...?)
とりあえずこの形で大丈夫。



・build.gradleにjarの出力を行う文を書く

app内のbuld.gradleの編集
ソースはこちら

apply plugin: 'com.android.library'

android {
    compileSdkVersion 21
    buildToolsVersion '20.0.0'

    sourceSets {
        main {
            java {
                srcDir 'src/main/java'
            }
        }
    }

    defaultConfig {

        minSdkVersion 16
        targetSdkVersion 17
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile files('libs/classes.jar')
}


task exportJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('release/')
    include('classes.jar')
    rename('classes.jar', 'AndroidPlugin.jar')
}

exportJar.dependsOn(deleteOldJar, build)

"apply plugin"が'com.android.library'なので注意!(普段は'com.android.applecation'だったはず...)
下部にある"task exportJar(type: Copy)"が追加文。



・ボタンをぽちっと押してjarの出力!

さっき作ったいわゆるgradleTaskを実行してあげてjarの出力を行う。
私の場合はAndroidStudioの画面の右側に"gradle"という項目があるので、そこをクリック
f:id:kalabu12:20150422020656p:plain
そうすると、こんなタブメニューが出てくるはず
f:id:kalabu12:20150422020658p:plain
そこのgradleのマークをクリックするとこんなポップアップが出てくる
f:id:kalabu12:20150422020931p:plain
"Comand line"に先ほど作成した"exportJar"が選択されているのを確認してから"OK"を押す。

そうすると"プロジェクトのディレクトリ\app\release"の中に"AndroidPlugin.jar"が出力されていると思います。
後に、このAndroidPlugin.jarとAndroidManifest.xmlを使ってUnityに取り込みます。

これでAndroid側の処理は終了です。

次の記事ではUnityのC#側からの呼び出しを取り上げたいと思います。

参考サイト