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, FoldableGroup, Font, GDExtension, GLTFAccessor, GLTFAnimation, GLTFBufferView, GLTFCamera, GLTFDocument, GLTFDocumentExtension, GLTFLight, GLTFMesh, GLTFNode, GLTFPhysicsBody, GLTFPhysicsShape, GLTFSkeleton, GLTFSkin, GLTFSpecGloss, GLTFState, GLTFTexture, GLTFTextureSampler, Gradient, Image, ImporterMesh, InputEvent, JointLimitation3D, 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 |
duplicate_deep(deep_subresources_mode: DeepDuplicateMode = 1) const |
|
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 的资源发出。
枚举
enum DeepDuplicateMode: 🔗
DeepDuplicateMode DEEP_DUPLICATE_NONE = 0
完全不复制子资源。即使在深层复制时也很有用,因为可以在复制所有数组和字典的同时,仍然指向原始资源。
DeepDuplicateMode DEEP_DUPLICATE_INTERNAL = 1
仅复制不具备路径的子资源以及使用场景本地化路径的子资源。
DeepDuplicateMode DEEP_DUPLICATE_ALL = 2
复制所有子资源,即便使用的是非本地路径。换句话说,即便是单独保存的大型资源也会复制。
属性说明
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 🔗
可以覆盖此方法,从而在对象的 set_path_cache() 被调用后执行额外的逻辑。
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(deep: bool = false) const 🔗
制作该资源的副本,返回资源中,export 的属性以及 @GlobalScope.PROPERTY_USAGE_STORAGE 的属性都会从原始资源中复制。
如果 deep 为 false,则会返回浅拷贝:嵌套的 Array、Dictionary、Resource 属性不会发生复制,与原资源共享。
如果 deep 为 true,则会返回深拷贝:嵌套的数组、字典和紧缩数组都会发生(递归)复制。内部的 Resource 只会在本地时进行复制,类似于对 duplicate_deep() 使用 DEEP_DUPLICATE_INTERNAL。
例外如下:
带有 @GlobalScope.PROPERTY_USAGE_ALWAYS_DUPLICATE 标志的子资源属性始终会被复制(是否递归取决于
deep)。带有 @GlobalScope.PROPERTY_USAGE_NEVER_DUPLICATE 标志的子资源属性始终不会被复制。
注意:对于自定义资源,如果定义 Object._init() 时使用了必填的参数,则此方法会失败。
注意:复制时如果将 deep 设置为 true,则在复制过程中发现的每个资源,包括调用该方法的资源,都只会发生一次复制,在副本中可以对其存在多次引用。例如你复制的资源 A 里正好对资源 B 存在两个引用,那么新的资源 A' 就会引用新的资源 B' 两次。
Resource duplicate_deep(deep_subresources_mode: DeepDuplicateMode = 1) const 🔗
Duplicates this resource, deeply, like duplicate() when passing true, with extra control over how subresources are handled.
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 🔗
根据场景唯一 ID 的内部缓存,返回位于 path 的场景中该资源的 ID。如果没有对应的条目则返回空字符串。适用于扩展 ResourceFormatLoader 和 ResourceFormatSaver 实现对版本控制系统友好的自定义资源格式时保持场景唯一 ID 一致。
注意:该方法仅在运行于编辑器上下文时实现。运行时返回空字符串。
Node get_local_scene() const 🔗
如果 resource_local_to_scene 为 true,并且该资源是从 PackedScene 实例中加载的,则返回使用该资源的场景的根 Node。否则返回 null。
返回该资源的 RID(或者空的 RID)。许多资源(如 Texture2D、Mesh 等)是存储在服务器(DisplayServer、RenderingServer 等)中的资源的高级抽象,所以这个函数将返回原始的 RID。
如果资源是作为其他资源文件中的一部分保存到磁盘上的,则返回 true。
void reset_state() 🔗
清空资源中未导出的属性。另见 _reset_state()。适合在通过扩展 ResourceFormatLoader 和 ResourceFormatSaver 实现自定义资源格式时使用。
void set_id_for_path(path: String, id: String) 🔗
场景唯一 ID 的内部缓存,针对位于 path 的场景将该资源的 ID 设置为 id。如果 id 为空,则会清空 path 对应的缓存条目。适用于扩展 ResourceFormatLoader 和 ResourceFormatSaver 实现对版本控制系统友好的自定义资源格式时保持场景唯一 ID 一致。
注意:该方法仅在运行于编辑器上下文时实现。
void set_path_cache(path: String) 🔗
将资源的路径设置为 path,不涉及资源缓存。适用于扩展 ResourceFormatLoader 和 ResourceFormatSaver 实现自定义资源格式时处理 CacheMode 的值。
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,可能会覆盖这个路径对应的已有缓存条目。后续尝试通过路径加载覆盖后的资源时,会返回这个资源。