HOME / 第 2 部分 · 核心概念与 GDScript 语法 / 第 8 课
MODULE 2 · 核心概念与 GDScript 语法
第 8 课 · 场景树与实例化(实例化)
🎯 本课学习目标
- 理解「场景树」与「实例」两个词
- 学会把场景作为实例放入另一个场景
- 理解实例的「本地修改」不会影响原场景
本课讲透「实例化」——把一个场景像印章一样盖到另一个场景里。这是 Godot 复用的核心机制。
📖 详细教学步骤
什么是实例?概念
实例(Instance) = 一个场景被「放入」另一个场景后的副本。
- 把
enemy.tscn拖进main.tscn两次,就有了两个敌人实例 - 每个实例都是独立的:移动其中一个,不影响另一个
- 对原场景(enemy.tscn)的修改,会同步到所有实例(因为大家共用同一份「图纸」)
💡 就像用同一张蛋糕模具做出很多蛋糕:模具是原场景,每个蛋糕是实例。
操作:把场景拖进另一个场景实操
- 打开目标场景(如 main.tscn)
- 在资源面板找到要实例化的场景(如 enemy.tscn)
- 按住鼠标左键,把它拖到场景面板或主视图里
- 松开鼠标,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 高效复用的核心。