Version: 2017.3
静态游戏对象
在运行时实例化预制件

预制件

通过添加组件并将其属性设置为适当的值,可以方便地在场景中构建游戏对象。但是,当有一个像 NPC、道具或景物之类的对象在场景中多次重复使用时,这种方法会产生问题。简单复制对象肯定会产生重复项,但所有这些项都是可以独立编辑的。通常会希望特定对象的所有实例具有相同的属性,因此在场景中编辑一个对象时,不希望对所有副本重复执行相同的编辑。

幸运的是,Unity 有一种__预制件__资源类型,可用于存储游戏对象 (GameObject) 对象以及配套的组件和属性。预制件充当模板,在此模板的基础之上可以创建场景中的新对象实例。对预制件资源所做的任何编辑都会立即反映在由该预制件生成的所有实例中,但也可以单独_重写_每个实例的组件和设置。

注意:将资源文件(如网格)拖动到场景中时将创建新的对象实例,并且在更改原始资源时所有此类实例都将更改。但是,尽管行为在表面上很相似,但资源不是预制件,因此无法向其添加组件或使用下面描述的其他预制件功能。

使用预制件

若要创建预制件,可选择 __Asset > Create Prefab__,然后将场景中的对象拖到出现的“空”预制件资源上。然后,如果将另一个游戏对象拖到预制件上,系统将询问是否要将当前游戏对象替换为新游戏对象。只需将预制件资源从 Project 视图拖动到 Scene 视图,即可创建预制件的实例。作为预制件实例创建的对象将以蓝色文本显示在 Hierarchy 视图中。(普通对象以黑色文本显示。)

如上所述,对预制件资源本身的更改将反映在所有实例中,但也可以单独修改单个实例。例如,当想要创建几个类似的 NPC 但希望引入一些变化来使它们更逼真时,这很有用。为了明确区分已重写的属性,此类属性在 Inspector 中的名称标签将以粗体显示。(当一个全新的组件添加到预制件实例时,其_所有_属性都将以粗体显示。)

一个预制件实例上的网格渲染器 (Mesh Renderer) 组件已重写Cast Shadows属性
一个预制件实例上的网格渲染器 (Mesh Renderer) 组件已重写“Cast Shadows”属性

还可以使用脚本在运行时创建预制件的实例。请参阅有关实例化预制件的手册页以了解更多详细信息。

从实例中编辑预制件

预制件实例的 Inspector 中有三个按钮对于普通对象而言是没有的:_SelectRevert_ 和 Apply

Select 按钮选择用于生成实例的预制件资源。这样可以编辑主预制件,从而更改其所有实例。但是,还可以使用 Apply 按钮将实例中重写的值保存回原始预制件(出于显而易见的原因,修改的变换位置值将排除在外)。这种方式可以通过任何单个实例来有效编辑所有实例(重写更改值的实例除外),这是进行全局更改的一种非常快捷方便的方法。如果尝试重写属性后决定还是使用默认值,则可以使用 Revert 按钮重新让实例向其预制件看齐。

静态游戏对象
在运行时实例化预制件