Unity预制体Prefab类型与状态的判定
1 普通对象
//这里用类型可以判定普通对象
PrefabUtility.GetPrefabAssetType(gameObject).ToString() == "NotAPrefab"
2 预制实例对象【场景中实例化】
//是否预制体实例
var isIns = PrefabUtility.IsPartOfPrefabInstance(gameObject);
3 预制资源对象【仅磁盘资源】
3.1 预制空间的对象
双击蓝色预制体,打开预制体【对象=白色】
Debug.Log("是否预制资源!"+ PrefabUtility.IsPartOfPrefabAsset(gameObject));
3.2 点击蓝色预制体【对象=蓝色】
Debug.Log("是否预制资源!"+ PrefabUtility.IsPartOfPrefabAsset(gameObject));
4 预制体类型的判定代码示例
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
/// <summary>
/// 预制体类型检测
/// </summary>
public class Prefab_Check : MonoBehaviour
{
#if UNITY_EDITOR
/// <summary>
/// 对象任意组件值变化时,OnValidate起作用!
/// 单纯的OnValidate函数会使输出不稳定,类型获取放到其他函数!
/// 这里有GUI 和 Editor 两个线程输出,获取的结果不准,容易出错!
/// </summary>
private void OnValidate()
{
Debug.Log("Test Gameobject:" + name);
Log();
Check();
}
#endif
/// <summary>
/// 放在非OnValidate函数进行判定,结果准确
/// </summary>
void Check()
{
//是否预制体实例
var isIns = PrefabUtility.IsPartOfPrefabInstance(gameObject);
if (isIns)
{
var type_ = PrefabUtility.GetPrefabAssetType(gameObject);
switch (type_)
{
case PrefabAssetType.NotAPrefab:
Debug.Log("普通对象【非预制】!");
break;
case PrefabAssetType.Regular:
Debug.Log("预制体实例【正常】!");
break;
case PrefabAssetType.Model:
Debug.Log("预制体实例【模型】!");
break;
case PrefabAssetType.Variant:
Debug.Log("预制体实例【变体】!");
break;
case PrefabAssetType.MissingAsset:
Debug.Log("预制体实例[丢失资源]!");
break;
}
}
else
{
Debug.Log("在资源中的预制体文件!");
}
}
/// <summary>
/// 放在非OnValidate函数进行输出,结果准确
/// </summary>
void Log()
{
//old fun
Debug.Log("Old Type: " + PrefabUtility.GetPrefabType(gameObject).ToString());
//new fun
Debug.Log("New Type: " + PrefabUtility.GetPrefabAssetType(gameObject).ToString());
//if a instance
Debug.Log("是否实例:" + PrefabUtility.IsAnyPrefabInstanceRoot(gameObject));
//IsPartOfPrefabInstance
Debug.Log("是否属于实例一部分:" + PrefabUtility.IsPartOfPrefabInstance(gameObject));
}
}
/*
//old fun
Debug.Log(PrefabUtility.GetPrefabType(gameObject).ToString());
// Prefab对象的类型由PrefabUtility.GetPrefabType返回。
[过时(“PrefabType不再告诉预制实例的所有信息。”)]
enum PrefabType
{
//这个对象不是一个Prefab,也不是一个Prefab的实例。
None= 0,
//该对象是用户创建的预制资产。
Prefab= 1,
//该对象是一个导入的3D模型资产。
ModelPrefab = 2,
//该对象是用户创建的Prefab的实例。
PrefabInstance = 3,
//该对象是一个导入的3D模型的实例。
ModelPrefabInstance = 4,
//该对象是一个Prefab的实例,但原始的Prefab不能被发现。
MissingPrefabInstance = 5,
//该对象是用户创建的Prefab的实例,但是连接已经断开。
DisconnectedPrefabInstance = 6,
//该对象是一个导入的3D模型的实例,但连接断开。
DisconnectedModelPrefabInstance = 7
}
//=================================================================
//new fun
Debug.Log(PrefabUtility.GetPrefabAssetType(gameObject).ToString());
//表示预制资产类型的Enum,如Regular, Model和Variant。
enum PrefabAssetType
{
//被查询的对象根本不是Prefab的一部分。
NotAPrefab = 0,
//被查询的对象是常规预制件的一部分。
Regular= 1,
//被查询的对象是Model Prefab的一部分。
Model= 2,
//被查询的对象是预制变体的一部分。
Variant= 3,
//被查询的对象是Prefab实例的一部分,但因为资产,缺失的实际类型预制无法确定。
MissingAsset = 4
}
*/