テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

カメラに写っている間のみ処理を行う

Unity助け合い所で「カメラに写っているオブジェクトの一覧を取得する方法」が聞かれていたので、ここに書いておこうと思う。

デモ



楽な方法は、OnBecameVisible()及びOnBecameInvisible()を使用する方法。

OnBecameVisibleは可視状態になった際に呼ばれるMonoBehaviourのコールバック。OnBecameInvisibleは逆。つまりUpdateのようにコンポーネントに書いておけば勝手に呼ばれるメソッドだ。

こんな感じの処理を記載しておけば、画面外にオブジェクトが移動した際は処理を停止させてくれる。


void OnBecameInvisible ()
{
enabled = false;
}

void OnBecameVisible ()
{
enabled = true;
}

ただしSceneViewに表示されていても見える扱いといった、若干厄介な所がある。

なので、どちらかと言えばOnWillRenderObject()を使うほうが便利そうだ。

OnWillRenderObjectは「オブジェクトが可視状態のとき、カメラごとに一度呼び出さ れる」コールバックで、下のようなコードで「現在どのカメラに写っているか」を判定出来る。


void OnWillRenderObject()
{
Debug.Log(Camera.current.name);
}

後はこれのCamera.current.nameから"SceneCamera"を排除すれば、GameViewのみで写っている場合に処理を行うといった事が出来る。

void OnWillRenderObject()
{
#if UNITY_EDITOR
if(Camera.current.name != "SceneCamera" && Camera.current.name != "Preview Camera")
#endif
{
// 処理
}
}

なお、双方に言えることだが障害物で見えなくともカメラの範囲内ならば描画される(=視界内)とされる。なので、より厳密に表示判定をしたい場合は、マップの位置毎に最大Farを設定しておくとか、そういった小細工が必要になると思う。

スクリーンショット 2013-10-08 0.04.13
カメラはCubeで完全に塞がれているが、Cube1は見える扱いとなる。