这节简单讲一下一个简单的编辑器的应用。在后面会继续将一些编辑器扩展的东西。在菜单栏的扩展我就不讲了,因为那些都比较简单在百度上基本都可以找到的。也有很多人讲到那些扩展。这节先讲一下一个button扩展吧。我记得我在前面的项目中用到了这样一个简单的应用。
这是一个简单的效果图,当然我们还有一种更简单的方法来实现它,我们可以重新建一个类,让这个类继承Editor,然后让它来编辑我们图中这个类,然后我们重写OnInspectorGUI()。然后在重写方法体中添加一个GUILayout.Button方法来实现。效果是一样的,但是如果我们现在又需要一个类需要编辑,那我们是不是又要重新建一个编辑类(当然我们同样也可以让第一个编辑类给它一个权限 它同时也可以编辑我们现在的类,如果又有好多呢,那么我们这个类不就是没完没了么,最后这个类真的就是无限变长了,很显然这种效果不是我们想要的。)所以这里我们要讲另外一种方法(但是我们需要编辑的类比较少的 完全可以采用 第一种方法的)
那么开始我们的button扩展。
首先我们建一个类,随便起个名字(类的作用要和名字对应,这样只是为了便于别人去理解你的代码,命名不要用拼音,不要用拼音,不要用拼音。重要的事情说三遍!)我将它命名为
[AttributeUsage(AttributeTargets.Method)]
public class ButtonAttribute : Attribute
{
}
然后我们建一个button编辑类。
[CustomEditor(typeof(MonoBehaviour), true, isFallback = true), CanEditMultipleObjects]
public class BehaviourButtonsEditor : Editor
{
}
让这个类继承Editor类,我们设置它只能编辑继承monobehavior的类,同时可以编辑多个。我们需要来重写OnInspectorGUI()。然后添加字段。
private static object[] emptyParamList = new object[0];
private IList<MethodInfo> methods = new List<MethodInfo>();
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
if (methods.Count > 0)
{
EditorGUILayout.HelpBox("Click to execute methods!", MessageType.None);
ShowMethodButtons();
}
}
如果方法的个数大于0的时候,我们在button上面给个提示。然后显示每个button。接下来就是我们该如何获取那些方法体需要添加button。
private void OnEnable()
{
methods = target.GetType().GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Where(m =>
m.GetCustomAttributes(typeof(ButtonAttribute), false).Length == 1 &&
m.GetParameters().Length == 0 &&
!m.ContainsGenericParameters
).ToList();
}
首先我们通过反射得到这个类所有的方法体,获得方法体的条件是无论是他是不是公有都获取来,但是我们还需要判断该方法体是否存在ButtonAttribute属性。并且方法体的参数为0并且参数还不能含有泛型参数。最后我们只需要添加ShowMethodButtons()方法。
private void ShowMethodButtons()
{
foreach (MethodInfo method in methods)
{
if (GUILayout.Button(method.Name))
{
method.Invoke(target, emptyParamList);
}
}
}
然后我们随便建一个类。
public class sb : MonoBehaviour {
void Start () {
}
void Update () {
}
[Button]
private void ShowSbNum()
{
}
}
好了 这节就讲完了,这节比较简单,如果大家有兴趣的话 可以继续扩展一下其他的。如果有什么问题欢迎大家骚扰,qq:1850761495