新版Unity中(2017起?),在Editor模式下无法再直接用代码对prefab进行某些操作(比如添加组件等等)。但是对已有组件是可以修改其暴露的值的。
获得预制件路径
- 预制件在Assets目录中
path=UnityEditor.PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(targetPrefab);
targetPrefab若在Resources目录下可以通过Resources.Load加载
- 预制件在Scene场景中
var prefab = UnityEditor.PrefabUtility.GetPrefabInstanceHandle(targetGameObject);
if (prefab != null)
{ path = UnityEditor.PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(prefab); }
else
{ Logger.LogError("此物品没有预制:" + targetGameObject); }
上述获得的path路径格式皆为:Assets/…
在场景中加载预制件
比如在Resources目录下有个预制件,通常游戏中要使用该预制件需要分为两步,即Resources.Load()先加载Prefab,然后Instantiate该Prefab即可获得到其对应的GameObject。
但在Editor下如何把Prefab加载到场景中呢?
使用PrefabUtility.InstantiatePrefab即可,如:var objPrefab = PrefabUtility.InstantiatePrefab(Resources.Load(path)) as GameObject;
修改预制件
通过var newPrefab = PrefabUtility.InstantiatePrefab(prefab) as GameObject;
在当前场景中实例化一个预制件物体。
所有的修改,都对newPrefab进行。
修改完毕后,通过PrefabUtility.SaveAsPrefabAsset(newPrefab, prefabPath, out isSuccess);
把新修改和原prefab关联。
然后删除newPrefab即可。