【Unity】由预制体实例获取预制体资源及预制体资源路径
Unity中一个预制体对象可能处于3种状态:
- 位于Project中,是PrefabAsset;
- 位于Scene中,是PrefabInstance;
- 位于PrefabMode Scene中,既不是PrefabAsset也不是Prefab Instance。
下面的方法给出了获取不同状态的预制体对象所对应的预制体资源及其资源路径的方式。
/// <summary>
/// 获取预制体资源路径。
/// </summary>
/// <param name="gameObject"></param>
/// <returns></returns>
public static string GetPrefabAssetPath(GameObject gameObject)
{
#if UNITY_EDITOR
// Project中的Prefab是Asset不是Instance
if (UnityEditor.PrefabUtility.IsPartOfPrefabAsset(gameObject))
{
// 预制体资源就是自身
return UnityEditor.AssetDatabase.GetAssetPath(gameObject);
}
// Scene中的Prefab Instance是Instance不是Asset
if (UnityEditor.PrefabUtility.IsPartOfPrefabInstance(gameObject))
{
// 获取预制体资源
var prefabAsset = UnityEditor.PrefabUtility.GetCorrespondingObjectFromOriginalSource(gameObject);
return UnityEditor.AssetDatabase.GetAssetPath(prefabAsset);
}
// PrefabMode中的GameObject既不是Instance也不是Asset
var prefabStage = UnityEditor.Experimental.SceneManagement.PrefabStageUtility.GetPrefabStage(gameObject);
if (prefabStage != null)
{
// 预制体资源:prefabAsset = prefabStage.prefabContentsRoot
return prefabStage.prefabAssetPath;
}
#endif
// 不是预制体
return null;
}