有这个需求的原因是,在编辑器的 Inspector 逻辑中,写了许多生成逻辑。
现在不想挨个在 Inspector 上都点一遍按钮,所以就需要能获取到它们的编辑器对象。
发现可以借助官方的 UnityEditor.Editor.CreateEditor 方法达到目的,如下:
public static TEditor GetEditorObjByRuntimeObj<TEditor>(UnityEngine.Object runtimeObj)
where TEditor : UnityEditor.Editor
{
var editorType = typeof(TEditor);
var editorObj = UnityEditor.Editor.CreateEditor(runtimeObj, editorType) as TEditor;
return editorObj;
}
如果我们想扩展 Unity 的原生组件,也可以借助这个方法来实现。
[CustomEditor(typeof(Transform))]
public class TransformExt : Editor
{
private Editor m_editor;
void OnEnable()
{
var assembly = Assembly.GetAssembly(typeof(Editor));
var type = assembly.GetType("UnityEditor.TransformInspector", true);
m_editor = Editor.CreateEditor(target, type);
}
public override void OnInspectorGUI()
{
// base.OnInspectorGUI();
// 调用系统绘制方法
m_editor.OnInspectorGUI();
GUILayout.Space(5);
if (GUILayout.Button("拓展按钮"))
{
}
}
}
效果如图: