【Unity】由预制体实例获取预制体资源及预制体资源路径

【Unity】由预制体实例获取预制体资源及预制体资源路径

Unity中一个预制体对象可能处于3种状态:

  1. 位于Project中,是PrefabAsset;
  2. 位于Scene中,是PrefabInstance;
  3. 位于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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值