详解Unity预制体和预制体变体(Prefab Variant)

目录

一、预制体变体的创建

二、预制体与变体的绑定

三、预制体到变体的继承关系

四、变体常见API

五、变体用途

一、预制体变体的创建

通过一个预制体创建预制体变体可以通过以下两种方法:

1.在需要创建变体的预制体上右键选择图中选项即可在预制体当前目录下创建预制体变体。

 2.通过脚本进行动态创建

GameObject prefab = item;//需要创建变体的预制体
string source = "需要保存的路径";//变体保存的路径
GameObject instantiatePrefab = PrefabUtility.InstantiatePrefab(prefab) as GameObject;//在场景中实例化需要创建变体的预制体
PrefabUtility.SaveAsPrefabAsset(instantiatePrefab, source);//直接保存该预制体到目录下,Unity会自动生成变体
DestroyImmediate(instantiatePrefab);//最后销毁实例化出来的预制体即可

二、预制体与变体的绑定

预制体与变体的绑定信息保存在.meta文件中,所以在SVN提交或者复制等等需要文件转移时需要将.meta文件一起转移,否则会丢失绑定信息。

三、预制体到变体的继承关系

在开发时,不能同时修改预制体和变体的属性,所以会有以下两种情况

1.修改预制体属性时:变体会随着进行修改,变体之前对该属性的修改都会被覆盖

2.修改变体属性时:只有变体的属性会修改,预制体不受任何影响。这个时候变体就和预制体有了差别。有差别的部分Unity会在左侧使用蓝线进行标注。如图所示,表示该变体对Tag和Animator组件进行了修改,Transform组件则和变体对应的预制体完全相同。

四、变体常见API

变体相关的API大部分和预制体相同。比较特殊的是:

PrefabUtility.GetCorrespondingObjectFromOriginalSource方法。该方法会传入一个GameObject,返回该变体对应的预制体,而不会返回变体本身。

因此,当你需要获取变体路径、对变体做出特殊修改等等各种操作时,尽量使用PrefabUtility.GetCorrespondingObjectFromSource方法。该方法同样传入一个GameObject,但是会返回该变体本身

五、变体用途

变体常用于方便项目进行资源管理。在项目中常常出现美术资源目录和实际调用资源目录不同的情况,这种时候可以在实际调用资源目录下创建对应预制体的变体。当预制体修改时,变体也会随之修改。

除了需要对变体进行特殊操作,大部分情况下完全可以将变体当作预制体本身调用。

猜你喜欢

转载自blog.csdn.net/weixin_51543761/article/details/128828311