通过添加组件并将其属性设置为适当的值,可以方便地在场景中构建游戏对象。但是,当有一个像 NPC、道具或景物之类的对象在场景中多次重复使用时,这种方法会产生问题。简单复制对象肯定会产生重复项,但所有这些项都是可以独立编辑的。通常会希望特定对象的所有实例具有相同的属性,因此在场景中编辑一个对象时,不希望对所有副本重复执行相同的编辑。
幸运的是,Unity 有一种__预制件__资源类型,可用于存储游戏对象 (GameObject) 对象以及配套的组件和属性。预制件充当模板,在此模板的基础之上可以创建场景中的新对象实例。对预制件资源所做的任何编辑都会立即反映在由该预制件生成的所有实例中,但也可以单独_重写_每个实例的组件和设置。
注意:将资源文件(如网格)拖动到场景中时将创建新的对象实例,并且在更改原始资源时所有此类实例都将更改。但是,尽管行为在表面上很相似,但资源不是预制件,因此无法向其添加组件或使用下面描述的其他预制件功能。
若要创建预制件,可选择 __Asset > Create Prefab__,然后将场景中的对象拖到出现的“空”预制件资源上。然后,如果将另一个游戏对象拖到预制件上,系统将询问是否要将当前游戏对象替换为新游戏对象。只需将预制件资源从 Project 视图拖动到 Scene 视图,即可创建预制件的实例。作为预制件实例创建的对象将以蓝色文本显示在 Hierarchy 视图中。(普通对象以黑色文本显示。)
如上所述,对预制件资源本身的更改将反映在所有实例中,但也可以单独修改单个实例。例如,当想要创建几个类似的 NPC 但希望引入一些变化来使它们更逼真时,这很有用。为了明确区分已重写的属性,此类属性在 Inspector 中的名称标签将以粗体显示。(当一个全新的组件添加到预制件实例时,其_所有_属性都将以粗体显示。)
还可以使用脚本在运行时创建预制件的实例。请参阅有关实例化预制件的手册页以了解更多详细信息。
预制件实例的 Inspector 中有三个按钮对于普通对象而言是没有的:_Select、Revert_ 和 Apply。
The Select button selects the prefab asset from which the instance was generated. This allows you to edit the main prefab and thereby change all its instances. However, you can also save overridden values from an instance back to the originating prefab using the Apply button (modified Transform position and rotation values are excluded for obvious reasons). This effectively lets you edit all instances (except those which override the value changed) via any single instance and is a very quick and convenient way to make global changes. If you experiment with overriding properties but then decide you preferred the default values, you can use the Revert button to realign the instance with its prefab.