VisibleOnScreenNotifier2D
2026/4/14大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — VisibleOnScreenNotifier2D
VisibleOnScreenNotifier2D
节点继承关系
继承自 Node
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Name | 节点名称 |
| 属性 | ProcessMode | 处理模式(始终 / 暂停时 / 仅编辑器) |
| 属性 | ProcessPriority | 处理优先级,数字越小越先执行 |
| 信号 | ready | 节点进入场景树并准备就绪 |
| 信号 | tree_entered | 节点进入场景树 |
| 信号 | tree_exited | 节点完全离开场景树 |
| 方法 | GetNode<T>() | 按路径获取子节点 |
| 方法 | AddChild() | 添加子节点 |
| 方法 | RemoveChild() | 移除子节点 |
| 方法 | QueueFree() | 帧结束后释放节点 |
| 方法 | GetParent() | 获取父节点 |
定义
这个节点会时刻检测自己"是否在玩家屏幕的画面范围内"。当它进入画面时会发一个信号,离开画面时也会发一个信号。
打个比方:想象你站在窗边往外看,当一个人走进你的视野时你说"他出现了!",当他走出你的视野时你说"他消失了!"。这个节点就是那个"窗边的观察者"。
简单说:它告诉你某个东西现在是否在玩家屏幕上能看到。
使用频率:★★ 偶尔使用
节点用途
- 性能优化:屏幕外的敌人停止AI计算,省性能
- 生成/回收:敌人走进屏幕时才生成,走出屏幕时回收
- 音效控制:只有屏幕上能看到时才播放声音
- 事件触发:角色走到某个位置进入视野时触发剧情
使用场景
| 场景 | 说明 |
|---|---|
| 开放世界 | 远处的敌人不在屏幕上时停止AI计算 |
| 横版游戏 | 敌人进入屏幕时才开始行动 |
| 性能优化 | 屏幕外的大型特效关闭 |
常用节点搭配
| 搭配节点 | 搭配方式 |
|---|---|
| Area2D / CharacterBody2D | 作为子节点检测父节点是否在屏幕上 |
生效必备素材/资源
VisibleOnScreenNotifier2D 不需要外部资源。
节点属性与信号
属性
VisibleOnScreenNotifier2D 没有自己的特有属性。
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
| rect | Rect2 | — | VisibleOnScreenNotifier2D | 检测区域的矩形范围 |
信号
| 信号 | 参数 | 说明 |
|---|---|---|
| screen_entered | 无 | 节点进入屏幕可见区域时触发 |
| screen_exited | 无 | 节点离开屏幕可见区域时触发 |
常用方法
| 方法 | 返回值 | 说明 |
|---|---|---|
| IsOnScreen() | bool | 当前是否在屏幕上可见 |
代码示例
C
// C# - 屏幕外的敌人停止AI计算
using Godot;
public partial class Enemy : CharacterBody2D
{
private VisibleOnScreenNotifier2D _notifier;
public override void _Ready()
{
_notifier = GetNode<VisibleOnScreenNotifier2D>("VisibleOnScreenNotifier2D");
_notifier.ScreenEntered += OnEnterScreen;
_notifier.ScreenExited += OnExitScreen;
// 初始状态:如果不在屏幕上就暂停
SetPhysicsProcess(_notifier.IsOnScreen());
}
private void OnEnterScreen()
{
SetPhysicsProcess(true); // 进入屏幕,开启物理计算
GD.Print("敌人进入视野,开始AI计算");
}
private void OnExitScreen()
{
SetPhysicsProcess(false); // 离开屏幕,关闭物理计算
GD.Print("敌人离开视野,停止AI计算");
}
}GDScript
# GDScript - 屏幕外的敌人停止AI计算
extends CharacterBody2D
@onready var notifier: VisibleOnScreenNotifier2D = $VisibleOnScreenNotifier2D
func _ready():
notifier.screen_entered.connect(_on_enter_screen)
notifier.screen_exited.connect(_on_exit_screen)
# 初始状态:如果不在屏幕上就暂停
set_physics_process(notifier.is_on_screen())
func _on_enter_screen():
set_physics_process(true) # 进入屏幕,开启物理计算
print("敌人进入视野,开始AI计算")
func _on_exit_screen():
set_physics_process(false) # 离开屏幕,关闭物理计算
print("敌人离开视野,停止AI计算")