PackedScene

继承: Resource < RefCounted < Object

对序列化场景的抽象。

描述

场景文件的简化接口。提供可以对场景资源本身进行的操作和检查。

可以用来将某个节点保存到文件中。保存时,会将该节点和它所拥有的所有节点一起保存(见 Node.owner 属性)。

注意:该节点不必自我拥有。

加载保存场景的示例:

GDScriptC#

  1. # 如果路径在编译期不可知,请使用 load() 而不是 preload()。
  2. var scene = preload("res://scene.tscn").instantiate()
  3. # 将该节点添加为脚本附加节点的子节点。
  4. add_child(scene)
  1. // C# 没有 preload,所以你使用的永远是 ResourceLoader.Load<PackedScene>()。
  2. var scene = ResourceLoader.Load<PackedScene>("res://scene.tscn").Instantiate();
  3. // 将该节点添加为脚本附加节点的子节点。
  4. AddChild(scene);

保存不同所有者的节点的示例:下面的粒子会创建 3 个对象:Node2Dnode)、RigidBody2Dbody)、CollisionObject2Dcollision))。node 的下一级是 body,再下一级是 collision。只有 bodynode 拥有,因此 pack 只会保存两个节点,不会保存 collision

GDScriptC#

  1. # 创建对象。
  2. var node = Node2D.new()
  3. var body = RigidBody2D.new()
  4. var collision = CollisionShape2D.new()
  5. # 创建对象架构。
  6. body.add_child(collision)
  7. node.add_child(body)
  8. # 修改 `body` 的拥有者,但不修改 `collision` 的拥有者。
  9. body.owner = node
  10. var scene = PackedScene.new()
  11. # 只会打包 `node` 和 `body`。
  12. var result = scene.pack(node)
  13. if result == OK:
  14. var error = ResourceSaver.save(scene, "res://path/name.tscn") # Or "user://..."
  15. if error != OK:
  16. push_error("将场景保存到磁盘时出错。")
  1. // 创建对象。
  2. var node = new Node2D();
  3. var body = new RigidBody2D();
  4. var collision = new CollisionShape2D();
  5. // 创建对象架构。
  6. body.AddChild(collision);
  7. node.AddChild(body);
  8. // 修改 `body` 的拥有者,但不修改 `collision` 的拥有者。
  9. body.Owner = node;
  10. var scene = new PackedScene();
  11. // 只会打包 `node` 和 `body`。
  12. Error result = scene.Pack(node);
  13. if (result == Error.Ok)
  14. {
  15. Error error = ResourceSaver.Save(scene, "res://path/name.tscn"); // Or "user://..."
  16. if (error != Error.Ok)
  17. {
  18. GD.PushError("将场景保存到磁盘时出错。");
  19. }
  20. }

教程

属性

Dictionary

_bundled

{ “conn_count”: 0, “conns”: PackedInt32Array(), “editable_instances”: [], “names”: PackedStringArray(), “node_count”: 0, “node_paths”: [], “nodes”: PackedInt32Array(), “variants”: [], “version”: 3 }

方法

bool

can_instantiate() const

SceneState

get_state() const

Node

instantiate(edit_state: GenEditState = 0) const

Error

pack(path: Node)


枚举

enum GenEditState: 🔗

GenEditState GEN_EDIT_STATE_DISABLED = 0

如果传递给 instantiate,则会阻止对场景状态的编辑。

GenEditState GEN_EDIT_STATE_INSTANCE = 1

如果传递给 instantiate,则会向本地场景提供本地场景资源。

注意:仅在编辑器构建中可用。

GenEditState GEN_EDIT_STATE_MAIN = 2

如果传递给 instantiate,则会向本地场景提供本地场景资源。只有主场景应该接收主编辑状态。

注意:仅在编辑器构建中可用。

GenEditState GEN_EDIT_STATE_MAIN_INHERITED = 3

GEN_EDIT_STATE_MAIN 类似,但适用于场景作为另一个场景的基类实例化的情况。

注意:仅在编辑器构建中可用。


属性说明

Dictionary _bundled = { "conn_count": 0, "conns": PackedInt32Array(), "editable_instances": [], "names": PackedStringArray(), "node_count": 0, "node_paths": [], "nodes": PackedInt32Array(), "variants": [], "version": 3 } 🔗

场景内容的字典表示。

可用的键包括资源的“names”和“variants”,节点的“node_count”、“nodes”、“node_paths”,覆盖节点的路径的“editable_instances”,信号连接的“conn_count”和“conns”,以及 PackedScene 格式样式的版本“version”。


方法说明

bool can_instantiate() const 🔗

如果场景文件有节点,返回 true


SceneState get_state() const 🔗

返回代表场景文件内容的 SceneState


Node instantiate(edit_state: GenEditState = 0) const 🔗

实例化该场景的节点架构。触发子场景的实例化。在根节点上触发 Node.NOTIFICATION_SCENE_INSTANTIATED 通知。


Error pack(path: Node) 🔗

path 节点及其所有子节点打包到该 PackedScene 中。所有现有数据都将被清除。请参阅 Node.owner