読者です 読者をやめる 読者になる 読者になる

vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

【Unity5】【Android】【Mac】プラグインで端末のディレクトリにアクセスする 1

Android Unity Mac

諸事情によりUnityからAndroidのカメラロール(DCIMディレクトリ)にアクセスしたくなったため、試してみました。

はじめに

Android端末内のファイルにアクセスするのはUnityだけでも可能なのですが、カメラロールのディレクトリは端末ごとに異なる場合があります。
「../../DCIM」のようにアクセスしても良いのかもしれませんが、ディレクトリの階層も異なる端末があった場合は対応ができません。
また、ネイティブの開発であればデバイスごとの差異を無視して特定のディレクトリのパスが取得できるため、プラグインを作成してみました。

準備

まずはUnity、Android Studioをインストールし、JDKAndroid SDKの設定などをすませておきます。
なおUnityの方はAndroid SDKなどの設定をしていない場合はビルド時に設定を求められるので、その時点で設定しても問題ありません。

また、以前はAndroid SDKAndroid Studioのパッケージ内に含まれていましたが、今は Users > Library > Android > sdk に置かれています。

完全に余談ですが、Android Studioのアイコンがマテリアルデザインでカッコ良くなりましたね。Linux版のアイコンも変わっているのかしら。

プラグインを作成する

1. プロジェクトを作成する

  1. Android Studioを使ってプロジェクトを新規作成します。

    • 特に使用しないため、「Add No Activity」を選択してActivityは作成しませんでした。
    • Company Domainは後で面倒なため、「jp」とし、Package Nameが「jp.PluginController」となるようにしました。
  2. プロジェクトの作成が終わったら、まず画面左に表示されているプロジェクトツリーの上部で、「Project」が選択されているかを確認します。
    私の場合は「Android」が選択されていて、この後ライブラリを追加する「libs」が見つからないなど?となったためです。

f:id:mslGt:20150429091611p:plain

2. Unityライブラリの追加

  1. Android用のプラグインがUnityパッケージ内の以下の場所にあります。
    これをコピーして、Android Studioのプロジェクトツリー上でペーストして、PluginController > app > libs に追加します。
    ※PluginControllerはプロジェクト名、appはモジュール名で、こちらは上記手順でプロジェクトを作成すると自動でこの名前になっていると思います。
/Applications/Unity/Unity.app/Contents/PlaybackEngines/AndroidPlayer/release/bin/classes.jar
  1. 1で追加したclasses.jar」上で右クリック > Add As Library をクリックします。
    ※「Add As Library」が表示されない場合は一旦別のファイルを選択してみるなどしてみてください。

3. Unityから呼び出されるクラスの作成

src > main > java > jp.plugincontroller の上で右クリック > New > Java Class を選択して、Unityから呼び出されるクラスを作成します。

以下のように作成しました(詳細は後述)。

PluginConnector.java

package jp.plugincontroller;

import java.io.File;
import android.os.Environment;
import android.app.Activity;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer;

public class PluginConnector {
  public static String GetDcimPath()
  {
    File filDcimDir =
            Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_DCIM);
    // DCIMディレクトリのパスを返す.
    return (filDcimDir.getPath());
  }
  public static void ShowToast()
  {
    // 戻るボタン押下時にトーストを表示.
    final Activity actUnity = UnityPlayer.currentActivity;
    actUnity.runOnUiThread(new Runnable() {
      @Override
      public void run() {
        Toast.makeText(actUnity, "もう一度押すとアプリを終了します", Toast.LENGTH_SHORT).show();
      }
    });
  }
}

DCIMディレクトリのパスを取得する

「getExternalStoragePublicDirectory」を使うことで、端末の外部メディアにアクセスすることができます。
今回は「Environment.DIRECTORY_DCIM」でDCIMを指定しており、「getPath()」でパスを取得します。

Unityのアクティビティ取得とトースト表示

「UnityPlayer.currentActivity」でUnity側の現在のアクティビティが取得できるようです。
「runOnUiThread」でUIをコントロールしているスレッドで処理を実行でき、トーストの表示処理を行っています。

4. build.gradleの設定

プラグインをjarファイルとして生成するため(jarファイルでなくてもUnityから利用はできるようですが)、「build.gradle」を編集します。

※プロジェクト内に複数「build.gradle」があるのがややこしいですが、PluginController > app 以下にあるものを変更します。

build.gradle

apply plugin: 'com.android.library'

android {
  compileSdkVersion 21
  buildToolsVersion "21.1.2"

  defaultConfig {
    minSdkVersion 15
    targetSdkVersion 21
  }
  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
}
dependencies {
  compile fileTree(include: ['*.jar'], dir: 'libs')
  compile 'com.android.support:appcompat-v7:22.1.1'
  compile files('libs/classes.jar')
}
task clearJar(type: Delete) {
  delete 'release/' + 'androidplugin01.jar'
}
task exportJar(type: Copy) {
  from('build/intermediates/bundles/release/')
  into('release/')
  include('classes.jar')
  rename('classes.jar', 'androidplugin01.jar')
}
exportJar.dependsOn(clearJar, build)
  • 「apply plugin: 'com.android.application'」を「apply plugin: 'com.android.library'」に変更します。
  • 「applicationId ~」「versionCode ~」「versionName ~」を削除します()
  • 「compile files('libs/classes.jar')」はUnityライブラリを追加した時に自動で追加されていると思います。
  • 「task clearJar」「task exportJar」「exportJar.dependsOn(clearJar, build)」を追加します。
    処理を見ると大体想像が付きますが、以前生成したjarファイルを削除し、 build > intermediates > bundles > release にある「classes.jar」をコピーして名前を変更します。

5. Jarファイルを生成する

  1. Android Studioの画面左下にある「Terminal」をクリックして、ターミナルを表示します。
    ちなみにこれはMacのターミナル.appと同じであり、ターミナル.appでプロジェクトのディレクトリ直下を開いても同じことができます。

  2. 現在のパスを確認して、プロジェクトのディレクトリ直下でなければ移動します。
    (未確認ですが)「Terminal」をクリックした時に選択していたファイルによって、 PluginController > app を開いている場合があるため、「cd ../」などで移動しておきます。

  3. Jarファイルを生成する 以下のコマンドを入力して、Jarファイルを生成します。 なお初回はまず自動でGradleがインストールされると思います。

./gradlew app:clean app:assembleDebug app:exportJar
  • 生成されたファイルは PluginController > app > release にあります。
  • コマンドで、gradlewの後ろに実行するタスクを指定するのですが、何故か「cleanJar」ではなく「clean」なのが気になるところ。なお「cleanJar」を指定するとエラーになります。

長くなったため、Unity側は次回。

参考

Jarファイル生成、Unityプラグイン作成

ディレクトリのパス取得