学习空间/引用与数据:为什么改一处会影响两处
强类型 GDScript / LESSON 11

引用与数据:为什么改一处会影响两处

理解共享容器、节点寿命与 Resource 定义。

基础约 5 分钟阅读,实作另计4 节现在学
CONCEPT MAP先看一眼知识之间的联系
先看一眼知识之间的联系01同一容器02共享引用03修改传播04按需复制
顺着图中的联系理解本课,再用下面的练习验证。图解是教学模型,不是引擎运行结果。

01复制名字不一定复制对象

两个变量可能指向同一个数组、字典或资源。给变量赋值不一定得到独立副本。如果背包预览和真实背包共用同一个 Array,预览里 append 可能真的改了背包。Vector2 等值类型的直觉不能照搬到所有对象。深复制也不是“所有嵌套对象都完美独立”的魔法,必须看具体类型与 API。

02亲自验证共享容器

reference_practice.gd gdscript
extends Node

func _ready() -> void:
    var original: Array[String] = ["practice_note"]
    var shared: Array[String] = original
    shared.append("practice_mark")
    print("共享后:", original.size()) # 2

    var separate: Array[String] = original.duplicate()
    separate.append("practice_extra")
    print("独立后:", original.size()) # 仍为 2

这里元素是字符串,所以这个浅层副本足以演示。换成数组嵌套、节点或资源时,要重新判断每层的共享关系。

03静态定义与运行状态

物品名称、描述和图标适合放在自定义 Resource;某次游戏是否取得该物品,应放在运行状态。Resource 本身不是数据库服务器,也不需要为这个小项目先建立商业后端。

practice_item_definition.gd gdscript
class_name PracticeItemDefinition
extends Resource

@export var id: StringName = &"practice_item"
@export var display_name: String = "练习物品"
@export_multiline var description: String = "仅用于技术教学"
@export var icon: Texture2D

04节点释放后,引用不能当作仍然可用

节点 queue_free() 后会被释放。保存过它的变量并不代表对象永远活着,异步回调或跨场景引用尤其要小心。需要使用可能失效的节点引用时,可用 is_instance_valid() 检查;更好的设计是让生命周期与职责保持简单,少把场景节点塞进长寿命全局对象。

  1. 运行数组实验,先写下两个长度预测。
  2. 给两个练习对象使用同一 Resource,观察修改资源属性的影响。
  3. 将“物品已获得”从共享定义中移出,写成单独运行变量。

动手后,再勾选

不是“我看懂了”,而是你在独立练习里做出并检查过。

CHECK YOUR UNDERSTANDING

换一个情景,你会怎么判断?

两个变量引用同一个 Array 时,通过其中一个 append 会怎样?

用自己的话,留一条笔记

可以写“我之前以为……,现在发现……”,或者记录还没解决的问题。

仅保存在此浏览器0 / 20000

回到资料核对

本课是解释与练习,不替代对应版本的官方手册。网页实验不运行 Godot;未标明实机验证的代码,仍需在独立工程中检查。

把这课收进你的理解里。

标记已读不会自动勾选实作,也不代表游戏功能已经完成。

输入一个你想弄明白的问题。

按 Esc 关闭 · 标题、关键词和正文一起搜索