• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Unity预制体Prefab类型和状态的判定

武飞扬头像
飞浪纪元[FWC–FE]
帮助1

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhhehfeh
系列文章
更多 icon
同类精品
更多 icon
继续加载