VisibleOnScreenEnabler2D
2026/4/14大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — VisibleOnScreenEnabler2D
VisibleOnScreenEnabler2D
节点继承关系
继承自 Node
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Name | 节点名称 |
| 属性 | ProcessMode | 处理模式(始终 / 暂停时 / 仅编辑器) |
| 属性 | ProcessPriority | 处理优先级,数字越小越先执行 |
| 信号 | ready | 节点进入场景树并准备就绪 |
| 信号 | tree_entered | 节点进入场景树 |
| 信号 | tree_exited | 节点完全离开场景树 |
| 方法 | GetNode<T>() | 按路径获取子节点 |
| 方法 | AddChild() | 添加子节点 |
| 方法 | RemoveChild() | 移除子节点 |
| 方法 | QueueFree() | 帧结束后释放节点 |
| 方法 | GetParent() | 获取父节点 |
定义
VisibleOnScreenEnabler2D 是 VisibleOnScreenNotifier2D 的"自动版"。Notifier 只是告诉你"在不在屏幕上",需要你自己写代码处理。而 Enabler 会自动帮你开关目标节点的各种行为——离开屏幕就自动暂停,进入屏幕就自动恢复。
简单说:VisibleOnScreenNotifier2D 的升级版,自动帮你开关节点,不用写代码。
使用频率:★★ 偶尔使用
节点用途
- 自动性能优化:屏幕外的敌人自动停止物理和动画
- 自动动画控制:屏幕外的角色自动暂停动画
- 自动处理控制:屏幕外的物体自动停止 _Process
使用场景
| 场景 | 说明 |
|---|---|
| 横版游戏 | 屏幕外的敌人自动停止移动和动画 |
| 性能优化 | 不用手写代码,直接挂上这个节点就行 |
| 批量优化 | 给所有敌人场景加上这个节点,自动优化性能 |
常用节点搭配
| 搭配节点 | 搭配方式 |
|---|---|
| 任意 Node2D | 通过 NodePath 属性指向要控制的目标节点 |
生效必备素材/资源
需要设置 enable_node_path 属性指向要控制的目标节点。
节点属性与信号
属性
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
| enable_node_path | NodePath | NodePath("..") | VisibleOnScreenEnabler2D | 要控制的目标节点路径,默认是父节点 |
| physics_process | bool | true | VisibleOnScreenEnabler2D | 是否自动控制物理处理(_PhysicsProcess) |
| process | bool | true | VisibleOnScreenEnabler2D | 是否自动控制帧处理(_Process) |
| input | bool | false | VisibleOnScreenEnabler2D | 是否自动控制输入处理 |
信号
与 VisibleOnScreenNotifier2D 相同。
| 信号 | 参数 | 说明 |
|---|---|---|
| screen_entered | 无 | 节点进入屏幕时触发 |
| screen_exited | 无 | 节点离开屏幕时触发 |
常用方法
| 方法 | 返回值 | 说明 |
|---|---|---|
| IsOnScreen() | bool | 当前是否在屏幕上可见 |
代码示例
C
// C# - 使用 VisibleOnScreenEnabler2D 自动优化敌人性能
// 无需额外代码!只需要在场景树中这样组织:
// Enemy (CharacterBody2D)
// └── VisibleOnScreenEnabler2D
// enable_node_path = ".." (指向父节点 Enemy)
// physics_process = true
// process = true
//
// 当敌人离开屏幕时,会自动停止 _Process 和 _PhysicsProcess
// 当敌人进入屏幕时,会自动恢复
// 如果需要代码访问:
using Godot;
public partial class Enemy : CharacterBody2D
{
private VisibleOnScreenEnabler2D _enabler;
public override void _Ready()
{
_enabler = GetNode<VisibleOnScreenEnabler2D>("VisibleOnScreenEnabler2D");
GD.Print($"敌人是否在屏幕上: {_enabler.IsOnScreen()}");
}
}GDScript
# GDScript - 使用 VisibleOnScreenEnabler2D 自动优化敌人性能
# 无需额外代码!只需要在场景树中这样组织:
# Enemy (CharacterBody2D)
# └── VisibleOnScreenEnabler2D
# enable_node_path = ".." (指向父节点 Enemy)
# physics_process = true
# process = true
extends CharacterBody2D
@onready var enabler: VisibleOnScreenEnabler2D = $VisibleOnScreenEnabler2D
func _ready():
print("敌人是否在屏幕上: %s" % enabler.is_on_screen())