/// <summary>Creates a MethodEventBinder to handle event binding for all overloads that are part of this method.</summary> /// <param name="FullMethodSet">Array of all of the overloads of this method.</param> public MethodEventBinder(MethodInfo[] FullMethodSet) { //Copies information MethodName = FullMethodSet[0].Name; //Creates OverloadEventBinders MethodOverloads = new OverloadEventBinder[FullMethodSet.Length]; for (int i = 0; i < FullMethodSet.Length; i++) { MethodOverloads[i] = new OverloadEventBinder(FullMethodSet[i]); } }
/// <summary>Creates and binds a new BindedEvent.</summary> /// <returns>The BindedEvent.</returns> /// <param name="DesiredTriggerType">The desired trigger type.</param> /// <param name="DesiredOverload">The method overload to bind.</param> /// <param name="MethodParamaterValues">The values to pass as paramaters to the method overload.</param> public BindedEvent CreateAndBindEvent(EventTriggerType DesiredTriggerType, OverloadEventBinder DesiredOverload, object[] MethodParamaterValues) { //Creates invokable action and name UnityAction <object> Callback = DesiredOverload.CreateInvokableAction((object[])MethodParamaterValues.Clone()); string EventName = DesiredOverload.CreateEventName(MethodParamaterValues); UnityObjectEvent CallbackEvent = new UnityObjectEvent(); UnityEventTools.AddPersistentListener(CallbackEvent, Callback); //Binds the event return(new BindedEvent(EventName, DesiredTriggerType, CallbackEvent, ClassType)); }
//Draws Playlist inspector public override void OnInspectorGUI() { if (!CreatingEvent) { CreatingEvent |= GUILayout.Button("Create new Event"); } else { SelectedTrigger = (EventTriggerType)EditorGUILayout.EnumPopup("Event Trigger Type", SelectedTrigger); int NewClassIndex = EditorGUILayout.Popup("Manager", SelectedClassIndex, ClassNames); if (NewClassIndex != SelectedClassIndex) { SelectedMethodIndex = 0; SelectedOverloadIndex = 0; } SelectedClassIndex = NewClassIndex; ClassEventBinder SelectedClass = ClassBinders[SelectedClassIndex]; int NewMethodIndex = EditorGUILayout.Popup("Method", SelectedMethodIndex, SelectedClass.MethodNameList); if (NewMethodIndex != SelectedMethodIndex) { SelectedOverloadIndex = 0; } SelectedMethodIndex = NewMethodIndex; MethodEventBinder SelectedMethod = SelectedClass.BindableMethods[SelectedMethodIndex]; if (SelectedMethod.MethodOverloads.Length > 1) { SelectedOverloadIndex = EditorGUILayout.Popup("Overload", SelectedOverloadIndex, SelectedMethod.OverloadNameList); } else { SelectedOverloadIndex = 0; } OverloadEventBinder SelectedOverload = SelectedMethod.MethodOverloads[SelectedOverloadIndex]; EditorGUILayout.LabelField(SelectedOverload.FullDisplayName, EditorStyles.wordWrappedMiniLabel); if (SelectedOverload != LastSelectedOverload) { LastSelectedOverload = SelectedOverload; CurrentParams = new object[SelectedOverload.MethodParamaters.Length]; for (int i = 0; i < CurrentParams.Length; i++) { ParameterInfo Param = SelectedOverload.MethodParamaters[i]; Type ParamType = Param.ParameterType; if (!DBNull.Value.Equals(Param.DefaultValue)) { CurrentParams[i] = Param.DefaultValue; } else { if (ParamType.IsValueType) { CurrentParams[i] = Activator.CreateInstance(ParamType); } else if (ParamType == typeof(string)) { CurrentParams[i] = ""; } else { CurrentParams[i] = null; } } } } for (int i = 0; i < CurrentParams.Length; i++) { ParameterInfo Param = SelectedOverload.MethodParamaters[i]; if (Param.ParameterType == typeof(int)) { CurrentParams[i] = EditorGUILayout.IntField(Param.Name, (int)CurrentParams[i]); } else if (Param.ParameterType == typeof(float)) { CurrentParams[i] = EditorGUILayout.FloatField(Param.Name, (float)CurrentParams[i]); } else if (Param.ParameterType == typeof(string)) { CurrentParams[i] = EditorGUILayout.TextField(Param.Name, (string)CurrentParams[i]); } else if (Param.ParameterType == typeof(bool)) { CurrentParams[i] = EditorGUILayout.Toggle(Param.Name, (bool)CurrentParams[i]); } else if (Param.ParameterType == typeof(Vector3)) { CurrentParams[i] = EditorGUILayout.Vector3Field(Param.Name, (Vector3)CurrentParams[i]); } else if (typeof(UnityEngine.Object).IsAssignableFrom(Param.ParameterType)) { CurrentParams[i] = EditorGUILayout.ObjectField(Param.Name, (UnityEngine.Object)CurrentParams[i], Param.ParameterType, !(typeof(ScriptableObject).IsAssignableFrom(Param.ParameterType) || EditorUtility.IsPersistent(target))); } else { EditorGUILayout.LabelField(CurrentParams[i] == null ? "null" : CurrentParams[i].ToString()); } } GUILayout.BeginHorizontal(); if (GUILayout.Button("Bind Event")) { BindedEvent NewBindedEvent = SelectedClass.CreateAndBindEvent(SelectedTrigger, SelectedOverload, CurrentParams); //serializedObject.FindProperty("AllEvents").InsertArrayElementAtIndex(0); //serializedObject.FindProperty("AllEvents").GetArrayElementAtIndex(0).objectReferenceValue = NewBindedEvent; ((AMPEventBinder)target).AllEvents.Add(NewBindedEvent); CreatingEvent = false; } if (GUILayout.Button("Cancel")) { CreatingEvent = false; } GUILayout.EndHorizontal(); } for (int i = 0; i < ((AMPEventBinder)target).AllEvents.Count; i++) { EditorGUILayout.LabelField((((AMPEventBinder)target).AllEvents[i].EventCallback != null).ToString()); } serializedObject.ApplyModifiedProperties(); base.DrawDefaultInspector(); }