タグ「Vuforia2.6.7」が付けられているもの

できたー!
あーめんどくさ、修正箇所などは後日書きます。

まずは身内向けに Facebook 告知して、git でプロジェクトを公開しようかな。

要点を纏めると、デフォルトで用意されたスクリプトは StreamingAssets しか見に行ってくれないので
自分でターゲットデータの保存位置を変える必要があります。
一応そのためのオーバーライドメソッドとかも用意されてて、それを使わせて頂きました。

どこにもサンプルっぽいものがなくて、急に難易度が上がったけど、できないことはない。
予想してたより工数とられたけど、まぁ結果オーライかな。
これでネット上から自分のターゲットを拾ってきて表示するっていうことができるようになったわけだ。
(CloudDatabases?の自家発電バージョン?)

さて、これで某社案件が俺にきても大丈夫だし、来なくてもいい勉強になった。
これを何とか、商売にする方法を考えてみよう。

Vuforia ビデオ再生のバグ?

まず、ビデオ用のターゲットを Unity 上で設定する.
次に、他のターゲットを Unity 上で設定する.

そこで、実機に転送して確認してみると
他のターゲットを映している時に、そのターゲットをダブルタップするとビデオが全画面で再生されてしまう。
タッチイベントを取っているのは VideoPlaybackController.cs なので
このあたりを修正すればいいはず。
結構時間かかりそう。

まぁサンプルだもんね、しょうがない。

色々なソースを書いてからいざ動かしてみると、プレビュー上では動いているように見えても
実機に移してみるとどのターゲットでも3Dや動画が AR 表示されてしまう...。

このような症状の場合は、OnTrackingLost() の処理が抜けていると思われる。
先ほど確認したところ、処理内容が似た名前のメソッドに移っていたりしたので
そういうところを修正して実機で確認。動いた。

原因は、以下の通り

UnityProjectRoot/Assets/Plugins/Android/VuforiaMedia.jar
UnityProjectRoot/Assets/Plugins/Android/libs/armeabi-v7a/libVuforiaMedia.so
UnityProjectRoot/Assets/Plugins/Android/libs/armeabi/libVuforiaMedia.so
UnityProjectRoot/Assets/Plugins/iOS/VuforiaMedia.a

プラグインあったんか!!ばかやろう!!

まぁサンプルプロジェクトのインポート内容見て気付ければよかったんだけどね。
以下、追っかけた跡。

MMD4Mecanim+Vuforia 環境での不具合

Unity4+MMD4Mecanim PMX対応版+Vuforia 環境にて、何もないロード画面から Application.LoadLevel() して Lat式ミクを表示する.
何故か表示できず(この原因究明中に発見)、そのままアプリを終了(停止?)すると
MMD4MecanimBulletPhysics のコンポーネントが Unity のプロジェクトビューに残ってしまう.

個人的なメモ.
結局原因が不明で、対処療法.

要因としては、OnApplicationQuit() が呼ばれていないから.
これって MonoBehaviour が用意しているのに、呼ばれないことなんてあるの?
どっかでオーバーライドしてて呼ばれてないだけ?
え、どういうこと?
新規で作った GameObject に、適当なスクリプト貼り付けて OnApplicationQuit でログを出そうとしても、
ちゃんとログが出力されないという...

えぇー...何が起きているんだ...

たぶんこっちで、なんか妙なことしてるんだろうなぁと思いつつ、この場合の対処をすることに.

ゲーム終了時に OnApplicationQuit() が呼ばれないと、


>MMD4MecanimBulletPhysics._applicationQuit
>MMD4MecanimModel._applicationQuit

の2点が true にならない.

以下、ワークフロー.
-> ゲームプレイ中だと判断される
-> MMD4MecanimModel.OnDestroy() の中で MMD4MecanimBulletPhysics.instance を取得しようとする
-> MMD4MecanimBulletPhysics の get で if( _instance == null && !_applicationQuit )... ってなってるけど、そのまま if の処理を続行
-> new Gameobject("MMD4MecanimBulletPhysics"); で、オブジェクト作成されちゃって、誰も捨ててくれない... (´;ω;`)ウッ...

で、ここまで調べておいてふと気づく。

これ、根本的な解決にならない。

というわけで、もとより気になっていた
ImageTarget が 非アクティブ状態になってる件
を追跡してみる.

まず、カスタムメイドの TrackableEventHandler を利用しているのが原因かな、と思ったのでカスタムを切ってから
Vuforia 付属の DefaultTrackableEventHandler.cs をアタッチしてみる。

結果 -> ダメ. 同じ現象が起きる

ARCamera に付属してた、どの Vuforia のバージョンからか分からないけど KeepAliveBehaviour ってやつのパラメータに
Keep AR Camera Alive とかいうのがあって、いつの間にかチェックが入ってた。
これを切ってみる。

結果 -> これだったーーーーーー!!!!!!!!!!!!!!!!バカバカバカ!!!!!!!!


KeepAliveBehaviour について
https://developer.vuforia.com/resources/api/unity/class_keep_alive_behaviour

なるほど、複数のシーン間でデータセットやターゲットデータを保持したまま遷移できるようになるのね。

いらねぇよ! いるかもしれねぇけど、今使わねぇよ!
しかもこれ、チェックしたら ILoadLevelEventHandler を実装しなきゃじゃん!

よし、切ろう。
ってことで解決ー。

Vuforia...ドキュメントが英語なのは結構骨が折れるぜorz

Unity Vufroia 上のエラー

Unity4.2 (4.0.x の時からだったはず)
Vuforia 2.6.7 (1.6.x でも起きる)

上記の環境下で、何もしなくても数件の Warning が出てくる。
これは Vuforia が 4.x 系で非推奨のメンバ変数 (C# はプロパティっていうの?) やメソッドを使用しているから。
毎回出てて、うざいっちゃあうざい!
アップデートの時に直せよ!って思う。なんで直さないんだろう...。

とりあえず、その小うるさいエラー内容はこちら。

1. Assets/Qualcomm Augmented Reality/Scripts/Internal/BGRenderingBehaviour.cs(40,31): warning CS0618: `UnityEngine.GameObject.active' is obsolete: `GameObject.active is obsolete. Use GameObject.SetActive(), GameObject.activeSelf or GameObject.activeInHierarchy.'
2. Assets/Qualcomm Augmented Reality/Scripts/Internal/BGRenderingBehaviour.cs(41,31): warning CS0618: `UnityEngine.GameObject.SetActiveRecursively(bool)' is obsolete: ` gameObject.SetActiveRecursively() is obsolete. Use GameObject.SetActive(), which is now inherited by children.'
3. Assets/Qualcomm Augmented Reality/Scripts/KeepAliveBehaviour.cs(262,51): warning CS0618: `UnityEngine.GameObject.SetActiveRecursively(bool)' is obsolete: `gameObject.SetActiveRecursively() is obsolete. Use GameObject.SetActive(), which is now inherited by children.'
4. Assets/Qualcomm Augmented Reality/Scripts/KeepAliveBehaviour.cs(276,47): warning CS0618: `UnityEngine.GameObject.SetActiveRecursively(bool)' is obsolete: `gameObject.SetActiveRecursively() is obsolete. Use GameObject.SetActive(), which is now inherited by children.'
5. Assets/Qualcomm Augmented Reality/Scripts/SetBGCameraLayerBehaviour.cs(52,42): warning CS0618: `UnityEngine.Transform.GetChildCount()' is obsolete: `use Transform.childCount instead.'

まず、上記3点の原因を纏めます。

GameObject.active は非推奨要素になりました. GameObject.SetActive() を用いるか、GameObject.activeSelf 、GameObject.activeInHierarchy プロパティを使いましょう。
GameObject.SetActiveRecursively() は非推奨になりました. GameObject.SetActive() を使えば子要素も再帰的に設定できます。
Transform.GetChildCount() は非推奨になりました. Transform.childCount プロパティを利用して子要素の数を取得してください。

以上です。
具体的な解決策としては、以下の手法を取りました。

1. Camera.gameObject.active -> Camera.gameObject.activeInHierarchy
2. Camera.gameObject.SetActiveRecursively(isActive); -> Camera.gameObject.SetActive(isActive);
3. previousTB.gameObject.SetActiveRecursively(false); -> previousTB.gameObject.SetActive(false);
4. previousTB.gameObject.SetActiveRecursively(false); -> previousTB.gameObject.SetActive(false);
5. go.transform.GetChildCount() -> go.transform.childCount

以上です。
とりあえず今のところ問題なく動いているから、大丈夫だと思う! 思うよ! わからん!

Vuforia 使用時のシーン遷移

おかしいなー。

シーン遷移が入ると、Vuforia の TargetManager に配置したモデルが表示されなくなってしまう。
というより、厳密には「トラッキングしなくなる」が正解かな?

例えば About シーンがあってゲームの概要を説明する。
で、AR シーンで Vuforia を使うんだけれど、この AR シーンで一切のトラッキングができなくなる。
一度、ImageTarget+ARCamera+Cube とかの最小構成で検証してみるしかないか。

追記:http://blog.twilighteve.info/2013/09/mmd4mecanimvuforia.html これが原因。をい!!!
というわけで、Unity さんを弄り回して Vuforia 嬢を愛でる作業を開始するよ。
Vuforia って、モンスターズインクのマイクみたt

...いつか擬人化してみようか。