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
}
*/
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhhehfeh
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
excel打印预览压线压字怎么办
PHP中文网 06-22