HOME / 第 2 部分 · 核心概念与 GDScript 语法 / 第 8 课
MODULE 2 · 核心概念与 GDScript 语法

第 8 课 · 场景树与实例化(实例化)

⏱ 预计时长 20 分钟📊 难度 入门📚 模块 第 2 部分 · 核心概念与 GDScript 语法

🎯 本课学习目标

本课讲透「实例化」——把一个场景像印章一样盖到另一个场景里。这是 Godot 复用的核心机制。

📖 详细教学步骤

什么是实例?概念

实例(Instance) = 一个场景被「放入」另一个场景后的副本。

  • enemy.tscn 拖进 main.tscn 两次,就有了两个敌人实例
  • 每个实例都是独立的:移动其中一个,不影响另一个
  • 对原场景(enemy.tscn)的修改,会同步到所有实例(因为大家共用同一份「图纸」)

💡 就像用同一张蛋糕模具做出很多蛋糕:模具是原场景,每个蛋糕是实例。

操作:把场景拖进另一个场景实操

  1. 打开目标场景(如 main.tscn)
  2. 在资源面板找到要实例化的场景(如 enemy.tscn)
  3. 按住鼠标左键,把它拖到场景面板或主视图里
  4. 松开鼠标,enemy 实例就出现了,可在主视图调整位置

实例的本地修改概念

  • 在实例上改属性(如把某个敌人实例的位置改到 (500,200)),只影响这个实例
  • 实例旁边会显示一个「链环」图标,表示它是外部场景的实例
  • 在场景面板右键实例,选 使本地化(Editable Children) 才能编辑它的子节点——默认子节点是锁定的

用代码实例化场景(预览第 63 课)进阶

运行中动态生成敌人也常做,先混个脸熟,后面会系统学:

GDSCRIPT# 在代码里加载场景并生成实例(第63课详解)
var enemy_scene = preload("res://enemy.tscn")  # 预加载场景
var enemy = enemy_scene.instantiate()           # 创建实例
add_child(enemy)                                 # 把实例加进当前场景树
enemy.position = Vector2(300, 150)               # 设置位置

实例的好处总结

  • ✅ 一次制作,无限复用(敌人、子弹、道具都是场景)
  • ✅ 修改原场景,所有实例同步更新,不用改很多遍
  • ✅ 项目结构清晰,符合「组合优于继承」的现代游戏开发思路
⚠️
实例的子节点拖不动?

因为实例默认是「只读」的。右键实例 → 选择「可编辑子节点(Editable Children)」即可。

⚠️
实例场景改了,但我的实例没变化?

实例是「引用」原场景的,原场景改动会自动更新实例。如果你之前点了「断开实例」,它就和原场景无关了。

🧪 动手试一试

🏋️ 课后练习

创建 enemy.tscn(含 Sprite2D),在 main.tscn 里实例化出 3 个敌人,分别摆在不同位置,然后修改 enemy.tscn 里精灵的图片,观察 3 个实例是否同步变化。

修改原场景后,3 个实例会一起变——这就是「共用图纸」的威力。

💡

给实例节点改名不会影响原场景,放心改。

💡

文件夹里鼠标左键长按拖拽更稳定,避免误触发其他操作。

🎓 本课小结

实例化是把场景当作图纸生成独立副本放进其他场景;修改原场景会同步到所有实例,每个实例又可单独微调,这是 Godot 高效复用的核心。