【预制体】判断物体对象是否预制体

本文探讨了在Unity中使用PrefabUtility类对预制体进行操作的方法,特别是在不同版本中的变化。介绍了如何判断对象是否为预制体,以及在2019版本及以后,由于部分函数过时,如何通过资源路径进行判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在编辑器中操作预制体常用的类是PrefabUtility,里面提供了不同的方法去对预制体进行操作。当想要判断对象是实例,预制体还是单纯一个对象时,可以使用里面提供的函数。
PrefabUtility里面不同版本变化很多,常用的函数在2019都过期了,但是2019以下的版本都能用。所以用哪个的话,可以根据自己项目版本来决定。

PrefabUtility官网信息:
https://docs.unity3d.com/2018.2/Documentation/ScriptReference/PrefabUtility.html

2019版本

在2019版本中,判断对象是根据能否从Assets里加载资源。(PrefabUtility变得好鸡肋啊)
这样的话,预制体可以直接判断能够获取路径。

assetPath = AssetDatabase.GetAssetPath(gameObject);
if( !string.IsNullOrEmpty(assetPath) )
    return true;

实验

测试函数

PrefabUtility.GetPrefabObject() //2019-过时
PrefabUtility.FindPrefabRoot() //2019-过时
PrefabUtility.GetPrefabParent()//2019-过时
AssetDatabase.GetAssetPath()

GameObject

在这里插入图片描述

预制体实例

在这里插入图片描述

预制体

在这里插入图片描述

脚本

using UnityEditor;
using UnityEngine;

public class PrefabUtilitWindow : EditorWindow
{
    [MenuItem("Test/PrefabWindow")]
    private static void Open()
    {
        EditorWindow.GetWindow<PrefabUtilitWindow>();
    }

    private Object m_Object = null;
    private Object m_PrefabObject = null;
    private Object m_PrefabParent = null;
    private GameObject m_PrefabRoot = null;
    private string m_AssetPath = null;

    public void OnGUI()
    {
        Object inputObject = EditorGUILayout.ObjectField(m_Object, typeof(GameObject), true);
        if (inputObject != m_Object)
        {
            m_Object = inputObject;
            if (m_Object != null)
            {
                SetData();
            }
        }

        GUI.backgroundColor = new Color(0.94f, 0.5f, 0.5f);

        GUILayout.BeginVertical("box");
        {
            EditorGUILayout.LabelField("2019版本 过期");

            EditorGUILayout.LabelField("PrefabUtility.GetPrefabObject:   " + m_PrefabObject);
            EditorGUILayout.LabelField("PrefabUtility.FindPrefabRoot:     " + m_PrefabRoot);
            EditorGUILayout.LabelField("PrefabUtility.GetPrefabParent:   " + m_PrefabParent);
        }
        GUILayout.EndVertical();

        GUI.backgroundColor = Color.white;
        EditorGUILayout.LabelField("AssetDatabase.GetAssetPath:    " + m_AssetPath);

    }

    private void SetData()
    {
        GameObject gameObject = m_Object as GameObject;

        m_PrefabObject = PrefabUtility.GetPrefabObject(gameObject);
        m_PrefabParent = PrefabUtility.GetPrefabParent(gameObject);
        m_PrefabRoot = PrefabUtility.FindPrefabRoot(gameObject);
        m_AssetPath = AssetDatabase.GetAssetPath(gameObject);
    }
}

总结

如果是2019以下的版本,直接使用PrefabUitily提供的就可以了。
2019的版本的话,还是老实根据资源路径进行判断吧。

测试版本:2017.4.3f1

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值