【Unity】判斷資源是否是預製體

【Unity】判斷資源是否是預製體

以下方法需要Unity 2018.3.0f1及更高版本。
對於低版本的Unity Editor,可以通過 gameObject.scene.IsValid() 來判斷對象是預製體資源還是預製體實例。

判斷Object是否是預製體資源

/// <summary>
/// 判斷Object是否是預製體資源。
/// 如果是則返回 `true` ,如果不是則返回 `false` 。
/// </summary>
/// <param name="obj">UnityEngine.Object</param>
/// <param name="includePrefabInstance">是否將預製體資源的Scene實例視爲預製體資源?</param>
/// <returns></returns>
public static bool IsPrefabAsset(UnityEngine.Object obj, bool includePrefabInstance)
{
#if UNITY_EDITOR
    if (!obj)
    {
        return false;
    }

    var type = UnityEditor.PrefabUtility.GetPrefabAssetType(obj);
    if (type == UnityEditor.PrefabAssetType.NotAPrefab)
    {
        return false;
    }

    var status = UnityEditor.PrefabUtility.GetPrefabInstanceStatus(obj);
    if (status != UnityEditor.PrefabInstanceStatus.NotAPrefab && !includePrefabInstance)
    {
        return false;
    }

    return true;
#else
    return false;
#endif
}

判斷GameObject是否是預製體資源的實例

/// <summary>
/// 判斷GameObject是否是預製體資源的實例。
/// 如果是則返回 `true` ,如果不是則返回 `false` 。
/// </summary>
/// <param name="gameObject">UnityEngine.GameObject</param>
/// <param name="includeMissingAsset">是否將丟失預製體關聯的GameObject視爲預製體實例?</param>
/// <returns></returns>
public static bool IsPrefabInstance(UnityEngine.GameObject gameObject, bool includeMissingAsset)
{
#if UNITY_EDITOR
    if (!gameObject)
    {
        return false;
    }

    var type = UnityEditor.PrefabUtility.GetPrefabAssetType(gameObject);
    if (type == UnityEditor.PrefabAssetType.NotAPrefab || (!includeMissingAsset && type == UnityEditor.PrefabAssetType.MissingAsset))
    {
        return false;
    }

    var status = UnityEditor.PrefabUtility.GetPrefabInstanceStatus(gameObject);
    if (status == UnityEditor.PrefabInstanceStatus.NotAPrefab)
    {
        return false;
    }

    return true;
#else
    return false;
#endif
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章