[Unity] AndroidActivityの拡張方法

前回は、WordPressのREST APIについてご紹介しました。
今回は、Unity開発におけるAndroidActivityの拡張方法についてご紹介します。

Unityでモバイルアプリを開発していると、ネイティブ機能(※1)を使用したくなる時がありますよね。
UnityはAssetが豊富なので、大抵のことはそれらを使用することで解消できます。
汎用的な機能であれば、Assetもすぐ見つかる可能性も高いですが、そのプロジェクト固有で作成しなければいけない処理等
Assetを使用できずに自らネイティブの処理を作成しなければいけない時もあります。
iOSでは、ビルドした際にXCodeプロジェクトが出力されるため、Library配下に好きなファイルを追加すれば自由にネイティブに処理を追加することが出来ます。
Androidでは、一般的にJar/aarを作成する方法が紹介されていますが、少し手間なので今回はAndroid Studioプロジェクトを作成する方法でご紹介します。

では、まずは前準備です。
適当に作業用のフォルダを用意しましょう。
私は、Unity5というフォルダを作成しました。
次は、その中に”ADT”,”ASPJ”という2つのフォルダを作成してください。
Unityプロジェクトもここに配置します。
————-
Unity5
├ADT
├ASPJ
└UnityProject
————-

Androidで表示した際にUnityで作成したものが表示されているのが分かりやすいように適当なUIを作ります。

UnityでUIを作成し終わったら、BuildSettingsを開いて、Androidにプラットフォームを切り替えてください。

PlayerSettingsで、各自必要な項目を設定します。

次に、Unityでのビルドです。
デフォルト状態では、BuildSettings右下あたりに、ビルドボタンがあると思いますが、まだそのボタンは押さずに同画面のGoogle Android Projectという項目にチェックを入れます。
そうすると、ビルドボタンがエクスポートボタンに変ります。
この状態でエクスポートボタンを押すと、Eclipse用のAndroidプロジェクトが出力されます。

出力先は、先ほど作成したADTフォルダを指定しましょう。

ビルドが終わるのをしばらく待つと、自動的に出力先のフォルダを表示したエクスプローラーが起動します。
ADTフォルダ配下に、PlayerSettingsのProductNameに設定した名前のフォルダが出来ているはずです。
その中身はEclipse用プロジェクトを構成するファイルです。
AndroidManifestやsrcフォルダ、resフォルダがありますね。
このフォルダが日本語になっている(ProductNameに日本語を入力している)方は、適当な英数字にリネームしておいてください。

Eclipse用のプロジェクトが作成出来たら、AndroidStudioを開いてください。
Import project(Eclipse ADT, Gradle, etc.)を選択して、出力されたフォルダを指定しましょう。
※ここで日本語名になっていると、インポートエラーが発生します

出力先には、ASPJを指定します。
インポートが終わると、AndroidStudioプロジェクト用のフォルダ構成になったファイルがASPJ下に出力されます。

app/src/main/java/パッケージ名配下にUnityのActivityファイルがあるので、それを継承してオリジナルなActivityを用意しましょう。
今回は、CustomUnityActivityというクラスにしました。

package jp.sample.unityandroid;

import android.content.res.Configuration;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;

import com.unity3d.player.*;

public class CustomUnityActivity extends UnityPlayerActivity
{
	@Override protected void onCreate (Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
	}

	@Override protected void onDestroy ()
	{
		super.onDestroy();
	}

	@Override protected void onPause()
	{
		super.onPause();
	}

	@Override protected void onResume()
	{
		super.onResume();
	}

	@Override public void onConfigurationChanged(Configuration newConfig)
	{
		super.onConfigurationChanged(newConfig);
	}

	@Override public void onWindowFocusChanged(boolean hasFocus)
	{
		super.onWindowFocusChanged(hasFocus);
	}

	@Override public boolean dispatchKeyEvent(KeyEvent event)
	{
		return super.dispatchKeyEvent(event);
	}

	@Override public boolean onKeyUp(int keyCode, KeyEvent event)
	{
		return super.onKeyUp(keyCode, event);
	}

	@Override public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        return super.onKeyDown(keyCode, event);
    }

	@Override public boolean onTouchEvent(MotionEvent event)
    {
        return super.onTouchEvent(event);
    }

	/*API12*/
    public boolean onGenericMotionEvent(MotionEvent event)
    {
        return super.onGenericMotionEvent(event);
    }
}

ここまでくれば後は、通常のAndroidStudioでのアプリ開発と同じです。
ライブラリの追加はlibs下に、パーミッションの追加があればapp下のAndroidManifestに追記してください。
startActivityForResultやonActivityResultも追加し放題です。
とても簡単にActivity拡張が出来ましたね。
UnityからJavaへの処理要求は、Java側に必要なメソッドを要したうえでAndroidJavaClassを使うだけです。

Unity側の処理に変更を加えた場合は、再度エクスポートしなおしてください。
AndroidStudio用プロジェクトを作成済みであれば、出力されたEclipse用プロジェクトの中にあるassetsフォルダで、AndroidStudioプロジェクトのapp/src/main/assetsを置き換えてください。
※src/src/main/assetsを全て削除した後に、エクスポートしたassetsをコピー
Unity側で作成したものはバイナリファイルとしてassetsに出力されるようで、ここの中身を差し替えるだけで変更が反映されました。

以上で、Unity開発におけるAndroidActivityの拡張方法は終了です。
Java側の処理をデバッグする際もステップ実行を行えて非常に便利なので、Unityで通常のビルドした行ったことがない方は一度試してみてはいかがでしょうか?

最後までご覧いただきありがとうございました。


※1.Unityには用意されていない、Android/iOS固有の機能


弊社では全国各地の請負い(ご自宅)で作業協力頂ける、フリーランスエンジニアの方を常時探しております。
ご興味ある方は、お気軽にお問い合わせ下さい。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*