Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Resource
继承: RefCounted < Object
派生: Animation, AnimationLibrary, AnimationNode, AnimationNodeStateMachinePlayback, AnimationNodeStateMachineTransition, AudioBusLayout, AudioEffect, AudioStream, BitMap, BoneMap, ButtonGroup, CameraAttributes, ColorPalette, Compositor, CompositorEffect, CryptoKey, Curve, Curve2D, Curve3D, EditorNode3DGizmoPlugin, EditorSettings, Environment, Font, GDExtension, GLTFAccessor, GLTFAnimation, GLTFBufferView, GLTFCamera, GLTFDocument, GLTFDocumentExtension, GLTFLight, GLTFMesh, GLTFNode, GLTFPhysicsBody, GLTFPhysicsShape, GLTFSkeleton, GLTFSkin, GLTFSpecGloss, GLTFState, GLTFTexture, GLTFTextureSampler, Gradient, Image, ImporterMesh, InputEvent, JSON, LabelSettings, LightmapGIData, Material, Mesh, MeshLibrary, MissingResource, MultiMesh, NavigationMesh, NavigationMeshSourceGeometryData2D, NavigationMeshSourceGeometryData3D, NavigationPolygon, Noise, Occluder3D, OccluderPolygon2D, OggPacketSequence, OpenXRAction, OpenXRActionMap, OpenXRActionSet, OpenXRBindingModifier, OpenXRHapticBase, OpenXRInteractionProfile, OpenXRIPBinding, PackedDataContainer, PackedScene, PhysicsMaterial, PolygonPathFinder, RDShaderFile, RDShaderSPIRV, RichTextEffect, SceneReplicationConfig, Script, Shader, ShaderInclude, Shape2D, Shape3D, Shortcut, SkeletonModification2D, SkeletonModificationStack2D, SkeletonProfile, Skin, Sky, SpriteFrames, StyleBox, SyntaxHighlighter, Texture, Theme, TileMapPattern, TileSet, TileSetSource, Translation, VideoStream, VideoStreamPlayback, VisualShaderNode, VoxelGIData, World2D, World3D, X509Certificate
可序列化对象的基类。
描述
资源是所有 Godot 特定资源类型的基类,主要作为数据容器。因为资源继承自 RefCounted,所以进行了引用计数,不再使用时会被释放。资源也可以嵌套到其他资源里、保存到磁盘上。PackedScene 也是一种资源,它是 Godot 项目中最常用的 Object 之一,独特的能力是可以将若干 Node 保存起来、随意进行实例化。
在 GDScript 中,可以根据 resource_path 从磁盘上加载资源,使用 @GDScript.load() 或 @GDScript.preload() 即可。
引擎会维护所有已加载资源的全局缓存,可以根据路径引用资源(见 ResourceLoader.has_cached())。资源会在首次加载时缓存,所有引用释放后就会从缓存中移除。如果缓存中存在某个资源,那么后续使用其路径进行加载的时候返回的就是缓存中的引用。
注意:在 C# 中,资源不再被使用后并不会立即被释放。相反,垃圾回收将定期运行,并释放不再使用的资源。这意味着未使用的资源在被删除之前会在内存中保留一段时间。
教程
属性
|
||
|
||
|
||
方法
_get_rid() virtual const |
|
void |
_reset_state() virtual |
void |
_set_path_cache(path: String) virtual const |
void |
_setup_local_to_scene() virtual |
void |
|
generate_scene_unique_id() static |
|
get_id_for_path(path: String) const |
|
get_local_scene() const |
|
get_rid() const |
|
is_built_in() const |
|
void |
|
void |
set_id_for_path(path: String, id: String) |
void |
set_path_cache(path: String) |
void |
|
void |
take_over_path(path: String) |
信号
changed() 🔗
当资源发生更改时发出信号,通常是当其属性之一被修改时。另见 emit_changed() 。
注意:自定义资源的属性不会自动发出此信号。如有必要,需要创建一个 setter 来触发。
setup_local_to_scene_requested() 🔗
已弃用: This signal is only emitted when the resource is created. Override _setup_local_to_scene() instead.
由新复制的 resource_local_to_scene 为 true
的资源发出。
属性说明
bool resource_local_to_scene = false
🔗
如果为 true
,那么在本地场景的各个实例中,该资源都会被唯一化。在运行时,在某个场景中对该资源的修改不会影响其他实例(见 PackedScene.instantiate())。
注意:运行时,在已创建副本的资源上修改该属性不会有效果。
这个资源的可选名称。定义后会在“检查器”面板中显示这个值来代表该资源。对于内置脚本,该名称会在脚本编辑器中作为选项卡名称的一部分显示。
注意:某些资源格式不支持资源名称。仍然可以在编辑器中或通过代码设置名称,但重新加载资源时该名称将会丢失。例如,只有内置的脚本可以有资源名称,而存储在单独文件中的脚本则不能。
该资源的唯一路径。如果已被保存到磁盘,该值将是其文件路径。如果该资源仅包含在某一个场景中,该值将是 PackedScene 的文件路径后加上一个唯一标识符。
注意:如果之前已经加载了具有相同路径的资源,手动设置该属性可能会失败。如果有必要,请使用 take_over_path()。
String resource_scene_unique_id 🔗
相对于该资源场景的唯一标识,若留空,则当该资源保存在 PackedScene 中时,会自动生成 ID;若资源不在场景中,则该属性默认为空。
注意:保存 PackedScene 时,若同一场景中的多个资源使用相同 ID,则只有场景层级中最早的资源保留原 ID,其他资源从 generate_scene_unique_id() 中分配新 ID。
注意:设置该属性不会发出 changed 信号。
警告:设置时,ID 只能由字母、数字和下划线组成,否则会失败,且默认为一个随机生成的 ID。
方法说明
RID _get_rid() virtual const 🔗
可以覆盖此方法,从而在调用 get_rid() 时返回自定义 RID。
void _reset_state() virtual 🔗
对于使用可变数量属性的资源,无论是通过 Object._validate_property() 还是 Object._get_property_list() 使用,都应实现该方法正确清除资源的状态。
void _set_path_cache(path: String) virtual const 🔗
将资源的路径设为 path
,不涉及资源缓存。
void _setup_local_to_scene() virtual 🔗
如果原始资源的 resource_local_to_scene 被设置为 true
,则覆盖该方法可以自定义从 PackedScene.instantiate() 创建的新复制的资源。
示例:为实例化场景中的每个本地资源设置随机 damage
值:
extends Resource
var damage = 0
func _setup_local_to_scene():
damage = randi_range(10, 40)
Resource duplicate(subresources: bool = false) const 🔗
制作该资源的副本,返回资源中,export
的属性以及 @GlobalScope.PROPERTY_USAGE_STORAGE 的属性都会从原始资源中复制。
如果 subresources
为 false
,则返回的是浅拷贝;子资源中的嵌套资源不会被复制,并与原始资源共享(有一个例外;见下文)。如果 subresources
为 true
,则返回的是深拷贝;嵌套子资源将被复制,并且不会共享(有两个例外;见下文)。
subresources
通常被遵守,但有以下例外:
带有 @GlobalScope.PROPERTY_USAGE_ALWAYS_DUPLICATE 标志的子资源属性始终会被复制。
带有 @GlobalScope.PROPERTY_USAGE_NEVER_DUPLICATE 标志的子资源属性始终不会被复制。
Array 和 Dictionary 属性内的子资源始终不会被复制。
注意:对于自定义资源,如果定义 Object._init() 时使用了必填的参数,则此方法会失败。
void emit_changed() 🔗
发出 changed 更改信号。某些内置资源会自动调用此方法。
注意:对于自定义资源,推荐在发生任何有意义的变化时都调用此方法,例如修改属性时。这样能够保证依赖于此资源的自定义 Object 能够正确更新其属性。
var damage:
set(new_value):
if damage != new_value:
damage = new_value
emit_changed()
String generate_scene_unique_id() static 🔗
根据当前日期、时间和随机值,为要包含在 PackedScene 中的资源生成唯一标识符。返回的字符串仅由字母(a
到 y
)和数字(0
到 8
)组成。另见 resource_scene_unique_id。
String get_id_for_path(path: String) const 🔗
返回资源缓存中路径 path
对应资源的唯一标识符。如果资源尚未加载和缓存,则会返回空字符串。
注意:该方法仅在编辑器环境运行时实现。运行时会返回空字符串。
Node get_local_scene() const 🔗
如果 resource_local_to_scene 为 true
,并且该资源是从 PackedScene 实例中加载的,则返回使用该资源的场景的根 Node。否则返回 null
。
返回该资源的 RID(或者空的 RID)。许多资源(如 Texture2D、Mesh 等)是存储在服务器(DisplayServer、RenderingServer 等)中的资源的高级抽象,所以这个函数将返回原始的 RID。
如果资源为(引擎的)内置资源则返回 true
,为用户定义资源则返回 false
。
void reset_state() 🔗
如果资源通过 Object._validate_property() 或 Object._get_property_list() 实现了可变数量的属性,请覆盖 _reset_state() 从而正确清空资源的状态。
void set_id_for_path(path: String, id: String) 🔗
在资源缓存中将位于 path
的资源的唯一标识符设置为 id
。如果唯一标识符为空且存在使用 path
的缓存条目,则会移除该缓存条目。
注意:该方法仅在编辑器上下文中实现。
void set_path_cache(path: String) 🔗
将资源的路径设为 path
,不涉及资源缓存。
void setup_local_to_scene() 🔗
已弃用: This method should only be called internally.
调用 _setup_local_to_scene()。如果 resource_local_to_scene 为 true
,则场景实例中新复制的资源会自动从 PackedScene.instantiate() 中调用该方法。
void take_over_path(path: String) 🔗
将 resource_path 设置为 path
,可能会覆盖这个路径对应的已有缓存条目。后续尝试通过路径加载覆盖后的资源时,会返回这个资源。