0评论

Unity简单编辑器的扩展—button扩展

文章来自CSDN博客 2018-10-11 18浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏开发行业精英群711501594

本篇内容简单讲一下一个简单的编辑器的应用,关于在菜单栏的扩展部分这里就不进行介绍了,百度上也有,这里要着重介绍的是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()
    {
    }
}
关于button扩展就给大家介绍这么多了,如果想了解其他扩展,可以继续关注。
来自:https://blog.csdn.net/u012565990/article/details/52028983