示例#1
0
    public void AddEvent(EventDelegateList eventList)
    {
        GameObject[] oldTargets = eventList.eventTarget;
        string[] oldMethods = eventList.eventMethod;
        MethodParamList[] oldParams = eventList.eventParams;

        // Copy old list
        int cnt = eventList.eventTarget.Length + 1;
        eventList.eventTarget = new GameObject[cnt];
        eventList.eventMethod = new string[cnt];
        eventList.eventParams = new MethodParamList[cnt];
        for (int i = 0; i < cnt - 1; i++) {
            eventList.eventTarget[i] = oldTargets[i];
            eventList.eventMethod[i] = oldMethods[i];
            eventList.eventParams[i] = oldParams[i];
        }
    }
示例#2
0
    void TriggerEventList(EventDelegateList eventList)
    {
        if (eventList == null) {
            return;
        }

        for (int i = 0; i < eventList.eventTarget.Length; i++) {
            GameObject target = eventList.eventTarget[i];
            string componentName = eventList.eventMethod[i].Split('.')[0];
            string methodName = eventList.eventMethod[i].Split('.')[1];

            UnityEngine.Object component = target.GetComponent(componentName) as UnityEngine.Object;
            BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
            MethodInfo[] methods = component.GetType().GetMethods(flags);
            MethodInfo method = null;
            foreach (MethodInfo m in methods) {
                if (m.Name == methodName) {
                    method = m;
                }
            }

            if (method == null) {
                continue;
            }

            System.Object[] paramValues = eventList.eventParams[i].GetParams(method.GetParameters());
            method.Invoke(component, paramValues);
        }
    }
示例#3
0
    public EventDelegateList EventDelegateListField(string label, EventDelegateList eventList)
    {
        if (eventList == null) {
            eventList = ScriptableObject.CreateInstance<EventDelegateList>();
        }

        if (eventList.eventTarget == null) {
            ClearEvents(eventList);
        }

        EditorGUILayout.BeginVertical("box");

        EditorGUILayout.BeginHorizontal();
        GUILayout.Space(10);
        bool foldValue = folded.ContainsKey(label) ? folded[label] : true;
        foldValue = EditorGUILayout.Foldout(foldValue, label);
        EditorGUILayout.EndHorizontal();

        folded[label] = foldValue;
        if (!foldValue) {

            EditorGUILayout.EndVertical();
            return eventList;
        }

        int eventCount = eventList.eventTarget.Length;
        for (int i = 0; i < eventList.eventTarget.Length; i++) {
            EditorGUILayout.Space();
            EditorGUILayout.BeginVertical("box");

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("#" + i.ToString());
            if (GUILayout.Button("-", GUILayout.Width(20))) {
                RemoveEvent(eventList, i);
                EditorGUILayout.EndVertical();
                break;
            }
            EditorGUILayout.EndHorizontal();

            GameObject gameobject = eventList.eventTarget[i];
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("GameObject");
            gameobject = EditorGUILayout.ObjectField((Object) gameobject, typeof(GameObject), true) as GameObject;
            EditorGUILayout.EndHorizontal();
            eventList.eventTarget[i] = gameobject;

            if (gameobject == null) {
                EditorGUILayout.EndVertical();
                continue;
            }

            Object[] components = gameobject.GetComponents<MonoBehaviour>();
            List<string> methodNames = new List<string>();
            List<MethodInfo> allMethods = new List<MethodInfo>();
            methodNames.Add("None");
            foreach (Object component in components) {
                if ((component as EventTrigger) == _target) {
                    continue;
                }

                //BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
                //MethodInfo[] methods = component.GetType().GetMethods(flags);
                MethodInfo[] methods = EventTrigger.GetObjectMethods(component.GetType());
                foreach (MethodInfo method in methods) {
                    methodNames.Add(component.GetType().ToString() + "." + method.Name);
                    allMethods.Add(method);
                }
            }

            string currentMethod = eventList.eventMethod[i] == null ? eventList.eventMethod[i] : "None";
            int selectedIndex = methodNames.FindIndex(item => item == eventList.eventMethod[i]);

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Method: ");
            selectedIndex = EditorGUILayout.Popup(selectedIndex, methodNames.ToArray());
            EditorGUILayout.EndHorizontal();

            if (selectedIndex > -1) {
                eventList.eventMethod[i] = methodNames[selectedIndex];

                if (selectedIndex == 0) {
                    EditorGUILayout.EndVertical();
                    continue;
                }

                ParameterInfo[] methodParams = allMethods[selectedIndex - 1].GetParameters();
                if (eventList.eventParams[i] == null) {
                    eventList.eventParams[i] = ScriptableObject.CreateInstance<MethodParamList>();
                    eventList.eventParams[i].Init(methodParams);
                }

                for (int j = 0; j < methodParams.Length; j++) {
                    EditorGUILayout.BeginHorizontal();
                    EditorGUILayout.LabelField(methodParams[j].Name);
                    System.Object value = eventList.eventParams[i].GetParam(j, methodParams);
                    value = GenericField(value, methodParams[j].ParameterType);
                    eventList.eventParams[i].SetParam(j, value, methodParams);
                    EditorGUILayout.EndHorizontal();
                }
            }
            EditorGUILayout.EndVertical();
        }

        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Add")) {
            AddEvent(eventList);
        }

        if (GUILayout.Button("Clear")) {
            ClearEvents(eventList);
        }

        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();

        return eventList;
    }
示例#4
0
 public void ClearEvents(EventDelegateList eventList)
 {
     eventList.eventTarget = new GameObject[0];
     eventList.eventMethod = new string[0];
     eventList.eventParams = new MethodParamList[0];
 }
示例#5
0
    public void RemoveEvent(EventDelegateList eventList, int index)
    {
        GameObject[] oldTargets = eventList.eventTarget;
        string[] oldMethods = eventList.eventMethod;
        MethodParamList[] oldParams = eventList.eventParams;

        // Copy old list
        int newLength = eventList.eventTarget.Length - 1;
        eventList.eventTarget = new GameObject[newLength];
        eventList.eventMethod = new string[newLength];
        eventList.eventParams = new MethodParamList[newLength];

        int cnt = 0;
        for (int i = 0; i < oldTargets.Length; i++) {
            if (i == index) {
                continue;
            }

            eventList.eventTarget[cnt] = oldTargets[i];
            eventList.eventMethod[cnt] = oldMethods[i];
            eventList.eventParams[cnt] = oldParams[i];
            cnt++;
        }
    }