2015年7月1日水曜日

AndroidWearとUnityを連携する 前編

こんにちは。野田です。

今回と次回でAndroidWearとUnityを連携させる方法を紹介します。

最終的にはCardboardSDK for Unity使って、CardboardアプリをAndroidWearで操作できるようにしたいのですが、ブログで紹介するのは連携させるところまでです。
続きは7/18(土)のAndroidWearハッカソンでやろうと思ってます。
皆さんにも体験してもらえるようにCardboardもいっぱい持っていくので、興味がある方は、ぜひ参加してくださいね!
http://goo.gl/forms/hEq7Pch3fy

今回の前編では、Android側の実装の説明をします。


■環境

  • Windows 8.1
  • AndroidStudio 1.3
  • Unity 5.1.0f3


■Android側の実装
 1.概要
 2.プロジェクト作成
 3.UnityのLibrary追加
 4.MessageAPIを使って、Wearからタッチ情報を受け取る
 5.Serviceの起動、停止
 6.jarファイルの作成
 参考サイト

1.概要
Mobile(HandHeld)の方はServiceだけ実装し、jarにしてUnityで読み込むようにします。
このServiceはDataLayerAPIのMessageAPIを使って、Wearからタッチ情報を受け取るように実装します。
WearableListenerServiceを継承して実装してもOKです。
ソースは下記にあげています。
https://github.com/scarviz/TouchU

2.プロジェクト作成
New Projectで、Phone(Android 4.3(API Level 18)以上)とWearにチェックを入れて、Mobileは「Add No Activity」で、Wearは「Always on Wear Activity」で作ります。
Unityでゲームとかする時に、WearはAlways onの方が都合がいいので、「Always on Wear Activity」を選択しています。

3.UnityのLibrary追加
MobileにUnityのライブラリを追加します。

C:\Program Files\Unity\Editor\Data\PlaybackEngines\androidplayer\release\bin
にclasses.jarがあります。それをlibsフォルダ以下にコピーしてください。
そして、コピーしたclasses.jarを右クリックし、「Add As Library」を選択します。



4.MessageAPIを使って、Wearからタッチ情報を受け取る
WearでタッチしたときにHandHeldにMessageを投げるように実装します。
いつも通りGoogleApiClient、MessageListenerの実装してください。
AndroidManifestにmeta-dataも追加してくださいね。

ServiceのMessageListenerのonMessageReceivedでは、Unityにタッチされたことを通知するメソッドを実装しておきます。
下記のようにUnityPlayer.UnitySendMessageを呼んでください。またUnityの実装の時にも説明しますが、Unityで実装したコールバックメソッドを呼んでる処理になります。
第一引数がGameObject名、第二引数がコールバックメソッドのメソッド名、第三引数が返したいメッセージ(文字列)になります。
今回は、GameObject名はService起動時に設定するようにしようと思います。

TouchUService.java(119)
    MessageApi.MessageListener mMessageListener = new MessageApi.MessageListener() {
        @Override
        public void onMessageReceived(MessageEvent messageEvent) {
            String path = messageEvent.getPath();
            Log.d(TAG, "path:" + path);
            if (TextUtils.isEmpty(path)) {
                return;
            }

            // タッチイベント発生時
            if (path.equals(PATH)) {
                // コールバックする
                UnityPlayer.UnitySendMessage(mGameObjName, CALLBACK_NM, ACTION_DOWN);
            }
        }
    };


5.Serviceの起動、停止
Serviceの起動、停止をUnityのActivityから行うように実装します。
※WearableListenerServiceを継承して実装している場合は不要と思います。

下記のようにUnityPlayer.currentActivityで、Unityで表示されている画面のActivityを取得します。
Activityが取得できれば、あとはいつも通りstartService、stopServiceを呼ぶだけですね。

TouchServiceCtrl.java
    /**
     * サービスを起動する
     *
     * @param gameObjectNm
     */
    public void startService(String gameObjectNm) {
        Log.d(TAG, "startService");
        Activity activity = UnityPlayer.currentActivity;
        Context context = activity.getApplicationContext();

        Intent intent = new Intent(context, TouchUService.class);
        intent.putExtra(TouchUService.KEY_GAME_OBJ_NM, gameObjectNm);
        activity.startService(intent);
    }

    /**
     * サービスを停止する
     */
    public void stopService() {
        Log.d(TAG, "stopService");
        Activity activity = UnityPlayer.currentActivity;
        Context context = activity.getApplicationContext();
        activity.stopService(new Intent(context, TouchUService.class));
    }


6.jarファイルの作成
Mobileのbuild.gradleを編集します。
※わかりづらい場合は、https://github.com/scarviz/TouchU/blob/master/mobile/build.gradle を参考にしてください。

applyplugin:'com.android.application'

applyplugin:'com.android.library'

に変更。

defaultConfigから、applicationId、versionCode、versionNameを除去。

下記を追記。
//task to delete the old jar
task deleteOldJar(type: Delete) {
    delete 'release/AndroidPlugin.jar'
}

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

exportJar.dependsOn(deleteOldJar, build)

GradleProjectsからexportJarを実行してください。




releaseフォルダにAndroidPlugin.jarができていると思います。
次回はこのAndroidPlugin.jarをUnityに読み込ませて、Wearからのタッチ情報を取得するように実装します。


■参考サイト
Create An Android Plugin For Unity Using Android Studio
http://www.thegamecontriver.com/2015/04/android-plugin-unity-android-studio.html

0 件のコメント:

コメントを投稿