- 1 普通对象
- 2 预制实例对象【场景中实例化】
- 3 预制资源对象【仅磁盘资源】
- 3.1 预制空间的对象
- 3.2 点击蓝色预制体【对象=蓝色】
- 4 预制体类型的判定代码示例
//这里用类型可以判定普通对象 PrefabUtility.GetPrefabAssetType(gameObject).ToString() == "NotAPrefab"2 预制实例对象【场景中实例化】
//是否预制体实例 var isIns = PrefabUtility.IsPartOfPrefabInstance(gameObject);3 预制资源对象【仅磁盘资源】 3.1 预制空间的对象
双击蓝色预制体,打开预制体【对象=白色】
Debug.Log("是否预制资源!"+ PrefabUtility.IsPartOfPrefabAsset(gameObject));
Debug.Log("是否预制资源!"+ PrefabUtility.IsPartOfPrefabAsset(gameObject));
using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif ////// 预制体类型检测 /// public class Prefab_Check : MonoBehaviour { #if UNITY_EDITOR ////// 对象任意组件值变化时,OnValidate起作用! /// 单纯的OnValidate函数会使输出不稳定,类型获取放到其他函数! /// 这里有GUI 和 Editor 两个线程输出,获取的结果不准,容易出错! /// private void OnValidate() { Debug.Log("Test Gameobject:" + name); Log(); Check(); } #endif ////// 放在非OnValidate函数进行判定,结果准确 /// 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("在资源中的预制体文件!"); } } ////// 放在非OnValidate函数进行输出,结果准确 /// 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)); } }



