@export
2026/4/14大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — @export
@export
定义
@export 是 GDScript 中的一个注解(annotation),用来把脚本中的变量"暴露"给 Godot 编辑器的检查器面板(Inspector)。简单说,就是让变量可以在编辑器右侧的属性面板里直接编辑,而不需要修改代码。
想象你在设计一款游戏角色,角色的移动速度、跳跃高度、生命值这些参数经常需要调整。如果每次都去改代码再运行,那效率太低了。@export 就像是给变量开了一扇"窗户"——你在编辑器里点点拖拖就能修改这些值,而且每个场景中的实例可以有不同的值。
在 C# 中,对应的写法是 [Export] 特性(attribute)。
语法
C#
// 基本用法:导出变量到检查器
[Export] public float ExMoveSpeed = 200f;
// 自动属性也可以导出
[Export] public int ExMaxHealth { get; set; } = 100;GDScript
# 基本用法:导出变量到检查器
@export var move_speed: float = 200.0
# 也可以不指定类型(类型由默认值推断)
@export var max_health = 100参数说明
@export 本身不需要参数——它直接写在变量声明前面就行。Godot 会根据变量的类型自动在检查器中生成合适的编辑控件:
| 变量类型 | 检查器控件 | 说明 |
|---|---|---|
int / float | 数字输入框 | 可以直接输入数字 |
bool | 复选框 | 勾选 / 取消勾选 |
String | 文本输入框 | 单行文本编辑 |
Vector2 / Vector3 | 坐标输入框 | 分 X、Y、Z 三个字段 |
Color | 颜色选择器 | 弹出取色器 |
Resource | 资源选择器 | 拖拽或浏览资源文件 |
NodePath | 节点路径选择器 | 从场景树中选择节点 |
返回值
@export 是一个注解,没有返回值。它的作用是在变量声明阶段改变变量的元信息,让 Godot 编辑器知道这个变量需要出现在检查器面板中。
代码示例
C#
using Godot;
public partial class Player : CharacterBody3D
{
// ===== 基础用法:导出各种类型的变量 =====
[Export] public float ExMoveSpeed = 200f;
[Export] public int ExMaxHealth = 100;
[Export] public bool ExCanDoubleJump = true;
[Export] public string ExPlayerName = "勇者";
public override void _Ready()
{
GD.Print($"玩家 {ExPlayerName} 已就绪,移动速度: {ExMoveSpeed},最大生命: {ExMaxHealth}");
}
// 运行结果: 玩家 勇者 已就绪,移动速度: 200,最大生命: 100
// ===== 实际场景:导出资源引用 =====
// 可以在编辑器中直接拖入音效文件
[Export] public AudioStream ExJumpSound;
[Export] public AudioStream ExHurtSound;
[Export] public PackedScene ExBulletScene;
private AudioStreamPlayer _audioPlayer;
public override void _Ready()
{
_audioPlayer = new AudioStreamPlayer();
AddChild(_audioPlayer);
}
public void PlayJumpSound()
{
if (ExJumpSound != null)
{
_audioPlayer.Stream = ExJumpSound;
_audioPlayer.Play();
GD.Print("播放跳跃音效");
}
}
// 运行结果: 播放跳跃音效
// ===== 进阶用法:导出数组并在编辑器中配置列表 =====
[Export] public Godot.Collections.Array<string> ExInventoryItems = new();
[Export] public Godot.Collections.Array<Texture2D> ExItemIcons = new();
public void PrintInventory()
{
GD.Print($"背包物品数量: {ExInventoryItems.Count}");
for (int i = 0; i < ExInventoryItems.Count; i++)
{
GD.Print($" 物品 {i}: {ExInventoryItems[i]}");
}
}
// 运行结果:
// 背包物品数量: 3
// 物品 0: 木剑
// 物品 1: 红色药水
// 物品 2: 铁盾
}GDScript
extends CharacterBody3D
# ===== 基础用法:导出各种类型的变量 =====
@export var ex_move_speed: float = 200.0
@export var ex_max_health: int = 100
@export var ex_can_double_jump: bool = true
@export var ex_player_name: String = "勇者"
func _ready():
print("玩家 %s 已就绪,移动速度: %s,最大生命: %d" % [ex_player_name, ex_move_speed, ex_max_health])
# 运行结果: 玩家 勇者 已就绪,移动速度: 200.0,最大生命: 100
# ===== 实际场景:导出资源引用 =====
# 可以在编辑器中直接拖入音效文件
@export var ex_jump_sound: AudioStream
@export var ex_hurt_sound: AudioStream
@export var ex_bullet_scene: PackedScene
@onready var _audio_player: AudioStreamPlayer = $AudioStreamPlayer
func play_jump_sound():
if ex_jump_sound:
_audio_player.stream = ex_jump_sound
_audio_player.play()
print("播放跳跃音效")
# 运行结果: 播放跳跃音效
# ===== 进阶用法:导出数组并在编辑器中配置列表 =====
@export var ex_inventory_items: Array[String] = []
@export var ex_item_icons: Array[Texture2D] = []
func print_inventory():
print("背包物品数量: %d" % ex_inventory_items.size())
for i in range(ex_inventory_items.size()):
print(" 物品 %d: %s" % [i, ex_inventory_items[i]])
# 运行结果:
# 背包物品数量: 3
# 物品 0: 木剑
# 物品 1: 红色药水
# 物品 2: 铁盾注意事项
@export只能用在成员变量上,不能用于局部变量(函数里面定义的变量)。- 导出的变量值是按实例保存的——也就是说,同一个脚本挂在两个不同的节点上,可以各自设置不同的值。
- 类型推断:GDScript 中如果
@export的变量有默认值,Godot 会根据默认值自动推断类型。但为了代码清晰,建议显式标注类型。 - C# 中的
[Export]只能用于public字段或属性,private字段无法导出。 - 导出变量的值在场景文件(.tscn)中保存。如果你修改了代码中的默认值,已经放置在场景中的实例不会自动更新,需要手动重置。
@export是最基础的导出注解,Godot 还提供了@export_range、@export_enum、@export_file等一系列带有特殊编辑器控件的导出注解,详见对应章节。
