2013年12月24日火曜日

Unityで複数カメラがあると、OnMouseDownなどが想定外の座標で反応する

Unityでゲーム作成していて、OnMouseDown,OnMouseEnter,OnMouseOver,OnMouseExit が
想定外の場所で反応することがありました。

意味不明な現象でしたが、原因は「カメラが複数あったこと」でした。

私の作り方では、まずシーン遷移をコントロールするために、
DontDestroyOnLoad で決して破棄されないオブジェクトを一つ作ります。
そのオブジェクトにくっついたスクリプトが
Application.LoadLevel や Application.LoadLevelAdditive を行うことで
制御を行っていたのですが、この「非破壊オブジェクト」は、何の気なしにカメラでやってたんですね。

そのおかげで、「制御されたシーンにおいてあるメインカメラ」と「非破壊オブジェクトとなったカメラ」の
ふたつがあることで、まったく想定外の座標でも OnMouseDown などが反応する、ということになってしまいました。



Unityには無害な空オブジェクトを作る Create Empty というメニューがありますので、
ちゃんとこちらを利用しましょう、という反省でした。

2013年12月17日火曜日

UnityでAnimation Event中にSetActive(false)するとフリーズする

UnityにはAnimationとAnimatorってのがあります。
AnimationにはIsPlayingのような再生確認のメソッドが用意されてますけど、
Animatorのほうにはそれらしきものがないんですよね。
スプライトアニメーションを作っても、終了タイミングを検知する方法が
用意されてないようです。


このように、終了フレームのところに Add Event Function して
呼び出すことで、終了検知するようにしてみたのですが、
とんでもないことがおきました。


function End(){
 gameObject.SetActive(false);
}

追加した End() のなかでSetActive(false) を呼び出すと、いきなりUnityがフリーズするのです。
イベントによる関数呼び出し中にオブジェクト自身を停止するのが悪い、ってことなんでしょうけど
いきなりフリーズはないわ~。
エラーメッセージじゃなくてフリーズするせいで、原因特定にかなり時間がかかってしまいました。


function End(){
 Destroy(gameObject);
}

Destroyでは大丈夫。正常にオブジェクト破棄できました。

UnityにVuforiaを入れて画面左下にしか表示されないバグの原因判明

原因がわかりました。
Unity4.3(Windows)、Vuforia2.6.7でやってたのですが、
どうもこれはバージョンの相性が悪かったようです。

Unityはいつでも旧バージョンがDLできてインストール出来るようになっていますが、
Unity4.2.2を入れてみたら…


このように、正常に全画面表示できました。
ARのためにいったんUnityのバージョンを4.2.2に落とすか、
Vuforia側の対応を待てばいいようですね。

2013年12月6日金曜日

UnityにVuforiaを入れてAndroidでARアプリ

http://nvtrlab.jp/column/1-1
この連載コラムの1~5を参考にして、Win7のUnityでAndroidアプリとしてAR機能をつけてみました。


AR機能自体は驚くほどあっさりと実装できたのですが、なにかカメラの範囲がおかしい。





真っ黒の部分は完全に無反応。
左下のエリアだけカメラが機能しているという不思議な状態になりました。

ARカメラの設定項目をひたすらいじりまくっても、一向にカメラ範囲は変化してくれません。
ググっても全く情報がでてきません。

なにこれ!