【Unity】isVisibleとは?カメラの表示範囲に入っているかどうかを判定

isVisibleとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「UnityのRenderer.isVisibleってなに?」

「isVisibleを使うとどんなことができるの?」

というお悩みの方に向けた内容となっています。

Unityでは、Renderer.isVisibleというプロパティを使って、オブジェクトがカメラの表示領域内に入っているかどうかを判定することができます。

このisVisibleは、オブジェクトに紐づくRendererコンポーネントが、カメラの表示領域内にいる場合はtrue、表示領域外の場合はfalseを返すプロパティになっています。

例えば、isVisibleを使うことで、オブジェクトがカメラの表示領域の外に行ってしまった際に、そのオブジェクトを消去したりすることができます。

そこで、このページでは、Unityで使えるRenderer.isVisibleというプロパティについて、どんな機能があるのか、また使い方までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

isVisibleとは?

まずは、isVisibleがどういうものなのか紹介していきます。

カメラの表示範囲に入っているかどうかを判定している

isVisibleとは、カメラで映し出す領域内にそのオブジェクトが入っているかどうかをbool型で取得できるプロパティで、Rendererコンポーネント(SpriteRenderer・MeshRendererなど)で定義されています。

もう少し具体的に言えば、カメラで表示するゲーム画面の領域内に、そのオブジェクトが入っている場合は、isVisibleで「true」の値を取得することができます。

反対に、領域内に入っていない場合は、isVisibleで「false」の値を取得することになります。

また、isVisibleの特徴として、オブジェクトがカメラに映っているかどうかではなくて、あくまでもカメラの領域内に入っているかどうかを判定しています。

そのため、以下のように少しでもオブジェクトが映っているような場合や、他のオブジェクトが前に重なっていてカメラからは映っていないような場合でも、「true」の値を取得することになります。

カメラ範囲を使った処理を作れる

isVisibleのプロパティを使うことで、ゲームのカメラ範囲を使った様々な処理を作れるようになります。

例えば、シューティングゲームで自分が攻撃した弾のオブジェクトが、カメラ外にいってしまったら消去させる、といった処理をisVisibleの値を使って作ることができます。

他にも、カメラ範囲内にオブジェクトが入ったら、プレイヤーに攻撃し始めるなどのような処理も作ることができます。

このように、プレイヤーはカメラで撮影された映像だけを見ることになるので、その表示範囲内と範囲外で処理を分けることがisVisibleの値で簡単にできるようになります。

isVisibleの使い方

ここからは、isVisibleの使い方について紹介していきます。

オブジェクトにRendererコンポーネントが必要

まず、isVisibleを使うためには、オブジェクトにRendererコンポーネントが紐づいている必要があります。

そもそもRendererコンポーネントとは、そのオブジェクトを表示させるためのコンポーネントで、紐づいていない場合はゲーム画面にオブジェクトが表示されません。

このRendererコンポーネントにはいくつか種類があり、主に使われるものとして、

  • SpriteRenderer ⇒ 2Dで画像を表示する
  • MeshRenderer ⇒ 3Dで通常のメッシュを表示する
  • SkinnedMeshRenderer ⇒ 3Dで可変メッシュを表示する

といったものがあります。

isVisibleを使う際は、オブジェクトにこれらのRendererコンポーネントが紐づいていることを確認しておきましょう。

Renderer.isVisibleで判定して使う

isVisibleを使う際は、以下のようにスクリプト内で記述することで、bool型の値を取得できます。

Renderer.isVisible

オブジェクトに紐づいているRendererコンポーネントを参照する必要があるので、事前にGetComponentなどを使いRendererコンポーネントを取得しておく必要があります。

なお、Renderer型ではなくSpriteRenderer型MeshRenderer型を使うこともできますが、いずれもRendererクラスを継承しているクラスになるため、どちらでも処理は同じになります。

カメラ外のオブジェクトをオフにする処理

ここでは、実際にisVisibleを使ってオブジェクトがカメラ外に行った際に、そのオブジェクトをオフにするという処理を作ってみます。

以下のように、シーン内にキー操作で移動できるオブジェクトを準備しておきます。

なお、今回は2Dゲームなので、オブジェクトにはSpriteRendererコンポーネントがアタッチされています。

そして、オブジェクトに対して以下のスクリプトをアタッチしておきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    Renderer ren;
    bool visibleCheck = false;  // 表示されているかどうかの判定を保存する変数

    void Start()
    {
        ren = GetComponent<Renderer>(); // Rendererコンポーネントを取得する
    }
    void Update()
    {
        // オブジェクトがカメラ内にいるかどうかの確認
        if (ren.isVisible == true && visibleCheck == false)
        {
            visibleCheck = true;    // trueに変更する処理
        }

        // オブジェクトがカメラ内から外に移動した場合
        if (ren.isVisible == false && visibleCheck == true)
        {
            gameObject.SetActive(false);    // オブジェクトをオフにする処理
        }
    }
}

まず、Startメソッドの中の10行目でGetComponentを使って、Rendererコンポーネントを取得しています。

一度カメラ内にオブジェクトが表示されたことを確認するために、15行目でisVisibleがtrueの場合の条件式を作り、bool型の変数をtrueに変更しておきます。

そして、21行目でisVisibleがfalseの場合の条件式を作り、中でSetActiveメソッドを使ってオブジェクトをオフにする処理を行っています。

実際にゲームを実行して、オブジェクトをカメラの外に移動してみると、

オブジェクトのステータスがオフになっているのが分かります。

まとめ

このページでは、UnityのisVisibleについて、どんなプロパティなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

isVisibleとは、カメラにそのオブジェクトが描写されているかどうかを判定しているプロパティで、bool型で値を取得することができます。

このisVisibleを使うことで、カメラの範囲外に行ったオブジェクトに対しての処理などを作ることができるようになります。

また、オブジェクトが重なって後ろにいるような場合でも、isVisibleではtrueの判定が行われるため、カメラから見えているどうかで判定する際は注意しておきましょう。

最後までお読みいただきまして、ありがとうございました!

コメント