一个自己思索很长时间的功能

  一开始做项目的时候,涉及NGUI特别多,项目中需要非常多的Button以及和它对应的事件,通常的实现方式都是下面这种情况:

 1 private void BtnClickHandler(GameObject go)
 2     {
 3         switch (go.name)
 4         {
 5             case "regist":
 6                 RegistUser();
 7                 break;
 8             case "forgetPwd":
 9                 ForGetPassWord();
10                 break;
11             case "submit":
12                 DoLogin();
13                 break;
14             case "exit":
15                 QuitApp();
16                 break;
17             case "NoRegistLogin":
18                 PublicVals.IsRegistUser = false;
19                 LoadScene("SeleMode");
20                 break;
21         }
22     }

  我吧,很不喜欢这种判断方式,当然这不代表我下面实现的功能,比这个要好或者要方便,只是单纯我个人想去这么实现而已。NGUI的Button自带了一个功能On Click,我有很多同事也用这种方式来实现按钮和事件的关联,我也比较喜欢这个功能,但是我想把所有Button放到一个脚本下管理或者说放到一个Inspector下管理( 什么样的值会被显示在Inspector面板上?已经被序列化,但是没有用HideInInspector标记的值。),去阅读一下NGUI的源代码发现所有这样的事件功能都是通过public List<EventDelegate> onSubmit = new List<EventDelegate>()这样的方式来定义的,通过下面的方法来进行调用的。

    public void Submit ()
    {
        if (NGUITools.GetActive(this))
        {
            mValue = value;

            if (current == null)
            {
                current = this;
                EventDelegate.Execute(onSubmit);
                current = null;
            }
            SaveToPlayerPrefs(mValue);
        }
    }

  方法名的获取是通过反射的方式,在EventDelegateEditor这个类中实现的,具体方法如下

  

 1 static public List<Entry> GetMethods (GameObject target)
 2     {
 3         MonoBehaviour[] comps = target.GetComponents<MonoBehaviour>();
 4
 5         List<Entry> list = new List<Entry>();
 6
 7         for (int i = 0, imax = comps.Length; i < imax; ++i)
 8         {
 9             MonoBehaviour mb = comps[i];
10             if (mb == null) continue;
11
12             MethodInfo[] methods = mb.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public);
13
14             for (int b = 0; b < methods.Length; ++b)
15             {
16                 MethodInfo mi = methods[b];
17
18                 if (mi.ReturnType == typeof(void))
19                 {
20                     string name = mi.Name;
21                     if (name == "Invoke") continue;
22                     if (name == "InvokeRepeating") continue;
23                     if (name == "CancelInvoke") continue;
24                     if (name == "StopCoroutine") continue;
25                     if (name == "StopAllCoroutines") continue;
26                     if (name == "BroadcastMessage") continue;
27                     if (name.StartsWith("SendMessage")) continue;
28                     if (name.StartsWith("set_")) continue;
29
30                     Entry ent = new Entry();
31                     ent.target = mb;
32                     ent.name = mi.Name;
33                     list.Add(ent);
34                 }
35             }
36         }
37         return list;
38     }

这样我们就获得方法名了,然后通过编辑Inspector来实现想要的界面效果,具体代码如下:

public override void OnInspectorGUI()
    {
        monoscript.Update();
        EditorGUILayout.PropertyField(connectionPool);
        if (connectionPool.isExpanded)
        {
            EditorGUI.indentLevel += 1;
            EditorGUILayout.PropertyField(connectionPool.FindPropertyRelative("script"));
            ButtonEvent scripttarget = (ButtonEvent)target;
            string[] names;
            string[] tnames={"Please insert script"};
            if (scripttarget.connectionPool.script != null)
            {
                List<string> temp = GetMethods(scripttarget.connectionPool.script);
                names = temp.ToArray();
            }
            else
            {
                names = null;
            }
            SerializedProperty list = connectionPool.FindPropertyRelative("buttonConnection");
            EditorGUILayout.PropertyField(list);
            if (list.isExpanded)
            {
                EditorGUI.indentLevel += 1;
                EditorGUILayout.PropertyField(list.FindPropertyRelative("Array.size"));
                if (list.arraySize > 0)
                {
                    for (int i = 0; i < list.arraySize; i++)
                    {

                        SerializedProperty mlist = list.GetArrayElementAtIndex(i);
                        EditorGUILayout.PropertyField(mlist,new GUIContent("BE"+i));
                        if (mlist.isExpanded)
                        {
                            EditorGUI.indentLevel += 1;
                            EditorGUILayout.PropertyField(mlist.FindPropertyRelative("button"));
                            if (scripttarget.connectionPool.buttonConnection.Length >= list.arraySize)
                            {
                                if (names != null)
                                {
                                    scripttarget.connectionPool.buttonConnection[i].indexNum = EditorGUILayout.Popup("Method", scripttarget.connectionPool.buttonConnection[i].indexNum, names);
                                    scripttarget.connectionPool.buttonConnection[i].methodName = names[scripttarget.connectionPool.buttonConnection[i].indexNum];
                                }
                                else
                                {
                                    scripttarget.connectionPool.buttonConnection[i].indexNum = EditorGUILayout.Popup("Method", scripttarget.connectionPool.buttonConnection[i].indexNum, tnames);
                                    scripttarget.connectionPool.buttonConnection[i].methodName = tnames[scripttarget.connectionPool.buttonConnection[i].indexNum];
                                }
                            }
                            else
                            {
                                if (names != null)
                                    EditorGUILayout.Popup("Method", 0, names);
                                else
                                    EditorGUILayout.Popup("Method", 0, tnames);
                            }
                            //EditorGUILayout.PropertyField(mlist.FindPropertyRelative("methodName"));
                            EditorGUI.indentLevel -= 1;
                        }

                    }
                }
            }

        }
        monoscript.ApplyModifiedProperties();
    }

最后实现的效果如图

  将事件代码拖入Script,在ButtonConnection中Button拖入对应button,method里面选择方法后,点击Button调用事件。

  这个功能看起来有些本末倒置,只是在我个人强迫症的驱使下完成的,谢谢。

时间: 2024-08-05 14:38:22

一个自己思索很长时间的功能的相关文章

一个困扰我很长时间的问题,趁着现在能描述清楚,赶紧写下来.以后时常回来看看这个帖子

这个问题想了好久,也试图几次描述出来给别人,但是每次似乎都描述的让人听不懂我的问题,今天看知乎,貌似有人和我想到了一起了.赶紧记录下: 问题其实概括起来挺简单:空间是什么?? 2个延伸: 1>如果有一个超级显微镜,能看到世界上最小的东西,比如什么原子,质子,那么原子和原子之间的那个空间是什么?? 2>比如一个二维空间的小人,或者说是一张纸.图中的黑色可以代表石头,蓝色代表河流,黄色代表太阳. 在小人看来,这三样东西占据了他的空间,无法逾越.但是从我们三维的视角看,这三样都只是占用了空间而非空间

为什么drop table的时候要在checking permissions花很长时间?

昨天,我drop一个表的时候在checking permissions花了20s+,这个时间花在哪里了呢?经常查找发现我的配置文件innodb_file_per_table=1的,innodb需要遍历LRU链表,并且丢弃属于这个表的表空间里面的页.如果innodb buffer pool很大的话,需要花费很长时间,并且当执行这个动作的时候table_cache的锁是不能被其他query语句持有的. 参考资料: https://www.percona.com/blog/2011/02/03/per

Springmvc+Hibernate在Eclipse启动Tomcat需要很长时间的解决方法

最近在学习SpringMvc开发,有一个提问困扰了很久,就是在Eclipse启动Tomcat需要很长时间,大概要1分多钟. 启动日志: 九月 08, 2016 8:59:01 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server version: Apache Tomcat/8.0.36 九月 08, 2016 8:59:01 下午 org.apache.catalina.startup.VersionLogger

MTK 开机黑屏很长时间

MT6735平台,可以开机,但是黑屏很长时间才看到开机图片. 查看串口LOG发现手机是正常运行的,也就是说LCM驱动没有异常,黑屏阶段也没有什么错误报出. 在MTK的FAQ上找到如下: [DESCRIPTION] 本FAQ只讨论开机过程中黑屏,不讨论花屏(可以参考刷).只讨论L/M版本(之前的KK/JB版本可以作为参考). 首先要看一下是否IPO开机,即在setting-->辅助功能-->不勾选"fast boot",如果不黑屏,说明是因为ipo这个过程中的问题,那么问题需

删除一张600万记录表的一个索引需要多长时间?

快速问答时间: 背景: 系统负载低,固态盘,目前应用没有针对该表的业务 需要多长时间? 需要多长时间,你是不是开始计算了.建一个索引大概需要五分钟,删一个索引是不是也需要五分钟呢?错,请看下面截图 是的,事实证明删除索引只花了0.06s

今天胡乱看看到了一个很长时间的设计题,表达一下我的想法!有不足多多指教~~

设计任务:1.最近总有人骚扰我们的投票模块,需要你来设计一个投票限制的东东要求如下:1)要求每个QQ号码(假设此QQ号码在UNIT32 内可以表示)10分钟这内只能投5票.2)我们的用户很踊跃,平均每天要有2000万人左右通过此程序投票.说明:1)无需写代码,只需要图跟文字即可.2)对于关键逻辑,请用图加代码表示出来,这也是对你文字表达能力的一个考验.3)对你能想到的所有的边界条件列出来,这是对你逻辑思维全面与敏捷性的考验.4)存储部分,尽你所能吧.如果,你需要一个自己设计的存储层,那么把这个存

如果一个问题纠缠了你很长时间,那么你很有可能走进了一个死胡同。

很多时候,一个很简单的问题,往往会使得你毫无办法,然而在你一遍又一遍的检查了代码后, 发现没有任何问题时,却还是没能达到你预期的效果.这时候说明,你可能陷入了死胡同. 这时,你需要的时,完全摒弃之前的思路,跳出这层,问题会逐渐浮出水面的. 在今天上午,用jquery 的ajax去调用一个aciton,用到内部的架构(对这框架不熟悉), 需要配置action的url,在调用的时候,无论如何也不会去执行aciton,判断的标准就是 在后台会不会打出Log,结果是返回一堆乱七八糟的xml,急于把程序跳

马化腾坦言非学霸 称微信最初就是一个邮箱(很长,慢慢体会)

新浪科技讯 10月23日下午消息,腾讯董事会主席兼CEO马化腾昨日参加了清华大学经管学院2016清华管理全球论坛,与清华经管学院院长钱颖一进行对话.其间,马化腾分享了自己的兴趣爱好.腾讯的发展以及微信诞生背后的故事等. 喜好天文与科幻,坦言非学霸 马化腾对天文有浓厚兴趣.他表示虽然在大学其间没有集体学习天文方面的课程,不过他自己会在业余时间看,包括找寻美国的资料来做了解.而且对于天文的兴趣,一直持续到现在. “也可能是受我的影响,我们早期的创始人中还有很多对天文有兴趣的,有的人自己投资建了个人的

解决windows 10 桌面右键时菜单显示出来需要很长时间的问题

新装windows 10系统,在管理员用户下面右键菜单显示很快,但是在另外一个用户下面,右键菜单显示要等待2秒甚至更长,因为之前已经更新过显卡驱动,所以排除旧显卡驱动可能造成的影响.因为windows 时右键菜单都是Exploer上的shellExtension,所以问题可能在这里,当然也可能有另外一个问题,就是UAC(但是UAC是系统自带功能,一般不会出问题,我们先一步步排除问题点). youtube 上有个视频叫slow right click on windows 10 fix ,解决的是