読者です 読者をやめる 読者になる 読者になる

いつか だれかの やくにたつ

いつか誰かの役に立てる記事を書きます

【Unity】オブジェクトがカメラに写っているかと注意点

Unity UniRx

OnBecameVisible()とOnBecameInvisible()を利用する

OnBecameVisibleはオブジェクトが可視状態になった時に呼ばれるメソッドです。
OnBecameInvisibleはオブジェクトが不可視状態になった時に呼ばれるメソッドです。
OnBecameVisibleはSceneViewにオブジェクトが写っている場合も呼ばれます。

using UnityEngine;

public class Visible : MonoBehaviour
{
	private bool isVisible;

	// 可視状態か
	public bool IsVisible
	{
		get { return isVisible; }
	}

	// 可視状態になった時に呼ばれる
	void OnBecameVisible ()
	{
		isVisible = true;
	}

	// 不可視状態になった時に呼ばれる
	void OnBecameInvisible ()
	{
		isVisible = false;
	}

}

可視状態についての注意点

Rendererがアタッチされていないオブジェクトには可視、不可視というものがそもそもありません(描画されないので)。
つまり、Rendererがアタッチされていないオブジェクトについては、OnBecameVisibleとOnBecameInvisibleは呼ばれません。

f:id:hetima333:20170213154823p:plain
例えば、SDユニティちゃんは画像のようにRendererがついているので注意が必要です。
(Rendererなしのオブジェクトに上のスクリプトをアタッチしても機能しません。)

対策として、インスペクタ側で可視不可視の判断に利用するRendererを指定するスクリプトを書いてみました。

using UniRx;
using UniRx.Triggers;
using UnityEngine;

public class Visible : MonoBehaviour
{
	// 可視不可視の判断に使用するRenderer
	[SerializeField]
	private Renderer targetRenderer;

	private bool isVisible;

	// 可視状態か
	public bool IsVisible
	{
		get { return isVisible; }
	}

	void Start ()
	{
		// 可視状態になった時に呼ばれる
		targetRenderer.OnBecameVisibleAsObservable()
			.Subscribe(_ => isVisible = true);

		// 不可視状態になった時に呼ばれる
		targetRenderer.OnBecameInvisibleAsObservable()
			.Subscribe(_ => isVisible = false);
	}
}