【Unity】判断资源是否是预制体

【Unity】判断资源是否是预制体

以下方法需要Unity 2018.3.0f1及更高版本。
对于低版本的Unity Editor,可以通过 gameObject.scene.IsValid() 来判断对象是预制体资源还是预制体实例。

判断Object是否是预制体资源

/// 
/// 判断Object是否是预制体资源。
/// 如果是则返回 `true` ,如果不是则返回 `false` 。
/// 
/// UnityEngine.Object
/// 是否将预制体资源的Scene实例视为预制体资源?
/// 
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是否是预制体资源的实例

/// 
/// 判断GameObject是否是预制体资源的实例。
/// 如果是则返回 `true` ,如果不是则返回 `false` 。
/// 
/// UnityEngine.GameObject
/// 是否将丢失预制体关联的GameObject视为预制体实例?
/// 
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
}

你可能感兴趣的:(Unity,Unity,Prefab,预制体,编辑器)