MRが楽しい

MRやVRについて学習したことを書き残す

Unityでオブジェクトがカメラに映っているかの判定を行う その2(複数カメラ利用時の呼び出しタイミング)

本日は Unity の小ネタ枠です。
Unityでオブジェクトがカメラに映っているかの判定を行う方法と複数カメラ利用時の動作を確認したので記事に残します。

前回記事

前回記事の続きです。
bluebirdofoz.hatenablog.com

複数カメラ利用時の呼び出しタイミング

以下のサンプルスクリプトを使って複数カメラ利用時の各関数の呼び出しタイミングを確認しました。
・OnBecameVisibleTest.cs

using UnityEngine;

public class OnBecameVisibleTest : MonoBehaviour
{
    /// <summary>
    /// Rendererが任意のカメラから見えると呼び出される
    /// </summary>
    private void OnBecameVisible()
    {
        this.GetComponent<Renderer>().material.color = Color.red;
        
        // 関数呼び出し時のログ表示
        Debug.Log($"OnBecameVisible from {Camera.current.name}");
    }

    /// <summary>
    /// Rendererがカメラから見えなくなると呼び出される
    /// </summary>
    private void OnBecameInvisible()
    {
        this.GetComponent<Renderer>().material.color = Color.blue;
        
        // 関数呼び出し時のログ表示
        // OnBecameInvisible 関数では Camera.current は参照できません
        Debug.Log($"OnBecameInvisible");
    }
}

描画時(OnBecameVisible関数)とロスト時(OnBecameInvisible関数)の発生タイミング

OnBecameVisible 関数はカメラに写っていない状態からいずれかのカメラに映ったタイミングで呼び出されます。
メインカメラに写った後、シーンビューにオブジェクトが映った場合、メインカメラのログのみが呼び出されていることが分かります。

OnBecameInvisible 関数は複数のカメラがオブジェクトを映していた場合、全てのカメラから映らなくなったタイミングで呼び出されます。
特定のカメラから映らなくなっても、いずれかのカメラに映り続けている限り OnBecameInvisible 関数は呼び出されません。

因みに OnWillRenderObject 関数は映っているカメラごとに呼び出しが発生します。

このように OnBecameVisible 関数と OnBecameInvisible 関数は個々のカメラで呼び出しタイミングが発生する場合としない場合があるため、関数内で Camera.current を使ったカメラの判定処理を行う場合は注意が必要です。
関数内でカメラの判定を行ってカメラごとに処理を行いたい場合は必ず呼び出しが発生する OnWillRenderObject 関数を利用した方が良いと思われます。