栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

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

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

Unity预制体Prefab类型与状态的判定
    • 1 普通对象
    • 2 预制实例对象【场景中实例化】
    • 3 预制资源对象【仅磁盘资源】
      • 3.1 预制空间的对象
      • 3.2 点击蓝色预制体【对象=蓝色】
    • 4 预制体类型的判定代码示例

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

/// 
/// 预制体类型检测
/// 
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));
    }
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/906546.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号