前回のNexus Qのアプリ開発に続いて第二回です。
前回の記事で、普通のアプリはNexusQ対応にするのはプログラム的には簡単(UXどうするのーとうい問題は置いといて)だというのがわかったと思いますが、アルテミスはUnityで作られてます。別にUnityでもおんなじだから簡単だろ!と思ったらハマったと言う事で、そんなお話です。

また別記事で書きますが、ABC東北でNexus Qアルテミスのデモをしたのですが、見事にNexusQ壊れました。電源ぬいてもピクリともしません(><。Nexus Qをゲームコントローラーにするのは自己責任で....

イベントの取得と通知

Nexus Q では、次の3つのキーイベントが取得できます。

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

でもUnityではボリュームを取得するキーコードはありません。
Android 側から Unity 側にキーイベントを確認させる仕組みを作る必要があります。

Android と Unity の組み合わせ方

Unity で開発するアプリで、Android ネイティブの処理をしたいときには主に次の2つの方法があります。

  1. Unity プロジェクトの /Assets/Plugins/Android に Android で作成したクラスの .jar を配置する
  2. Unity でビルドしたプロジェクトを Android プロジェクトにインポートする

1番と2番の違いと、選択方法を ”個人的な考え” として箇条書き(上に書いたからといって優先するべき項目ではありません)すると、

  • Android 側に手戻りが発生しにくい場合には1
  • 開発者が Unity 側で Android 側の弱さを補うために、Android でも行える処理を Unity 側で積極的に実装する場合は1
  • Unity 側に手戻りが発生しにくい場合は2
  • 開発者が Android 側で Unity 側の弱さを補うために、Unity でも行える処理を Android 側で積極的に実装する場合は2
  • マルチプラットフォーム化するときに、各プラットフォームが得意な開発者がいなければ1

矛盾している内容もありますが、開発規模によっては、どちらを選ぶかがはっきりすると思います。

また、そもそも1つのアプリを開発するのに、プロジェクトを幾つも作る必要がないと思う方もいるかもしれません。
仮に、Unity で出力した Android プロジェクトを直接改造してしまうと、Unity で手戻りが発生した場合に、再び Unity で Android プロジェクトを作成するので、
手戻り以前に作成していたクラスなどがあれば、それらのクラスを、ビルドし直したプロジェクトに移行する必要があります。
その作業量を減らすために、プロジェクトを分けて、一方をプロジェクトライブラリとすることによって、面倒な移行作業を無くし、作業効率の低下を最小限に抑えています。

Nexus Q 版 Artemis では、Unity での実装は Android 版のものを引き継げば、作業量も少なく、通常の Android 版と異なるイベント処理の仕組みと、
プレイヤー操作に必要なパラメータを調整しながら開発するので、2番の方法で実装しています。

ここからは、2番の方法の説明と、プロジェクトが複数出てくるので、わかりやすくするために、Unity のプロジェクトを「Proj-U」、Unity でビルドしてできた Android プロジェクトを「Proj-UA」、Android で作成したプロジェクトを「Proj-A」とします。

2-1-min.jpg

Temp の中に、「Proj-UA」が入っているので、Eclipse でインポートします。
このとき、必ず、「Proj-UA」を workspace にコピーしてください。
なぜなら、Temp フォルダは、Unity を終了すると消えてしまうからです。

2-2-min.jpg

「Proj-UA」の lib フォルダに
/Applications/Unity/Unity.app/Contents/PlaybackEngines/AndroidPlayer/bin/classes.jar
をインポートして、ビルドパスを設定します。(私の環境では、classes.jar だと名前がわかりにくいので、unity_classes.jar にしています。)

2-3-min.jpg

最後に、「Proj-UA」をインポートしたプロジェクトをプロジェクトライブラリに設定すれば、1つめの作業は終わりです。
ライブラリプロジェクトに設定するには、プロジェクトのプロパティから Android の項目を選ぶと設定できます。

2-4-min.jpg

次に、新規で Android プロジェクトの「Proj-A」を作成します。
「Proj-A」に「Proj-UA」の assets フォルダ内にある2つのフォルダをコピペします。
また、先ほどと同様に、classes.jar をインポートして、ビルドパスを設定します。

2-5-min.png

UnityPlayerActivity を継承した Activity を作成して、中身をごにょごにょしていきます。
UnityPlayerActivity を継承する理由は、今回、Nexus Q でアプリを操作するために、キーイベントの状態を取得するためです。


import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;
public class NexusQActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
}
}

「Proj-A」で、「Proj-UA」をライブラリとして追加します。
ライブラリとして追加するには、プロジェクトのプロパティからAndroidの項目を選ぶと設定できます。

2-6-min.jpg

manifest ファイルの内容を、「Proj-UA」の manifest ファイルの内容で置き換えます。
ここで、コピペしたままだと、UnityPlayerProxyActivity がランチャーになっていますが、ランチャーを今作ったActivityに変更します。


<activity android:name="com.unity3d.player.UnityPlayerProxyActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:screenOrientation="portrait">
</activity>
<activity android:name="jp.co.taosoftware.android.artemis.NexusQActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

あとはそのままでも大丈夫です。

@IT では、Unity とAndroid を組み合わせたプロジェクトの作成で、1番と2番の両方とも解説されているので参考になります。

その他

本人曰く、「きっともっと簡単なやり方があるだろうとの事、Unityやっている人ならさくっとできるんじゃないですか!」

今回のNexusQ対応は、アルテミス作った人とは別人で、Unityを1から勉強して1週間ぐらいかな(というか、そもそもさっくっとイベントだけ取って動かすつもりだったので、Unityを勉強する必要があるとか、全然考えてませんでした)

ということで、一例としてとらええて頂けたらと思います。

ブログ内の関連する記事