在 Godot 中,可以导出类成员。这意味着它们的值与它们所附加的资源(例如场景)一起保存。它们也可用于在属性编辑器中进行编辑。导出是通过使用export关键字完成的:

extends Button

export var number = 5 # Value will be saved and visible in the property editor.

导出的变量必须初始化为常量表达式或具有export关键字参数形式的导出提示(请参阅下面的 示例部分)。

导出成员变量的基本好处之一是让它们在编辑器中可见和可编辑。通过这种方式,美术师和游戏设计师可以修改稍后影响程序运行方式的值。为此,提供了特殊的导出语法。

也可以使用其他语言(例如 C#)来导出属性。语法因语言而异。

# If the exported value assigns a constant or constant expression,
# the type will be inferred and used in the editor.

export var number = 5

# Export can take a basic data type as an argument, which will be
# used in the editor.

export(int) var number

# Export can also take a resource type to use as a hint.

export(Texture) var character_face
export(PackedScene) var scene_file
# There are many resource types that can be used this way, try e.g.
# the following to list them:
export(Resource) var resource

# Integers and strings hint enumerated values.

# Editor will enumerate as 0, 1 and 2.
export(int, "Warrior", "Magician", "Thief") var character_class
# Editor will enumerate with string names.
export(String, "Rebecca", "Mary", "Leah") var character_name

# Named enum values

# Editor will enumerate as THING_1, THING_2, ANOTHER_THING.
enum NamedEnum {THING_1, THING_2, ANOTHER_THING = -1}
export(NamedEnum) var x

# Strings as paths

# String is a path to a file.
export(String, FILE) var f
# String is a path to a directory.
export(String, DIR) var f
# String is a path to a file, custom filter provided as hint.
export(String, FILE, "*.txt") var f

# Using paths in the global filesystem is also possible,
# but only in scripts in "tool" mode.

# String is a path to a PNG file in the global filesystem.
export(String, FILE, GLOBAL, "*.png") var tool_image
# String is a path to a directory in the global filesystem.
export(String, DIR, GLOBAL) var tool_dir

# The MULTILINE setting tells the editor to show a large input
# field for editing over multiple lines.
export(String, MULTILINE) var text

# Limiting editor input ranges

# Allow integer values from 0 to 20.
export(int, 20) var i
# Allow integer values from -10 to 20.
export(int, -10, 20) var j
# Allow floats from -10 to 20 and snap the value to multiples of 0.2.
export(float, -10, 20, 0.2) var k
# Allow values 'y = exp(x)' where 'y' varies between 100 and 1000
# while snapping to steps of 20. The editor will present a
# slider for easily editing the value.
export(float, EXP, 100, 1000, 20) var l

# Floats with easing hint

# Display a visual representation of the 'ease()' function
# when editing.
export(float, EASE) var transition_speed

# Colors

# Color given as red-green-blue value (alpha will always be 1).
export(Color, RGB) var col
# Color given as red-green-blue-alpha value.
export(Color, RGBA) var col

# Nodes

# Another node in the scene can be exported as a NodePath.
export(NodePath) var node_path
# Do take note that the node itself isn't being exported -
# there is one more step to call the true node:
var node = get_node(node_path)

# Resources

export(Resource) var resource
# In the Inspector, you can then drag and drop a resource file
# from the FileSystem dock into the variable slot.

# Opening the inspector dropdown may result in an
# extremely long list of possible classes to create, however.
# Therefore, if you specify an extension of Resource such as:
export(AnimationNode) var resource
# The drop-down menu will be limited to AnimationNode and all
# its inherited classes.

必须注意的是,即使脚本没有在编辑器中运行,导出的属性仍然是可编辑的。这可以在“工具”模式下脚本结合使用。

导出位标志

用作位标志的整数可以在一个属性中存储多个truefalse(布尔值)值。通过使用导出提示,可以从编辑器中设置它们:int, FLAGS, ...

# Set any of the given flags from the editor.
export(int, FLAGS, "Fire", "Water", "Earth", "Wind") var spell_elements = 0

您必须为每个标志提供字符串描述。在此示例中,Fire 值为 1,Water值为 2,Earth值为 4,Wind 对应于值 8。通常,应相应地定义常量(例如 ,等等)。const ELEMENT_WIND = 8

还为项目设置中定义的物理层和渲染层提供了导出提示:

export(int, LAYERS_2D_PHYSICS) var layers_2d_physics
export(int, LAYERS_2D_RENDER) var layers_2d_render
export(int, LAYERS_3D_PHYSICS) var layers_3d_physics
export(int, LAYERS_3D_RENDER) var layers_3d_render

使用位标志需要对位运算有一定的了解。如果有疑问,请改用布尔变量。

导出数组

导出的数组可以有初始值设定项,但它们必须是常量表达式。

如果导出的数组指定了继承自 Resource 的类型,则可以通过一次从 FileSystem 停靠栏拖放多个文件在检查器中设置数组值。

# Default value must be a constant expression.

export var a = [1, 2, 3]

# Exported arrays can specify type (using the same hints as before).

export(Array, int) var ints = [1, 2, 3]
export(Array, int, "Red", "Green", "Blue") var enums = [2, 1, 0]
export(Array, Array, float) var two_dimensional = [[1.0, 2.0], [3.0, 4.0]]

# You can omit the default value, but then it would be null if not assigned.

export(Array) var b
export(Array, PackedScene) var scenes

# Arrays with specified types which inherit from resource can be set by
# drag-and-dropping multiple files from the FileSystem dock.

export(Array, Texture) var textures
export(Array, PackedScene) var scenes

# Typed arrays also work, only initialized empty:

export var vector3s = PoolVector3Array()
export var strings = PoolStringArray()

# Default value can include run-time values, but can't
# be exported.

var c = [a, 2, 3]

从工具脚本设置导出的变量

工具模式下从脚本更改导出变量的值 时,检查器中的值不会自动更新。要更新它,请 在设置导出变量的值后调用 property_list_changed_notify()

高级出口

并非每种类型的导出都可以在语言本身的级别上提供,以避免不必要的设计复杂性。下面描述了一些可以使用低级 API 实现的或多或少常见的导出功能。

在进一步阅读之前,您应该熟悉处理属性的方式以及如何使用_set()、 _get()_get_property_list()方法自定义它们 , 如从对象访问数据或逻辑中所述。

也可以看看

有关在 C++ 中使用上述方法的绑定属性,请参阅 使用 _set/_get/_get_property_list 绑定属性

警告

脚本必须在tool模式下运行,以便上述方法可以在编辑器中工作。

添加脚本类别

为了更好地在视觉上区分属性,可以在检查器中嵌入一个特殊的脚本类别作为分隔符。是内置类别的一个示例。Script Variables

func _get_property_list():
    var properties = []
    properties.append(
        {
            name = "Debug",
            type = TYPE_NIL,
            usage = PROPERTY_USAGE_CATEGORY | PROPERTY_USAGE_SCRIPT_VARIABLE
        }
    )
    return properties
  • name 是要添加到检查器的类别的名称;
  • PROPERTY_USAGE_CATEGORY表示该属性应被专门视为脚本类别,因此TYPE_NIL可以忽略该类型,因为它实际上不会用于脚本逻辑,但无论如何都必须对其进行定义。

分组属性

可以对具有相似名称的属性列表进行分组。

func _get_property_list():
    var properties = []
    properties.append({
            name = "Rotate",
            type = TYPE_NIL,
            hint_string = "rotate_",
            usage = PROPERTY_USAGE_GROUP | PROPERTY_USAGE_SCRIPT_VARIABLE
    })
    return properties
  • name 是将显示为可折叠属性列表的组的名称;
  • 在 group 属性之后添加的每个连续属性都将折叠和缩短,这由通过hint_string键定义的前缀确定。例如,在这种情况下rotate_speed将缩短为speed
  • PROPERTY_USAGE_GROUP表示该属性应被专门视为脚本组,因此TYPE_NIL可以忽略该类型,因为它实际上不会用于脚本逻辑,但无论如何都必须对其进行定义。