前言
在编辑器中操作预制体常用的类是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