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

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

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

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

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

GetComponent() について

http://www.cis.sojo-u.ac.jp/~izumi/Unity_Documentation_jp/Documentation/ScriptReference/GameObject.html

ここで示されている暗黙的にアクセス可能なオブジェクト以外にアクセスする際には GetComponent を利用するべきだよね。(static なシングルトン経由で対話しない限り)
でも、たまにこの GetComponent を使ってゲームオブジェクト自身 (スクリプトがアタッチされたオブジェクト自身、所謂 this) の Transform や Collider にアクセスしてるだとかっていう妙なスクリプトを見かける。
きっとこのあたりのことわかってないんだよなぁ、と思いつつ、自分が最初の頃に書いていたコードを眺めてみると
結構何でもかんでも GetComponent 任せでオブジェクトを取得していた。

いたたた・・・・

ちなみに上記に書かれている通り、アタッチされていないコンポーネントには null が入っているので、それでぬるぽを防げる。

if( collider == null )
{
  // nop. ないよ
}
または
if( gameObject.collider == null )
{
  // nop. ないよ
}

的な。

メモ

Vuforia 端末 DB の入れ替え?
https://developer.vuforia.com/resources/dev-guide/swappable-databases-unity

unzip さえ問題解決したら、これもいけるかな。

思考停止ってこわい

よく、Unity の事を調べてて、思考停止した内容が書かれていることがある。

「よくわからないけど、まぁいいや」
「何も考えずにコピペしてきたら動いたので解決」
「考えなくてもできるから Unity3D はすごい」

これ、本当にやめてほしいなぁと思う。
そして大抵の場合、この言葉を放っているのはプログラマ以外の職業の方々だ。
プログラマでも、学生さんがやってるブログや、その講師が書いたであろう文章はこういうのが多い気がする。
おそらく
「個人用だし」
「自分用の覚書だし」
「仕事じゃないし」
「知らないし」
「気にならないし」
「そこまで説明しても他の人も分からないだろうし」

という感じで書いてあるのだろうが、大きな間違いだ。と思いたい。

ゲームっていうのはたいていの場合、非常に多くのリソース(要素)を扱う。
このリソースは誰かがしっかりと管理しないと、作っていくうちにグダグダになっていく。
何故グダグダになっていくのかと言うと、1番大きな要因としてまず上がるのは仕様が次々と変更されるからだ。

仕様変更でグダグダになると、以下のようなことが起きる。
・この挙動は、いつの仕様だったのか誰も覚えていない
・現在の挙動を説明できる仕様が見当たらない
・今動いているコードが正しいものなのか判断できない

これはリリース時期が短いプロジェクトでもよく見られる光景だ。

さて、前述の「思考停止」は何がいけないのか。
ゲームを作るのは、建造物なんかを作るのに似ている。(クリエイティブなのだから当たり前か)
何処かで手を抜けば、そのツケは最後、住んでいる時に訪れるものだ。

もちろん、例外的にそれ(数多の思考停止)が見過ごされ、何の問題もない家に見えることもあるが、それはごく少数派であって「常識」ではない。
また今までいろんなプラットフォームでゲームを開発してきた経験から言うと、このごく少数派になったことはない。

長くなるなぁ。

で、思考停止は要するに「手抜き工事」に値するわけだ。
「なんかわかんないけど、動いたからこれでいいや」
というのは、何か問題があった時に
「やべー、何がダメなのかわかんねー」
となる。
いわばバグの温床である。

また、プログラミングがコピペでできると思い込んでいる人間も性質が悪い。
「これ、コピペしたらできそうですよね」
「(アプリの仕様書もなく) 1日でできるでしょ」
これを言った直後、プログラマに殴られても文句は言えない。
プログラマは今後の拡張に耐えうるだけの設計をしなければいけないし
非常にシンプルで何もなさそうに見えても、プログラマは正常処理をするように多くの箇所に神経を使う。
また、それ以外にも今後もし他に人間がコードを触りそうなのであれば、引継ぎの為に資料の作成ないしはコメントにてコードの解説をしなければいけない。
エラーメッセージ一つをとっても、ユーザに見せてはいけない(見せるべきではない)言葉というのがある。
例えば DB と接続しようとして「ConnectionError:MySQL 3306 /var/www/hoge/user.php line:26」と表示してしまうと、開発者は分かりやすいかもしれない。
丁寧にファイルパスから行数まで出ているし、MySQL を利用中でポート番号は 3306 を利用している、というところまで読み取れる。
しかし、これは決してユーザに見えるようにしてはいけない。
ユーザが同様の開発者だった場合、セキュリティホールになりかねないからだ。(当たり前)
つまり、プログラミングの能力はこれだけでも 日本語、英語、プログラミング言語 といった3つの言語を必要とする。


上記を踏まえたうえで、思考停止したような「コピペでできますよね」とかいう戯言は寝て言えと言いたい。
「なんとなく動いたからいいや」という情報は、必ず自分で詳細まで分析しないと気が済まないプログラマの独り言でした。

Vuforia ビデオ再生のバグ?

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

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

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

ある時ふと、Unity の Console 上に以下のようなエラーが出てきた。

Newline うんたら

なんじゃこれ。

調べてみると、どうやら BREW アプリ (auフィーチャーフォンの所謂ネイティブアプリ) では
大変非常にウザったいぐらいにお世話になったもとい苦しめられた "ダメ文字" で構文解析がおかしくなってるっポイ。
問題になっているダメ文字の後ろに '\' マークを入れてみると、解消したのを確認。
このご時世に、まだこういう問題ってあるんだね...しかも Unity みたいに多言語化されたツールでこれだよ...。
Unity っていうか、MonoDevelop か。

そこで、こちら。

http://debuglog.tumblr.com/post/26550984743/utf-8

すげぇぇぇぇぇぇ!思いつかんかった!こんなのあったのか!
Unity って、本当に使う人が多ければ多いほど、新しい発見のあるソフトウェアですね(=w=*)

さっそく導入してみたところ、エラーも解消!
ひょー!これで作業がはかどるぜ!

色々なソースを書いてからいざ動かしてみると、プレビュー上では動いているように見えても
実機に移してみるとどのターゲットでも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