
カメラの画面外では、敵キャラクターを動かしたくない。
どうすれば良いの?

そんなお悩みにお答えします!
Unityでゲームを制作していると、「敵キャラクターがカメラに映ったときだけ動くようにしたい」と思うことがあります。
例えば、横スクロールアクションゲームで、画面外にいる敵キャラクターは停止させておき、プレイヤーが進んで敵が画面に映ったタイミングで動き始めるようにする場合です。
Unityの標準イベント関数である OnBecameVisible() を使うと便利です。
今回は、オブジェクトがカメラの範囲内に入ったときだけ動かす方法を解説します。
環境
Unity バージョン:6000.2.11f1
Windows11
オブジェクトがカメラに映ったときだけ動かす内容
今回の例では、敵キャラクターがカメラに映ったタイミングで左方向に移動を開始するようにします。
- 敵キャラクターをカメラの外側に配置する
- ゲームを開始しても、敵キャラクターは動かない
- プレイヤーが進み、敵キャラクターがカメラに映る
- 敵キャラクターが左方向に移動を開始する
- その後、画面外に出ても移動を続ける
一度移動を開始したら、その後はカメラの外に出ても移動を続ける仕組みにします。
オブジェクトがカメラに映ったときだけ動かすスクリプト
それでは、敵キャラクターがカメラに映ったときに移動を開始するスクリプトを作成します。
以下のコードのとおりです。
using UnityEngine;
public class EnemyManager : MonoBehaviour
{
// 移動するかどうかを管理する変数
private bool isMove = false;
// 移動速度
public float speed = 3.0f;
void Update()
{
// 移動フラグがONの場合
if (isMove)
{
// 左方向に移動する
transform.Translate(
Vector3.left * speed * Time.deltaTime
);
}
}
// カメラの範囲内に入ったときに呼び出される
void OnBecameVisible()
{
// 移動を開始する
isMove = true;
}
}
コードの内容を順番に解説します。
private bool isMove = false;
isMoveは、敵キャラクターが移動するかどうかを管理する変数です。
bool型は、true(有効)またはfalse(無効)の2つの状態を管理できます。
今回は、最初の状態をfalseにしています。
ゲーム開始直後は敵キャラクターが移動しない状態です。
public float speed = 3.0f;
敵キャラクターの移動速度を設定する変数です。
publicにしているので、UnityエディターのInspectorから数値を変更できます。
ゲームを再生しながら調整してみましょう。
void Update()
{
if (isMove)
{
transform.Translate(
Vector3.left * speed * Time.deltaTime
);
}
}
Update()は、ゲームの実行中に毎フレーム呼び出される関数です。
その中でif (isMove)を使い、移動フラグがtrueの場合だけ移動処理を実行しています。
OnBecameVisible()は、オブジェクトがカメラに映るようになったときにUnityから呼び出されるイベント関数です。
void OnBecameVisible()
{
isMove = true;
}
この関数の中で、
isMove = true;
とすることで、移動フラグをONにしています。
その結果、次回以降のUpdate()で移動処理が実行されるようになります。
カメラに映ったタイミングで移動を開始できます。
OnBecameVisible()を使うときの注意点
OnBecameVisible()の注意点は以下のとおりです。
Sceneビューにも反応する場合がある
OnBecameVisible()は、Gameビューのカメラだけでなく、Sceneビューのカメラに映った場合にも呼び出されることがあります。
そのため、ゲームを再生しているときにSceneビューで敵キャラクターが見えていると、Gameビューに映っていなくても移動を開始する場合があります。
動作確認をするときは、この点に注意しましょう。
Sprite Rendererが必要
今回の方法は、2DゲームでSprite Rendererを使用していることが前提です。
3Dゲームの場合は、Mesh Rendererが付いているオブジェクトで使用できます。
また、Rendererが無効になっていたり、オブジェクトが非表示になっていたりすると、期待どおりに動作しない場合があります。
画面外に出ても移動は停止しない
今回のスクリプトでは、一度カメラに映ると移動フラグがtrueになります。
そのため、画面外に出ても移動を続けます。
もし、カメラの範囲内にいる間だけ動かしたい場合は、OnBecameInvisible()を組み合わせる方法もあります。
void OnBecameVisible()
{
isMove = true;
}
void OnBecameInvisible()
{
isMove = false;
}
これで、カメラに映ると移動を開始し、カメラから見えなくなると移動を停止する仕組みになります。
ただし、こちらもSceneビューのカメラなどの影響を受ける点には注意しましょう。
【Unity】オブジェクトがカメラに映ったときだけ動かす方法 まとめ

今回は、UnityのOnBecameVisible()を使って、オブジェクトがカメラに映ったときだけ動かす方法を解説しました。
OnBecameVisible()は、オブジェクトがカメラに映ったときに呼び出される- 2DゲームではSprite Rendererが必要
- Sceneビューのカメラにも反応することがあるので注意
敵キャラクターが大量に登場するゲームでは、オブジェクトの動きを制御する方法のひとつとしてとても便利です。
本記事が、皆さんの参考になれば幸いです。
