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
}
 */

猜你喜欢

转载自blog.csdn.net/weixin_38531633/article/details/123804411