【Unity】カメラにオブジェクトが映ったことを検知するOnBecameVisible

OnBecameVisibleとは? Unity

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

このページでは、

「オブジェクトがカメラに映った時の処理を作りたい!」

「カメラ外のオブジェクトをオフにしたい!」

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

Unityでは、カメラで撮影している画面内に、オブジェクトが映ったことを検知できるOnBecameVisibleというメソッドがあります。

このOnBecameVisibleは、カメラ内に映っていないオブジェクトが、映り始めた瞬間に呼び出されるメソッドで、メソッド内に処理を書いておくことで、呼び出された際にその処理が行われるようになります。

例えば、OnBecameVisibleを使うことで、ゲーム画面をスクロールさせている場合に、敵が画面内に映り始めたら、攻撃をしてくるなどの処理を作ることができます。

そこで、このページでは、Unityでオブジェクトがカメラに映り始めた時に呼ばれるOnBecameVisibleのメソッドについて、どんなメソッドなのか、またそれぞれの使い方までをまとめていきます。

この記事を書いた人

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

OnBecameVisibleとは?

まずは、OnBecameVisibleがどんなメソッドなのかについて紹介していきます。

カメラの画面内にオブジェクトが映ったことを検知する

OnBecameVisibleとは、冒頭でも解説した通り、オブジェクトがカメラの画面内に映り始めたことを検知してくれるメソッドです。

もう少し詳しく言うと、OnBecameVisibleは、オブジェクトがカメラに映っていない状態で、カメラやそのオブジェクトが移動することによって、カメラに映る状態になった瞬間に呼ばれるメソッドです。

そして、このOnBecameVisibleメソッド内に処理を記述しておくことで、オブジェクトがカメラから見える状態になった場合に、指定した処理を実行することができるようになります。

ちなみに、オブジェクトの一部が少しでもカメラに映っている状態や、他のオブジェクトと被っている状態でも、カメラに映っている判定となり、OnBecameVisibleメソッドが呼び出されることになります。

また、ゲームを実行してオブジェクトが読み込まれて表示されるタイミングでも、OnBecameVisibleメソッドは呼び出されることになるため注意しましょう。

なお、オブジェクトがカメラに映っているか映っていないかの状態を表すプロパティとして、Renderer.isVisibleというものもありますので、以下の記事も参考にしてみてください。

カメラから映らなくなる場合はOnBecameInvisibleを使う

オブジェクトがカメラの画面外にいったことを検知してくれるOnBecameInvisibleというメソッドもあります。

このOnBecameInvisibleは、先ほどのOnBecameVisibleとは反対に、オブジェクトがカメラの画面内に映っている状態で、移動などが行われたことより、カメラの画面外にいった瞬間に呼ばれるメソッドです。

そのため、OnBecameInvisibleのメソッド内に処理を記述しておくことで、オブジェクトが画面外にいった場合の処理を作ることができます。

Rendererコンポーネントが必要

OnBecameVisibleやOnBecameInvisibleを使う際の注意点として、その検知したいオブジェクトにRendererコンポーネントがアタッチされている必要があります。

このRendererコンポーネントとは、オブジェクトを表示させるためのコンポーネントで、以下のような種類があります。

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

上記のようなRendererコンポーネントがアタッチされていないオブジェクトは、OnBecameVisibleやOnBecameInvisibleによって判定されなくなってしまうため、注意しておきましょう。

OnBecameVisibleとOnBecameInvisibleの使い方

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

それぞれのメソッド内で処理を記述して使う

OnBecameVisibleもOnBecameInvisibleも、検知したいオブジェクトに紐づけたスクリプトの中で、以下のようにメソッドを定義して使います。

void OnBecameVisible()
{
	// カメラ内に入った時の処理を記述 //
}
void OnBecameInvisible()
{
	// カメラ外に入った時の処理を記述 //
}

それぞれのメソッドの中に実行したい処理を記述してあげることで、カメラ外からカメラ内になったらOnBecameVisibleの処理が実行されて、反対にカメラ内からカメラ外になったらOnBecameInvisibleの処理が実行されることになります。

例えば、Rendererコンポーネントがアタッチされているオブジェクトに対して、以下のスクリプトを紐づけておきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    void Update()
    {
        transform.Translate(Input.GetAxis("Horizontal") * 0.01f, Input.GetAxis("Vertical") * 0.01f, 0); // 移動処理
    }

    // カメラ内に入った場合
    void OnBecameVisible()
    {
        Debug.Log("映った!");
    }

    // カメラ外に入った場合
    void OnBecameInvisible()
    {
        Debug.Log("映らなくなった!");
    }
}

11行目でOnBecameVisibleのメソッドを定義して、その中で「映った!」という文言を表示する処理を記述しています。

また、17行目でOnBecameInvisibleのメソッドを定義して、その中で「映らなくなった!」という文言を表示するようにしています。

これでゲームを実行してカメラ外からオブジェクトを動かしてみると、

カメラ内に行った時、またカメラ外に戻った時に、指定した処理が実行されているのが分かります。

画面内で移動し画面外で消去する処理

Unityで実際に、OnBecameVisibleとOnBecameInvisibleを使ったゲーム内の処理を作ってみます。

ここでは、画面をスクロールさせて、画面内にオブジェクトが映ったら移動するようにして、画面外に移動したら消去するという簡単な処理を作ってみます。

まずは、画面をスクロールさせたいので、カメラオブジェクトに対して、以下のスクリプトをアタッチしておきます。

using UnityEngine;

public class CameraController : MonoBehaviour
{
    void Update()
    {
        transform.Translate(0.01f, 0, 0);   // カメラを移動させる処理
    }
}

7行目でTranslateメソッドを使って、カメラの座標位置を変更して、右から左に画面が移動するように処理を記述しています。

次に、カメラ外にRendererコンポーネントがアタッチされているオブジェクトを配置しておきます。

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

using UnityEngine;

public class CircleController : MonoBehaviour
{
    int direction = 1;  // 方向を決める変数
    bool isMoving = false;  // 動いているかどうかを決める変数

    void Update()
    {
        Move(); // 移動処理

        // 移動方向を変更する処理
        if (transform.position.y > 4.3f)
        {
            direction = -1;
        }
        else if (transform.position.y < -4.3f)
        {
            direction = 1;
        }
    }

    void OnBecameVisible()
    {
        isMoving = true;    // 移動処理を開始する
    }

    void OnBecameInvisible()
    {
        Destroy(gameObject);    // オブジェクトを削除する
    }

    void Move()
    {
        if (isMoving)
        {
            transform.Translate(0, 0.01f * direction, 0);
        }
    }
}

23行目でカメラ内に映ったことを検知するOnBecameVisibleメソッドを定義しておき、その中でisMovingという変数をtrueに変更してあげることで、10行目で記述したMoveメソッドの処理が実行されるようになります。

そして、28行目でカメラ外に行ったことを検知するOnBecameInvisibleメソッドを定義しておき、その中でDestroyメソッドを使ってそのオブジェクトを消去する処理を行っています。

これでゲームを実行してみると、

カメラがスクロールしてオブジェクトが映ったタイミングで、上下に移動する処理が行われます。

そして、カメラ外まで移動したら、オブジェクトがシーン自体から削除されるようになっています。

この仕組みを使うことで、スクロールするゲームなどで、敵がカメラに映るまでは処理を行わず、映ったら敵が移動してきたり攻撃してくるという処理を作ることができます。

まとめ

このページでは、Unityでカメラに映ったタイミングで呼び出されるOnBecameVisibleメソッドについて、どんなメソッドなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

OnBecameVisibleとは、オブジェクトがカメラに映っていない状態から映る状態になったタイミングで呼び出されるメソッドになっています。

このOnBecameVisibleを使うことで、敵やオブジェクトがカメラ内に入ったら、様々な処理を行うという仕組みを作ることができます。

ただし、オブジェクトにはRendererコンポーネントが紐づいていないと、OnBecameVisibleで検知してもらえないので、注意しておきましょう。

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

コメント