敵の正面に立てば見つかるが、背後からそっと近づけば気づかれない——ステルスゲームの緊張感は、この 「敵の視界」 の再現から生まれます。単純な距離判定だけだと、敵の真後ろにいても検知されてしまい、そもそもステルスが成立しません。
リアルな視界には「敵からの距離」「敵の視線方向との角度」「間 に壁があるか」の3つが必要です。この記事では、Area3D(範囲)+ ドット積(角度)+ RayCast3D(遮蔽) の3段階で、前方だけを見るFOV(Field of View:視野)システムを組み立てます。
この記事でわかること
- 視界判定の 3段階構造(範囲 → 角度 → 遮蔽)
- ドット積 で視野角を判定する仕組み
- 基本の FOV検知 の実装(正面/背後/壁裏を見分ける)
- 複数レイキャスト で「頭だけ見えている」も検知
- 警戒レベル の段階管理(気づく→疑う→発見)
視界判定の3段階構造
「正面にいるけど壁越しだから見えない」「すぐ近くだけど背後だから気づかない」——こうした状況を正しく捌くために、視界判定は 3段階で、軽い順に 絞り込みます。

| 段階 | 手法 | 目的 |
|---|---|---|
| 1. 範囲 | Area3D(球状の検知範囲) | 近くにいるか |
| 2. 角度 | ドット積(dot) | 前方(視野角内)にいるか |
| 3. 遮蔽 | RayCast3D | 壁などに遮られていないか |
軽い順に並べる理由 は、コストの高い RayCast3D の回数を減らすためです。100体のNPCがいても、Area3D 内が3体なら、レイキャストは3回で済みます。まず安いチェックで大半をふるい落とすのが定石です。
ドット積で視野角を判定する
「前方だけを見る」を作る鍵が ドット積 です。これは 2つの方向がどれだけ同 じ向きか を1つの数値で表す計算で、forward.dot(direction) のように書きます。

- 1.0 :完全に同じ向き(正面・0度)
- 0.5 :60度ずれている
- 0.0 :直角(真横・90度)
- -1.0 :正反対(真後ろ・180度)
視野角120度の敵なら、半角は60度。cos(60°) = 0.5 なので、 ドット積が0.5以上なら視野内、0.5未満なら視野外 と判定できます。角度そのものを計算するより、cos としきい値を1回比べるだけなので高速です。
基本のFOV検知を実装する
3段階を1つのスクリプトにまとめます。敵の子に検知用のノード(FOVDetector)を置き、Area3D と RayCast3D を持たせます。
