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

MRデバイスMeta2発売に備えて、Meta1と色々比較してみました

AdventCalendar Meta Unity

これは、Oculus Rift Advent Calendar 2016の6日目です。

前回は、@obaatsu さんの 『ふぉとゆに』をViveからTouchに移行したハナシ でした。

今回は、お題に含んでいただいてたので、VRではなく、MR(Mixed Reality)について書くことにしました。


===

目次

0.はじめに

1. Meta1とは?

2. Meta1でできること

3. Meta1でのアプリの作り方

4. Meta2でのアプリの作り方

5. Meta1とMeta2のアプリの作り方の違い

6. 終わりに

===

0.はじめに

MRといえば、MicrosoftのHoloLensが有名ですが、Metaというデバイスもあります。

両者のプロモーションムービーを見ると、コンセプトが似ています。

また、Metaは、もうすぐMeta2という新機種が出ます。

しかし、Metaについては基本的にムービー以上の情報があまりないのが実態です。

そこで、Meta2の準備をするために、前機種であるMeta1を含めて色々と整理してみました。

1. Meta1とは?

Meta Companyが2013年に発表し、2014年に発売したHead Mount Displayです。

こちらにまとめてあります。

www.slideshare.net

あるいはだいたい同じ内容ですが、こちらにも一通り書きました。

magicbullet.hatenablog.jp

(自分でも忘れてましたが、この時点でHoloLensに期待してたことが書いてありました)

2. Meta1でできること

ToFセンサがついているので、手の動きを認識してCGオブジェクトを操作することができます。

以前紹介したものと同じですが、こんなことができます。

Grab

手でオブジェクトを握ることで、オブジェクトを移動させる


Pinch Out/In

両手の指でオブジェクトを拡大、縮小させる


Tap

オブジェクトに触ることで、操作する


また、RGBカメラによりAR表示も可能です(のはずですが、私の環境ではうまく動きませんでした)。


ToFセンサとRGBカメラを組み合わせることで、SLAMという方式も使えます。

SLAMとは、「自分の位置を推定しながら周辺の地図を作る方式」のことですが、MetaやHoloLensのようなHead Mount Displayでは、三次元空間に表示したCGオブジェクトに「近づく」、「遠ざかる」ができることです。

綺麗に書けてないですが、こういうイメージです。

f:id:Takyu:20161204074752j:plain

f:id:Takyu:20161204074759j:plain


ただし、ジェスチャーもSLAMも、認識精度は高くありません。

3. Meta1でのアプリの作り方

大前提として、Unityで開発します。他の開発方法は書かれていませんでした。

Developerサイトよりunity package、ドライバーソフトを取得します。

ドライバーソフトをインストール後、下記のように接続します。

f:id:Takyu:20161204074813j:plain


Unityを起動して、Hierarchy ViewにMeta WorldというPrefabを置きます。立体視のためにCamera オブジェクトが二つ付いているなど、Meta1を動作させるための必須Prefabです。


また、Meta1で操作したいオブジェクトには、Meta Bodyというコンポーネントを追加します。

f:id:Takyu:20161204074857p:plain

MetaBodyには、使えるジェスチャが表示されます。実際に起動させたとき、有効にしたジェスチャだけが認識されます。

では全部有効にすればよいか、と考えたいところですが、有効にしたものが多いと個別のジェスチャを認識しづらくなるので、ほどほどにする必要があります。


Meta1装着時にジェスチャで操作したいオブジェクトを適当に配置してロジックを作ったら、Unityエディタで実行するか、Windows (exe形式)向けにビルドして実行します。

Meta1は先ほど示した配線図の通り、PCがないと動かず、PCの画面をミラーリングする形で使用します。


ちなみに、SDK ver1.3.4でWindows10 Proの環境で使用すると、Unity Editor実行時に100%Unityが落ちます。

Forumに問い合わせをして色々調べたところ、最終的にUnity Editorの32bitを使うことで回避できました。

(Meta2でも類似現象が発生するかもしれないので、参考までに記載しました)

4. Meta2でのアプリの作り方

引き続きUnityで開発する方針は固定とみてよさそうです。

Meta2未発売のため詳細は不明ですが、1回だけMeta社がブログでHello World的なアプリの作り方を公開していました。

blog.metavision.com

この中にはYou Tubeのリンクも貼られており、Unityを使って開発する流れが具体的に解説されています。

5. Meta1とMeta2のアプリの作り方の違い

動画を見ていて、Meta1との違いがいくつかわかったので、整理してみました。

項目 Meta1 Meta2
基本となるPrefabの名称 Meta World Meta2
操作したいオブジェクトに必要な処理 Meta Body Componentを追加 追加不要。Create Objectするだけ
SLAM機能 SDKのver1.1.0から使用可能。ただし精度は低く、ドキュメントにもα版の実験的なものだと書かれていた 最初から使用可能。You Tubeの動画を見る限り、CG上に表示させた両手で、オブジェクトを自在に制御できていた。精度はよさそう
操作方法 規定のジェスチャでのみ制御できる まるでオブジェクトが実在するかのように、自由に操作できる

(ブログの内容を元にした考察です。開発状況によって、今後変わる可能性があります)

まだ情報が少ないですが、Meta1よりもアプリ開発が楽になり、精度が上がっていると思われます。

6. 終わりに

これまでのMeta2の情報を見ると、Meta1でうまくいかなかった点が改善されているようです。
予定よりも発売日が遅れていることだけが懸念ですが、Meta1の時も1年近く遅れたので気長に待とうと思っています。


2016年は、MicrosoftのHoloLensが発売されたり、LenovoからGoogleのProject Tangoベースのタブレットが発売されたりと、VRだけでなくMR関係の話も盛り上がりました。

また、

・VR向けHead Mound Displayの大手であるHTC VIVEが、Microsoftと一緒にVR/MRのデモを披露して連携をアピール

IntelがVR/ARを意識したHead Mount Display「Project Alloy」を発表

など、VRとAR/MRの融合も起きつつあります。


個人的には、VRとAR/MRは構成する技術が多く、相互に発展していくものと考えています。

2017年もブログや勉強会などを通じて広く情報発信しつつ、色々な方と交流できればと思いますので、引き続きよろしくお願いします。


明日は、@nyanko_omori さんによる、Oculus Touchのお話です。よろしくお願いします。

Unity+VR/AR/MR勉強会で、2つ同時の発表をしました。

Meta Android Unity 勉強会

下記でご依頼いただき、2種類の内容を同じ日に発表しました。

atnd.org

発表1:UnityでAndroid nativeの機能を使う⽅法の勘所

ここ2ヶ月ほど、ブログで書いていた内容のまとめです。記事が多めになったので、いったん整理する意味で発表資料にしました。

www.slideshare.net


関連記事はこちらです。

magicbullet.hatenablog.jp

magicbullet.hatenablog.jp

magicbullet.hatenablog.jp

magicbullet.hatenablog.jp

magicbullet.hatenablog.jp



Eclipseはともかく、Android Studio向けの情報があまりないので、もし似たようなことをやりたい方には役に立つかもしれません。


発表2:MRデバイスMeta2に向けて、Meta1の SLAM機能をためしてみた

f:id:Takyu:20161127215037p:plain

私はおそらく数少ない日本人のMeta1所持者で、過去にブログにいくつか書いたこともあります。

Meta1については、残念ながら当初の紹介動画とは遠い印象でしたが、いくつかの情報筋から、次世代機のMeta2にとても期待しています。

そこで、Meta2が届く前にMeta1の最新機能であるSLAM機能について整理してみました。

www.slideshare.net

感想

実は、諸事情で12月から数ヶ月ほど活動頻度が減る可能性があります。

そこで、お声かけもいただいていたので、その前にということで、2つ同時発表に挑戦してみました。

いつもよりは準備に時間がかかりましたが、無事に終わってよかったです。


Unity-Androidは、残りの未完のブログを書いたら収束させます。

12月以降にMeta2が来るはずなので、12月からはMeta2とHoloLensのMR関係に注力する予定です。

MacのVisual Studio CodeとUnityを連携させる方法(3)

Visual Studio Unity Mac

以前紹介したように、私はMac版Unityで開発する時は、Visual Studio Codeを使っています。

magicbullet.hatenablog.jp

magicbullet.hatenablog.jp

(2)の記事で、インテリセンス(コード補完)が効かなくなったときの対処方法を書きましたが、先ほどそれでも対応できなかった(結果的には勘違いも含みます)があったので、参考までに紹介します。

環境

Mac OS X 10.11.6
Visual Studio Code 1.7.1
VSCode.cs v2.7 ( (2)のときはv2.6)

現象

Unityのプロジェクトを別のフォルダにコピーしてから、Visual Studio CodeでUnityC#のインテリセンスが効かなくなってしまった。

(2)の記事で紹介した方法により、Legacy C# SupportのExtensionが入っていることは確認済み

原因

プロジェクトを別の名前のフォルダにコピーしたことで、slnファイルが二つ生成されてしまい、Visual Studio Codeが新しいslnファイルを読み込んでいたため。

補足説明

例えば、UnityProjectAという名前のプロジェクトを作ったとします。そうすると、UnityProjectAの階層に、slnファイルやAssetsフォルダなどが生成されます。

UnityProjectA / UnityProjectA.sln

今回、途中からgit管理したくなったので、UnityProjectAフォルダの中身をコピーしてUnity_gitという別フォルダの中に入れました。

このように配置すると、Unity_gitフォルダには、UnityProjectA.sln以外にUnity_git.slnという別のslnファイルが生成されます。

Unityで開発を続ける分には問題ないのですが、Visual Studio Codeでは、Unity_git.slnを読んでいました。

対処方法

Visual Studio Codeで、元のプロジェクト名のslnファイルを読み込むように変更する

補足説明

Visual Studio Codeの右下を見ると、読み込んだプロジェクトのslnが表示されています。

f:id:Takyu:20161115000749p:plain

ここをクリックすると、画面上部にslnの選択画面が出ます。

f:id:Takyu:20161115000820p:plain

ここで、フォルダコピー前のslnを選択すると、インテリセンスが効くようになります。



こんな使い方をする方はあまりいないかもしれませんが、せっかくなので整理してみました。

(4-2) UnityでBing Speech to Text API(Android用)を使う方法

Android Unity

前回の続きです。

magicbullet.hatenablog.jp

前回はUnityでBing Speech to Text(Android用)を使う手順のうち、Android Studio側で準備する内容を解説しました。

今回はUnity側の手順を解説します。

==============================
目次

(1章は前回の記事を参照ください)

2. Unity側の手順

2-1. プロジェクト作成&フォルダ構成を変更

2-2. スクリプト作成

2-3. uGUIでボタン作成

2-4. ビルド

3. 動作確認

4. 終わりに

==============================

2. Unity側の手順

2-1. プロジェクト作成&フォルダ構成を変更

(1) 空のプロジェクトを作成

ここは説明不要ですね。

(2) Assets以下のフォルダ構成を変更

以下のようにします。スペルミスにご注意ください。

f:id:Takyu:20161108233910p:plain

(3) AndroidManifest.xmlとSpeechSDK.jarを追加

AndroidManifest.xmlは、Unity標準のものを使います。下記からドラッグ&ドロップします。

Macの場合
/アプリケーション/Unity/PlaybackEngine/AndroidPlayer/Apk/AndroidManifest.xml

Windowsの場合
C:\Program Files\Unity\Editor\Data/PlaybackEngines/AndroidPlayer/Apk/AndroidManifest.xml

配置後、下記のようにpermissionやserviceを追加します。


gist31362bb5b3588534bd643afd90c14404


SpeechSDK.jarは、Android Studio側のプロジェクトから取り出します。
Android Studio側でビルドすると、以下に生成されています。

samples/SpeechRecoExample/build/intermediates/exploded-aar/com.microsoft.projectoxford/speechrecognition/1.1.0/jars/libs/SpeechSDK.jar


これをPlugins/Android フォルダに入れます。

(4) libandroid_platform.soを追加

libandroid_platform.soは、Android Studio側のプロジェクトから取り出します。
これはビルドと関係なくプロジェクトに配置されていますが、下記の中にも入っています。

samples/SpeechRecoExample/build/intermediates/jniLibs/arm/release/armeabi/ libandroid_platform.so

これを、Plugins/Android/libs/armeabi-v7aフォルダの中に入れます。

(注)Unityは基本的にフォルダ構成を気にせず開発できますが、いくつかのフォルダ名は予約語扱いされており、その名前にしないと動きません。

今回のフォルダ名は予約語扱いされているので、この名前にしてください。


(5) assetフォルダとresフォルダにwavとxmlファイルを追加

下記のwavとxmlファイルを、

Plugins/Android/assets/

Plugins/Android/res/values/

に入れます。


f:id:Takyu:20161108090744p:plain


(6) ビルドしたjarファイルを追加

最後に、Android Studioでビルドしたjarファイル(初期ファイル名はclasses.jar)を追加します。

名称は何でもよいです。特に意味はありませんが、他のアセットを調べた時、plugins.jarとなっていたので、この名前に変更してから入れました。

入れる場所は、Plugins/Androidの中です。

2-2. スクリプト作成

(1) Manifestファイル

次に、2-1 (3)で入れたManifestファイルに追記します。

追記箇所は、<permission>と<service>です。

<permission>は、元のサンプルの記述をそのまま使っています。

<service>は、今回向けに追加したものです。

最終的にこのようになります。



giste78a421f6137a9aa4552ff4a8319bf04


(2) C#

このようなスクリプトを作ります。

今回、個々のpublicメソッドは、uGUIのボタンから呼ぶようにしてみました。


gistf29682214864ad95cff9172847fe4268

また、onCallbackResultメソッドは、Androidjavaでこのように書くことで、java側から呼んでいます。

UnityPlayer.UnitySendMessage("TestObject","onCallBackShowResult",response.Results[i].DisplayText);

スクリプトTest1.csは、Empty Gameobjectを作り、そこにアタッチします。

2-3. uGUIでボタン作成

特に大したことはしていません。uGUIでボタンを作って、先ほど作ったC#のメソッドを呼ぶようにしただけです。

f:id:Takyu:20161108225742p:plain

ここで、Canvas以下の要素について説明します。

Text :音声認識結果を表示

StartBindServiceボタン:bindServiceを開始。Test1.csのbindService_Startメソッドを呼ぶ。

StopBindServiceボタン:bindServiceを停止。Test1.csのbindService_Stopメソッドを呼ぶ。

StartRecognitionボタン:音声認識を開始。Test1.csのstartRecognitionメソッドを呼ぶ。


ちなみに、今回の趣旨とはずれますが、skyboxの見た目を変えたいときは、下記の記事の「補足」を試してみてください。

Unityモデルの見た目を調整する方法をまとめました - Cross Road


2-4. ビルド

File -> Build Settingsで通常のAndroidアプリをビルドするときの手順と同じように進めます。
Build identifierは任意の名称で大丈夫です。Android Studioで作ったときのpackage名と合わせる必要はありません。

3. 動作確認

XperiaZ3(Android 5.0.1)にインストールし、BindServiceボタン、StartRecognitionボタンの順に押してから「これで動きました」と話しかけてみました。

f:id:Takyu:20161108231325p:plain

マイクロソフトコグニティブサービス」と話しかけた結果です。

f:id:Takyu:20161108233740p:plain

4. 終わりに

今回使ったMicrosoftのBing Speech to Textは、以前書いたように、これまで試した音声認識エンジンの中で、認識精度と速度が最も速いです。なので、Unityで使えるようにすると、色々と応用範囲が広がると思います。

また、今回、あまり情報がないことで時間がかかった面もあるので、本記事を含む4種類の記事で実装方法やトラブル対応集を整理しました。

合わせてご参照いただければと思います。


【Unity-Android 】 (1) Android StudioでUnity向けにmoduleを作る方法 - Cross Road

【Unity-Android 】(2) Android Studio作ったmoduleを、unityから呼ぶ方法 - Cross Road

【何回かに分けて更新予定】(3) Android StudioでUnity向けにmoduleを作るときのトラブル対応集 - Cross Road




===
2016/11/25 追記

今回のサンプルコードをGithubで公開しました。手順についてはブログの該当記事を参照してください。
ざっくり言うと、Cognitive ServiceのPrimary Key、LuisAppID、Subscription Keyを書き換えてAndroid Studioでビルドし、ビルドで生成されたclasses.jar(念のため名前をplugins.jarなどに変更した方が良いかもしれません)を、UnityのPlugins/Androidに入れるだけです。

github.com


===

(4-1) UnityでBing Speech to Text API(Android用)を使う方法

Unity Android

以前紹介した、MicrosoftのBing Speech To TextをUnityで使えるようにしてみました。

magicbullet.hatenablog.jp

ただ、Android nativeアプリ開発に不慣れだったこともあり、色々とつまづきました。

せっかくなので、修正過程を整理しておこうと思います。

実行した環境は以下です。

MacOS X 10.11.6
Android Studio 2.1.2

Windows10環境では試していませんが、Android Studioの話なので動くと思います。

=====

手順

1. Android Studio側の手順

1-1. Android Studioプロジェクトサンプルを入手し、動作確認

1-2. Module & Service化

1-3. ビルド

2章以降は別の記事に掲載
=====

1. Android Studio側の手順

1-1. Android Studioプロジェクトサンプルを入手し、動作確認

まずはMicrosoftが提供しているサンプルコードを入手します。

github.com

これをAndroid Studioで開きます。開いた後、下記の手順に従って、Androidスマートフォンで動くように設定します。

magicbullet.hatenablog.jp

この記事でも紹介しましたが、私の環境では、アプリインストール直後は、ほぼ必ず1,2回動作に失敗しました。
(Login Failedというエラーが出ます)

この場合、アプリの再インストールか再起動を繰り返してみてください。

1-2. Module & Service化

Microsoftが提供するサンプルコードは、アプリ(app)になっています。これだとUnityでアプリ化できないので、モジュール(library)に変更します。

アプリとモジュールの違いについては、下記を参照ください。また、以後は下記を確認済みとして解説します。

magicbullet.hatenablog.jp


以下、手順です。

[1] classes.jarを追加

以下のclasses.jarでctrl+cした後、Android Studioを開いてlibフォルダで、ctrl+pします。

Macの場合
/アプリケーション/Unity/PlaybackEngine/AndroidPlayer/Variations/mono/Release/Classes/classes.jar

Windowsの場合
C:\Program Files\Unity\Editor\Data/PlaybackEngines/AndroidPlayer/Varitations/mono/Release/Classes/classes.jar

classes.jarをドラッグ&ドロップすると、copyではなくmove扱いになって、Unityの本来のフォルダからclasses.jarが消えてしまうので注意してください。

コピーすると、Android Studio上ではこのように配置されます。

f:id:Takyu:20161106131058p:plain

メッセージウインドウが2回出ますが、どちらもOKを選択してください。


[2] build.gradleを修正

applicationではなくlibraryとしてビルドするため、先頭を変更します。

また、末尾(でなくてもよいですが)に、android.libraryVariants.all を使って、ビルド時の条件を追加します。

それ以外は元のMicrosoftのサンプルと同様です。下記のようになります。


gist1df4689cfea9d7484a04147b83e01c8b


[3] Unityと通信するためのI/Fクラスを追加

Project Viewにして、com.microsoft.CognitiveServicesExampleで右クリックし、New / Java Class を選択して、新しくクラスを追加します。

私の場合、クラス名をNativeBridgeとしました。

f:id:Takyu:20161106175735p:plain


[4] I/Fクラス NativeBridge.javaにbindServiceの機能を実装

色々試しましたが、最終的に元のMicrosoftの機能をService化することで、動作させることができました。

以下はNativeBridge側の機能です。

ざっくり説明すると、元の機能をServiceとして呼び出し、bindServiceによってUnity側のActivityとつなぎ、Service化した機能をUnityに渡しています。

bindServiceの書き方は少し複雑ですが、いくつか調べたところ、決まったフォーマットで書けばよいことがわかったので、それに倣って書きました。

下記はNativeBridge.javaの実装例です。


gist47c7cb56bd156593badcefcca2a80827

なお、これだけを書いた時点では多数のエラーが出ます。それはMainActivity.java側を変更していないためなので、この時点では無視して問題ありません。


[5] Activityクラスを修正

Serviceとして呼ぶためにActivityの記述を削除すること、およびUnityに音声認識結果を返すためにUnitySendMessage関数を仕込むこと、の2つが大きな修正目的です。

個別に説明すると相当多くなるので、ここでは主な修正箇所をざっと解説します。余力があればgithubで全体を公開します。


(2016/11/27 追記:Githubで公開しました。)

import

以下を追加。

import android.os.IBinder;

import android.util.Log;
import com.unity3d.player.UnityPlayer;

import android.content.Intent;

import android.app.Service;
import android.os.Binder;
bindService

以下を追加。

    public class MyServiceLocalBinder extends Binder {
        MainActivity getService() {
            return MainActivity.this;
        }
    }
    private final IBinder mBinder = new MyServiceLocalBinder();

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    @Override
    public void onRebind(Intent intent){}

    @Override
    public boolean onUnbind(Intent intent){
        //onUnbindをreturn trueでoverrideすると次回バインド時にonRebildが呼ばれる
        return true;
    }
元のサンプルコードでボタンやラジオボタンで処理が分かれる箇所

基本的に全てtrueで返し、ボタン関係の処理はコメントアウトします。

認識対象の言語

下記のようにgetDefaultLocaleメソッドを修正し、日本語対応させます。

    private String getDefaultLocale() {  return "ja-jp"; }
onCreateメソッドの削除

全てコメントアウトします。

StartButton_Clickメソッドの変更

このメソッドの中では、Activityを引数に持つメソッドを呼び出す箇所が何個かあります。

ただ、今回はServiceにしているので、Activityを引数に持たないようにします。

幸い、呼び出したいメソッドを調べるとActivityが引数にない場合の宣言もあるので、こっちを使います。

また、StartButton_Clickメソッドの引数はなしにしておきます。

onFinalResponseReceivedメソッドにUnitySendMessageを追加

このメソッドは、音声認識が完了すると呼ばれます。
そこで、ここにUnitySendMessageを挟むことで、認識結果の文字列をUnity側に送ることができます。

具体的には、

 for (int i = 0; i < response.Results.length; i++) {
                UnityPlayer.UnitySendMessage("TestObject","onCallBackShowResult",response.Results[i].DisplayText);
             //   this.WriteLine("[" + i + "]" + " Confidence=" + response.Results[i].Confidence +
             //           " Text=\"" + response.Results[i].DisplayText + "\"");
}

のように記述します。

1-3. ビルド

Terminalを開いて、

./gradlew :samples:SpeechRecoExample:clean :samples:SpeechRecoExample:assembleRelease

を実行します。

Terminalの場所については、下記の2-5を参照ください。

magicbullet.hatenablog.jp



ここまで実行すると、Android Studio側の対応が完了します。

Unity側は次回記載します。

Unityを介してお仕事を募集、受ける仕組み「Unity Connect」について調べてみました

Unity UnityConnect

先日のUnite 2016 @ロサンゼルスで、Unityに関する新サービスがいくつか発表されました。

そのうちの一つに、Unity Connectがあります。

Unity Connectとは、Unityに関する仕事を募集したり、逆に自身がUnityに関するスキルを公開して仕事を得るための仕組みです。

ざっと見たところ、色々と面白そうな感じがしたのでちょっと調べてみました。

=====

目次

1. Unity Connect の登録方法

2. サイトの構成

3. 自分のプロフィール登録内容

4. 終わりに

=====

1. Unity Connect の登録方法

まず、Unity IDというものを作ります。これはAsset Store用のIDとは別です。


まずはここにアクセスします。

下記の画面で Create Unity IDをクリックして新しくIDを作ります。

f:id:Takyu:20161105200051p:plain

必要な項目を入力してCreate Unity IDをクリックします。

f:id:Takyu:20161105200104p:plain

これでIDが登録されるので、登録完了メールが来たらログインします。これでUnity Connectに参加できます。

2. サイトの構成

ログインするとこのような画面になります。

f:id:Takyu:20161105202129p:plain

Activity

Facebookのタイムラインと同等です。followした人や企業の更新情報が表示されます。

Discover

Project、Talent、Companiesのカテゴリ別に検索することができます。

f:id:Takyu:20161105203047p:plain

Project

個人または企業が進めているプロジェクトの一覧です。11/5時点ではプロジェクトの詳細を見ることはできませんでした。
(そもそも概要だけしか紹介しない仕様かもしれません)

Talent

Unity Connectに登録している個人の一覧です。詳細を見ると、どんなスキルがあって、どんな作品を作ったか、などが書かれています。


Companies

会社の紹介、および募集職種(ある場合)が掲載されています。

いくつか調べた中では、どこも募集職種の条件について、かなり細かく書かれていました。

たとえば、ある企業の応募条件です。

f:id:Takyu:20161105203913p:plain

Jobs

仕事を受けてくれる人の募集ページです。

たとえば、下記はある方の募集要項です。

Los Angeles, United States · Remote Ok · Task · 3 - 5 years experience using Unity · Unity Certified Preferred · Unity · Game Design · Animation · 2D Toolkit · pipeline · Video · 2D Platformer · Hourly · A Few Hours · English

意訳
アメリカのロサンゼルスが開発拠点。リモート対応OK。プロジェクトのアウトソース(Task)。3-5年のUnity使用経験。Unity Certified Developerの資格があると望ましい。対応してほしいスキルは、ゲームデザイン、アニメーション、2D Toolkit、パイプライン、ビデオ、2D Platformer。給料は1時間当たりで相談。作業時間は数時間。英語必須。

こんな感じの内容が多数掲載されています。
私が見た時点では146件ですが、これからもっと増えていくのかもしれません。

Recruit

f:id:Takyu:20161105210647p:plain

先ほどのJobsの反対で、自分の提示した条件の仕事を受けてくれる人を募集するためのページです。

募集するためにPost a Job しよう、という案内が出ています。

Post a Job

f:id:Takyu:20161105210940p:plain

仕事の募集をするためのページです。TaskとJobの二種類があります。

Taskとは、プロジェクトの一部をアウトソースするもので、Jobsはフルタイムかパートタイムで雇うものです。

3. 自分のプロフィール登録内容

ちょっと見づらくて申し訳有りませんが、初期状態の画面を貼ってみました。こんな感じに色々と登録できます。

f:id:Takyu:20161105211832p:plain

f:id:Takyu:20161105211839p:plain


いくつか補足です。

Title :自分の職業を表すものを書きます。Programmer、Character Artist、Game Designerなどです。

About me :自己アピールです。こういう開発をしたとか、こういう技術習得をしているとか、です。

Desired Annual Salary:Annual(年間)の給料条件を記入します。「年間の」とあるので、Full Timeを選んだときに書けばよいと思います。

Why Me :自分だったらこういうことができる、のようなアピールです。ただ、ざっと調べた範囲では書いている人を見つけられませんでした。

Companies to Hide From:ここに記入した会社の所属の人には自分のプロフィールが表示されない、と思います。

4. 終わりに

日本でも転職サイトはありますが、Unityに特化し、案件単位で仕事を応募するサイトは、今回が初めてです。

全部英語なのは少し面倒ですが、Remote OKの仕事もけっこう多いので、日本の企業や開発者の方でも気軽に募集したり応募したり、ということができる気がします。

【何回かに分けて更新予定】(3) Android StudioでUnity向けにmoduleを作るときのトラブル対応集

Unity Android

前回と前々回で、Android nativeの関数をUnityから呼び出す方法について紹介してきました。

magicbullet.hatenablog.jp

magicbullet.hatenablog.jp

この方法によりJavaで書いたコードをUnityで呼べるのは間違いありません。

しかし、2回目で書いたように、実際に呼びたいAndroidの側のコードはもっと複雑であることが多く、この方法だけではうまくいかないことがあります。

たとえば、下記の記事で試している音声認識ソースコード(Android Studio)をUnityで使おうとすると、色々なエラーがでてしまい、使うことができません。

magicbullet.hatenablog.jp



そこで、この記事では、AndroidのnativeコードをUnityで使うとき、私が困ったことと対応方法について整理したいと思います。

そこそこ多くなりそうなので、何回かに分けて追加していきます。

===

トラブル対応集の一覧

(1) Android StudioでUnity系のpackageを書くとエラーになる。

(2) manifest.srcFileを書くと、AndroidManifest.xmlがない、というエラーが出る。

(3) aarとjarは、どちらを使えばよいか?

(4) Unityでビルドすると、Error building Player: IOException: Failed to Move File / Directory from 'aaa' to 'bob' というエラーがでる。(2016/11/1追加)

(5) activityを呼び出すには?(2016/11/28に追加)

(6) activityを呼び出すコードをtypoなく書いたのに、java.lang.ClassNotFoundExceptionが出る。(2016/12に追加予定)

(7) AndroidプロジェクトにC/C++ネイティブライブラリを含むとき、Unityではどこに配置するか? (2016/12に追加予定)

(8) Serviceを使うと、 android.os.BinderProxy cannot be cast to aaa というエラーが出る。(2016/12に追加予定)

(9) Unityで現在のAcitivityを取得するには? (2016/12に追加予定)

===

(1) Android StudioでUnity系のpackageを書くとエラーになる。

たとえば、Unityの関数(例:UnitySendMessage)をAndroidから呼び出したり、Unity上のAndroid向けActivityを取得するためには、下記のようなpackageをインポートする必要があります。

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

これをソースコードに書くとエラーになります。回避するには、Unityアプリケーションの中にあるclasses.jarをAndroid Studioのプロジェクトにインポートする必要があります。

classes.jarはMacWindowsで置き場所が異なります。下記はUnity5.3.5f1のときの配置です。Unityのバージョンによって場所が変わることがあるようなのでご注意ください。

Macの場合

/アプリケーション/Unity/PlaybackEngine/AndroidPlayer/Variations/mono/Release/Classes/classes.jar

Windowsの場合

C:\Program Files\Unity\Editor\Data/PlaybackEngines/AndroidPlayer/Varitations/mono/Release/Classes/classes.jar

インポートする場所は下記です。

f:id:Takyu:20161023200003p:plain

Warningなどが1,2回出ますが、OKを押して進めます。

この後、gradleのsyncを実行すればエラーが消えます。

f:id:Takyu:20161023200927p:plain

(2) manifest.srcFileを書くと、AndroidManifest.xmlがない、というエラーが出る。

build.gradleには、srcやAssetsフォルダなどを認識させるためのオプション "sourceSets"があります。

下記のブログを書かれた方の動機から推測すると、このオプションはEclipse上での構成を移行するときに使うようです。

qiita.com


今回、MicrosoftのBingSpeechAPIをmodule化するために、新規プロジェクトを作って試したりもしました。

そのとき、元のMSのサンプルコードにあるbuild.gradleを書き写したところ、下記でエラーになりました。

android{
(途中省略)
    sourceSets {
        main {
         manifest.srcFile 'AndroidManifest.xml'
(途中省略)
        }
}

Error:A problem was found with the configuration of task ':app:checkDebugManifest'.
> File '/Users/UserName/AndroidStudioProjects/Test/app/AndroidManifest.xml' specified for property 'manifest' does not exist.


また、Android Viewからはmanifestフォルダが消えてしまいました。

f:id:Takyu:20161023202818p:plain



原因は、自分で作ったAndroid StudioプロジェクトとEclipseから移行したプロジェクトではManifestファイルの配置場所が異なっているためです。

Android Studio(2.1.2)で作った場合

app/src/main/AndroidManifest.xml

Eclipseから移行した場合

app/AndroidManifest.xml


十分には確認していないのですが、今回のオプションは Eclipseから移行したプロジェクトでなければ不要です。

ちなみに、build.gradleで manifest.srcFile 'AndroidManifest.xml'のオプションを削除すると、Android ViewでmanifestフォルダとAndroidManifest.xmlが復活します。

f:id:Takyu:20161023203739p:plain

(3) aarとjarは、どちらを使えばよいか?

UnityでAndroidのコードを使うには、aarかjarのどちらかをインポートする必要があります。

aarとjarの違いはここで解説した通りで、

aar : Android Archive Library (Androidアプリ開発に必要なファイルをまとめたもの)

jar : Java Archive

です。

つまり、aarの方が範囲が広く、aarにはjarだけでなくAndroidManifest.xmlも入っています。


自分の実験結果、および購入したアセットのフォルダ構成調査の結果から、Unityではaarもjarのどちらも使えます。
(Plugins/Androidに入れるだけです)

しかし、aarを使う場合、Androidmanifest.xmlの記述内容によっては、Unityでビルドした時にコンフリクトエラーになる場合があるため、Unityで準備されているAndroidManifest.xmlと重複記述がないようにする必要があります。

Unityで準備されているAndroidManifest.xmlは、MacWindowsで置き場所が異なります。

Macの場合

/アプリケーション/Unity/PlaybackEngine/AndroidPlayer/Apk/AndroidManifest.xml

Windowsの場合

C:\Program Files\Unity\Editor\Data/PlaybackEngines/AndroidPlayer/Apk/AndroidManifest.xml

中身はこうなっています。


gistb991ce1d94b5cdf556bafc7b88a8ae61


たとえば、Activityでintent.Action.MAINをAndroid Studio側に書いてしまうと、Unity側とコンフリクトを起こすので、書かないようにします。

(4) Unityでビルドすると、Error building Player: IOException: Failed to Move File / Directory from 'aaa/classes.jar' to 'bob/classes.jar' というエラーがでる。(2016/11/1追加)

jarファイルだけを使う場合、このエラーは発生しません。

これはAndroid StudioでUnitySendMessageとか、Unity向けのメソッドを使うために入れたclasses.jarが、Unityに入れたaarに残っており、UnityでAndroid向けのビルドをするときに使われるclasses.jarとかぶってしまうのが原因のようです。

starzero.hatenablog.com



解決するには、Android Studio側のbuild.gradleで下記を書いておきます。

android.libraryVariants.all { variant ->
    variant.outputs.each { output ->
        output.packageLibrary.exclude('libs/classes.jar')
    }
}

この記述により、Android Studioでライブラリのパッケージ(aar)を作る時、libs/classes.jarを除きます。

(5) activityを呼び出すには?(2016/11/28に追加)


aarの中にActivityがある場合、Unityから呼び出すことができます。

それぞれ、下記のコードを書きます。Java側のAcitivityに画面を準備していない場合、startActivityを呼び出した段階で画面が真っ白になります。


Android Studio

//import宣言などは省略

public void launchActivity(final Activity m_activity){
    Intent i = new Intent();
    i.setClassName(m_activity,"よびだしたいactivityをpackage名を含むフルパスで表記");
    i.setAction(Intent.ACTION_MAIN);
    m_activity.startActivity(i);
}

Unity側

//using宣言などは省略

public void launchActivity(){
  AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  AndroidJavaObject currentUnityActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
  AndroidJavaClass plugin = new AndroidJavaClass("Java側で呼び出したいActivityを持つクラスを、package名を含むフルパスで表記");
  plugin.CallStatic("launchActivity",currentUnityActivity);  // 第一引数は、Java側のメソッド名
}

また次の機会に更新します。