【Unity】判断对象是否是预制体以及是否存储在磁盘中
一、判断对象是否存储在磁盘中
如果对象存储在磁盘中,下面的方法会返回 true
;
如果对象位于场景中,下面的方法会返回 false
。
如果已知传入方法的参数对象是
GameObject
或 GameObject 上的Component
,那么也可以用这个方法判断参数对象是否是预制体资源,但不能用于判断对象是否是预制体实例。如果传入方法的参数对象不是GameObject
或 GameObject 上的Component
(例如原始美术资源),那么该方法会一直返回true
。
UnityEditor.EditorUtility.IsPersistent(Object target);
二、判断对象是否是预制体
1. Unity 2018.3.0及更高版本
可以通过以下方法判断对象是预制体资源、预制体实例还是普通对象:
UnityEditor.PrefabUtility.IsPartOfPrefabAsset()
UnityEditor.PrefabUtility.IsPartOfPrefabInstance()
UnityEditor.PrefabUtility.IsPartOfXxx()
2. Unity 2018.3.0以下的版本
可以通过 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
}