タグ「Unity4.2.1」が付けられているもの

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

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